整個着色器的使用流程如下:
- 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);