创建片断着色器的思考

自己的理解,不一定正确,欢迎指正!

shader编写创建过程及细节:

1.创建shader

GLuint glCreateShader(	GLenum shaderType);
shderType必须是如下几种类型:常用的是顶点着色器和片段着色器
GL_COMPUTE_SHADER, GL_VERTEX_SHADER//顶点着色器,GL_TESS_CONTROL_SHADER, GL_TESS_EVALUATION_SHADER, GL_GEOMETRY_SHADER, or GL_FRAGMENT_SHADER//片段着色器

2.赋值

函数创建一个空的着色器对象,并返回一个非零的值,通过这个至可以引用这个着色器对象,着色器对象用于维护着色器的源代码(字符串),shderType用于表示要创建的着色器的类型

void glShaderSource( GLuint shader,
 	GLsizei count,
 	const GLchar **string,
 	const GLint *length);

shader参数是源代码要被覆盖的着色器对象句柄,count表明传入的string或length数组的数量,string指定字符串指针数组,数组内包含要加载的着色器源代码,string制定字符串长度数组。glShaderSource函数的作用就是将着色器中的源代码替换为指定字符串内的源代码,只是复制,并不扫描和解析。

3.编译

void glCompileShader(	GLuint shader);

函数用于编译存储在指定着色器(shader参数指定的)对象中的源代码字符串,编译状态作为着色器对象一部分存储,可通过GL_COMPILE_STATUS查看编译成功与否。glGetShaderInfoLog获得错误信息。

4.过程总结

和编程一样,首先自己编写shader的命令,此时生成了字符串源代码,然后通过glCreateShader创建出存储shader指令的空间,之后调用glShaderSource函数将编写的源代码放入创建的shader空间,为了让GPU知道源代码要做什么,调用glCompileShader函数对源代码进行编译,此时进行语法分析和句法分析,发现代码错误,代码有无错误可通过checkCompileErrors函数查看。


程序:

1.创建程序

GLuint glCreateProgram(	void);

glCreateProgram创建一个空的程序对象并返回一个非零值,通过它可以引用程序。着色器对象可以附加到程序。这提供了一种机制来指定将被链接来创建程序的着色器对象。它还提供了一种方法来检查将用于创建程序的着色器的兼容性(例如,检查顶点着色器和片段着色器之间的兼容性)。当不再需要作为程序对象的一部分时,可以分离着色器对象。

2.附加着色器

void glAttachShader(GLuint program,GLuint shader);

为了链接着色器,首先需要将着色器对象附加到程序之中,这表明着色器将包含在将在程序中执行的链接操作中。

3.链接着色器

void glLinkProgram(GLuint program);

链接对象,根据着色器类型生成相应处理器上的可执行文件,链接状态可查询,如果成功,所有用户自定义的uniform变量将被初始化为0,并被分配一个位置,可通过glGetUniformLocation函数查询,在片段着色器中使用的变量如果在顶点着色器中没有以相同方式声明等都会造成错误

4.安装程序(作为当前渲染状态)

glUseProgram将程序指定的程序对象安装为当前渲染状态的一部分,安装(激活)完程序之后才可以对uniform变量进行赋值操作,因为glUniform — Specify the value of a uniform variable for the current program object(当前程序对象),所以要先激活,将程序设置为当前对象,再设置uniform变量。


声明一个二维纹理图片

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
第一个参数指定了纹理目标(Target)。设置为GL_TEXTURE_2D意味着会生成与当前绑定的纹理对象在同一个目标上的纹理(任何绑定到GL_TEXTURE_1D和GL_TEXTURE_3D的纹理不会受到影响)。
第二个参数为纹理指定多级渐远纹理的级别,如果你希望单独手动设置每个多级渐远纹理的级别的话。这里我们填0,也就是基本级别。
第三个参数告诉OpenGL我们希望把纹理储存为何种格式。我们的图像只有RGB值,因此我们也把纹理储存为RGB值。
第四个和第五个参数设置最终的纹理的宽度和高度。我们之前加载图像的时候储存了它们,所以我们使用对应的变量。
下个参数应该总是被设为0(历史遗留的问题)。
第七第八个参数定义了源图的格式和数据类型。我们使用RGB值加载这个图像,并把它们储存为char(byte)数组,我们将会传入对应值。
最后一个参数是真正的图像数据。

猜你喜欢

转载自blog.csdn.net/Treeman5433716/article/details/80609855