GLSL
容器类型:
vecn:包含n个float分量的默认向量,其中n可以为2~4
bvecn, ivecn,uvecn,dvecn同理
一些初始化方法:
1 2 3 4 | vec2 someVec; vec4 differentVec = someVec.xyxx; vec3 anotherVec = differentVec.zyw; vec4 otherVec = someVec.xxxx + anotherVec.yxzy; |
传递为构造函数:
1 2 3 | vec2 vect = vec2(0.5, 0.7); vec4 result = vec4(vect, 0.0, 0.0); vec4 otherResult = vec4(result.xyz, 1.0); |
输入输出:
in:后接输入的变量,一般为另一个着色器中输出的,只要名称相同会自动链接out:输出一个变量layout为一个变量设置位置值,这样就能在主程序中设置该变量的值
1 2 3 4 5 6 7 8 9 10 | #version 330 core layout (location = 0) in vec3 aPos; // 位置变量的属性位置值为0 out vec4 vertexColor; // 为片段着色器指定一个颜色输出 void main() { gl_Position = vec4(aPos, 1.0); // 注意我们如何把一个vec3作为vec4的构造器的参数 vertexColor = vec4(0.5, 0.0, 0.0, 1.0); // 把输出变量设置为暗红色 } |
1 2 3 4 5 6 7 8 9 | #version 330 core out vec4 FragColor; in vec4 vertexColor; // 从顶点着色器传来的输入变量(名称相同、类型相同) void main() { FragColor = vertexColor; } |
uniform
- 全局变量,任何着色器都可用
1 2 3 4 5 6 7 8 9 | #version 330 core out vec4 FragColor; uniform vec4 ourColor; // 在OpenGL程序代码中设定这个变量 void main() { FragColor = ourColor; } |
- 在主程序中设定uniform时,需要先获取uniform的地址,然后再使用内建函数进行赋值
1 2 3 4 5 | float timeValue = glfwGetTime(); float greenValue = (sin(timeValue) / 2.0f) + 0.5f; int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor"); glUseProgram(shaderProgram); glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f); |
- 注意,在设定uniform之前必须先使用对应的着色器程序