A GLSL Framework

http://nehe.gamedev.net/article/glsl_an_introduction/25007/

一、 一个最简单的着色器程序

Ambient Shader, 所有的像素点都渲染为一种指定的颜色

Vertex Shader
1 void main() 
2 {
3 // Transforming The Vertex
4 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
5 }
Fragment Shader
1 Void main() 
2 {
3 // Setting Each Pixel To Red
4 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
5 }

二、如何在你的OpenGL程序中使用GLSL

GLSL需要以下四个扩展支持:GL_ARB_shader_objects,GL_ARB_shading_language_100,GL_ARB_vertex_shader,GL_ARB_fragment_shader

要想使用GLSL着色器,首先传递着色器源码给一个着色器对象,编译着色器源码,链接着色器到一个程序对象

着色器对象表示你的源码,而程序对象表示一个可用的渲染管道线。

 

View Code
GLhandleARB glCreateProgramObjectARB();
GLhandleARB glCreateShaderObjectARB(GLenum shaderType); //shaderType可以为GL_VERTEX_SHADER_ARB或GL_FRAGMENT_SHADER_ARBvoid glShaderSourceARB(GLhangleARB shader, GLuint number_strings, const GLcharARB** strings, Glint * length);
void glCompileShader(GLhandleARB shader);
void glAttachObjectARB(GLhandleARB program, GLhandleARB shader);
void glLinkProgramARB(GLhandleARB program);
void glUseProgramObjectARB(GLhandleARB program);
a code example for loading, compiling, linking and using shaders
 1 char * my_fragment_shader_source; 
2 char * my_vertex_shader_source;
3
4 // Get Vertex And Fragment Shader Sources
5 my_fragment_shader_source = GetFragmentShaderSource();
6 my_vertex_shader_source = GetVertexShaderSource();
7
8 GLenum my_program;
9 GLenum my_vertex_shader;
10 GLenum my_fragment_shader;
11
12 // Create Shader And Program Objects
13 my_program = glCreateProgramObjectARB();
14 my_vertex_shader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
15 my_fragment_shader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
16
17 // Load Shader Sources
18 glShaderSourceARB(my_vertex_shader, 1, &my_vertex_shader_source, NULL);
19 glShaderSourceARB(my_fragment_shader, 1, &my_fragment_shader_source, NULL);
20
21 // Compile The Shaders
22 glCompileShaderARB(my_vertex_shader);
23 glCompileShaderARB(my_fragment_shader);
24
25 // Attach The Shader Objects To The Program Object
26 glAttachObjectARB(my_program, my_vertex_shader);
27 glAttachObjectARB(my_program, my_fragment_shader);
28
29 // Link The Program Object
30 glLinkProgramARB(my_program);
31
32 // Use The Program Object Instead Of Fixed Function OpenGL
33 glUseProgramObjectARB(my_program);


 



 

posted @ 2012-03-08 11:26  wangwh0910  阅读(370)  评论(0编辑  收藏  举报