【raviramamoorthi-Computer Graphics】OpenGL1:Shaders

来源:互联网 发布:vb中variant是什么意思 编辑:程序博客网 时间:2024/06/03 19:56

OpenGL rendering pipeline:

在网上找了一下资料,想要了解这是怎么搞的,附上找到的网址:http://blog.csdn.net/yunzhaoqiang/article/details/8539064

而这个rendering pipeline会被对应到programmable pipeline,在这个pipeline中,两个关键的shader就是vertex shader和fragment shader.

shader setup

1)Create shader;  2)编译shader;  3)将shader attach 到程序当中;  4)link 程序;5)使用程序


在这里有两点视频里提到了:1)Shader source is just sequence of strings。这也就是为什么在initshader函数当中,是将一串字符串读进来的(这里读进来的东西是light.frag.gsgl和light.vert.gsgl,是之前写好的。)2)Similar steps to compile a normal program。

Shader Initialization Code

GLuint initshaders (GLenum type, const char *filename) {// Using GLSL shaders, OpenGL book, page 679 GLuint shader = glCreateShader(type) ; GLint compiled ; string str = textFileRead (filename) ; GLchar * cstr = new GLchar[str.size()+1] ; const GLchar * cstr2 = cstr ; // Weirdness to get a const charstrcpy(cstr,str.c_str()) ; glShaderSource (shader, 1, &cstr2, NULL) ; glCompileShader (shader) ; glGetShaderiv (shader, GL_COMPILE_STATUS, &compiled) ; if (!compiled) { shadererrors (shader) ; throw 3 ; }return shader ; }

函数学习:

GLuint glCreateShader(GLenum shaderType):

这个函数只有一个参数,指定了shader容器所容纳的shader的类型。其中GL_VERTEX_SHADER代表顶点shader,GL_FRAGMENT_SHADER代表像素shader。如果调用成功的话,函数将返回一个整形数作为shader容器的句柄。


textFileRead是作者自己定义的一个函数,用于读入string的。


void glShaderSource(GLuint shader, int numOfStrings, const char **strings, int *lenOfStrings):

其中shader是代表shader容器的句柄(由glCreateShader返回的整形数);numOfStrings是包含源程序的字符串数组中字符串的个数;strings是包含源程序的字符串数组;lenOfStrings是一个数组,数组中的元素代表了strings相应下标的字符串的长度,如果这个值被设置成NULL,则代表每个字符串是以NULL结尾的。


void glCompileShader(GLuint shader):

其中shader是代表shader容器的句柄,用这个函数来对shader容器中的源代码进行编译。


void glGetShaderiv(GLuint object, GLenum type, int *param):

其中,object是一个shader的句柄,type使用GL_COMPILE_STATUS;param是返回值。如果一切正常返回GL_TRUE,否则返回GL_FALSE。


Linking Shader Program

GLuint initprogram (GLuint vertexshader, GLuint fragmentshader) {GLuint program = glCreateProgram() ; GLint linked ; glAttachShader(program, vertexshader) ; glAttachShader(program, fragmentshader) ; glLinkProgram(program) ; glGetProgramiv(program, GL_LINK_STATUS, &linked) ; if (linked) glUseProgram(program) ; else { programerrors(program) ; throw 4 ; }return program ; }


函数学习:

和之前的差不多。具体可以参照:

http://xiaxveliang.blog.163.com/blog/static/297080342012625115624831/


Create shader

这里只给了最基本的两个,vertex 和 fragment的。。


补充:今天(9.22)在学习新的内容的时候又看到了关于vertex shader 和 fragment shader的描述,pdf已经下载下来啦。附上网址:

http://wenku.baidu.com/link?url=VDZeVMweB6gt0gGoEh90lZNRW65dkLuJEIYRvNPtQHfidCz30pxVoFDkc5QAVM2j7XhyzCkjhiXmpyyB9O6Ky2B96LHq5svj4dgIM0ZhrUW



0 0