收藏:①极市开发DeepLearning ②Git使用

OpenGL着色器的使用流程(转)

整个着色器的使用流程如下:

  • 1,创建着色器对象
  • 2,把源码关联到每个着色器对象
  • 3,编译着色器
  • 4,创建程序
  • 5,关联着色器到程序对象
  • 6,链接程序
  • 7,激活和关闭着色器程序
  • 8,删除着色器和程序

1,创建着色器对象

1 GLint vertSahder,fragShader;//顶点着色器,片元着色器
2 vertSahder = glCreateShader(GL_VERTEX_SHADER);
3 fragShader = glCreateShader(GL_FRAGMENT_SHADER);

2,把源码关联到每个着色器对象

1  着色器源码位置
2 OGLTextFile vertSources("D://","vert.shader");
3 OGLTextFile fragSources("D://","frag.shader");
4 //获取源码内容
5 OGLString vertText = vertSources.getText();
6 OGLString fragText = fragSources.getText();
7 //关联着色器
8 glShaderSource(vertSahder,1,(const GLchar **)&vertText,NULL);
9 glShaderSource(fragShader,1,(const GLchar **)&fragText,NULL);

 

3,编译着色器

 1 glCompileShader(vertSahder);
 2 glCompileShader(fragShader);
 3 //这里检查编译是否成功
 4 GLint status;
 5 glGetShaderiv(vertSahder,GL_COMPILE_STATUS,&status);
 6 if(status!=GL_TRUE){
 7 println("顶点着色器编译失败");
 8 exit(EXIT_FAILURE);
 9 }
10 glGetShaderiv(fragShader,GL_COMPILE_STATUS,&status);
11 if(status!=GL_TRUE){
12 println("片元着色器编译失败");
13 exit(EXIT_FAILURE);
14 }

4,创建程序

GLuint program;
program = glCreateProgram();

5,关联着色器到程序对象

1 glAttachShader(program,vertSahder);
2 glAttachShader(program,fragShader);

6,链接程序

1 glLinkProgram(program);
2 //检查是否链接错误
3 glGetProgramiv(program,GL_LINK_STATUS,&status);
4 if(status!=GL_TRUE){
5 println("程序链接失败");
6 exit(EXIT_FAILURE);
7 }

 

7,激活和关闭着色器程序 
我们在使用着色器之前应该将着色器程序设置为活动的

在关闭着色器时只需要传入参数0即可

 
1 glUseProgram(program);
2 glUseProgram(0);

8,删除着色器和程序 
我们在使用完毕后需要删除着色器与着色器程序,删除着色器程序对象仅仅是解除了它与着色器的关联,这些着色器仍然可以继续使用。所以我们需要在删除程序之后再删除着色器。假如我们先调用了删除着色器的方法,实际着色器并不会被删除,直到其与着色器程序的关联被解除才会被真正的删除。

1 glDeleteProgram(program);
2 glDeleteShader(vertSahder);
3 glDeleteShader(fragShader);

 

posted @ 2018-05-19 16:54  WSX_1994  阅读(1920)  评论(0编辑  收藏  举报