您的位置:首页 > 运维架构

OpenGL shader使用

2016-06-27 17:03 344 查看
struct Program
{
static GLuint Load( const char* vert, const char* frag )
{
GLuint prog = glCreateProgram();
if( vert ) AttachShader( prog, GL_VERTEX_SHADER, vert );
if( frag ) AttachShader( prog, GL_FRAGMENT_SHADER, frag );
glLinkProgram( prog );
CheckStatus( prog );
return prog;
}

private:
static void CheckStatus( GLuint obj )
{
GLint status = GL_FALSE;
if( glIsShader(obj) ) glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
if( glIsProgram(obj) ) glGetProgramiv( obj, GL_LINK_STATUS, &status );
if( status == GL_TRUE ) return;
GLchar log[ 1 << 15 ] = { 0 };
if( glIsShader(obj) ) glGetShaderInfoLog( obj, sizeof(log), NULL, log );
if( glIsProgram(obj) ) glGetProgramInfoLog( obj, sizeof(log), NULL, log );
std::cerr << log << std::endl;
exit( -1 );
}

static void AttachShader( GLuint program, GLenum type, const char* src )
{
GLuint shader = glCreateShader( type );
glShaderSource( shader, 1, &src, NULL );
glCompileShader( shader );
CheckStatus( shader );
glAttachShader( program, shader );
glDeleteShader( shader );
}
};

#define STRINGIFY(A) #A

const char* vert = STRINGIFY(
attribute vec4 a_position;
void main()
{
gl_Position = a_position;
}

);

const char* frag = STRINGIFY(
uniform vec4 color;
void main(void)
{
gl_FragColor = color;
}
);

使用方式:

GLuint prog = Program::Load( vert, frag );
glUseProgram( prog );

使用流程总结为:

1 glCreateShader:创建shader。

2 glShaderSource:指定shader source。

3 glCompileShader:编译shader。

4 glCreateProgram:创建shader program。

5 glAttachShader,glDeleteShader:加载shader到shader program。标记shader为可删除,当不再使用shader的时候就会自动删除。

6 glLinkProgram:连接,生成最终shader程序。

7 glUseProgram:draw之前应用shader。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: