着色器-GLSL
文件后缀.vert // 顶点着色器
文件后缀.frag // 片段着色器
#version version_number in type in_variable_name;
out type out_variable_name; uniform type uniform_name; int main() { // 处理输入并进行一些图形操作 ... // 输出处理过的结果到输出变量 out_variable_name = weird_stuff_we_processed; }
xx.vert
#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aColor; layout (location = 2) in vec2 aTexCoord; out vec3 outColor; out vec2 TexCoord; void main(){ gl_Position = vec4(aPos, 1.0f); outColor = aColor; TexCoord = aTexCoord; }
xx.frag
#version 330 core out vec4 FragColor; in vec3 outColor; in vec2 TexCoord; uniform sampler2D ourTexture; void main() { FragColor = texture(ourTexture, TexCoord); }
顶点着色器与片段着色器通信用关键词in和out.
着色器与cpu通信使用uniform. uniform vec4 ourColor; // 在OpenGL程序代码中设定这个变量
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor"); glUseProgram(shaderProgram); glUniform4f(vertexColorLocation, 0.0f, 1.0f, 0.0f, 1.0f);
使用location这一元数据指定输入变量,这样可以在CPU上配置顶点属性.数字0,1,2对应位置,也可以忽略layout (location = 0)标识符,通过在OpenGL代码中使用glGetAttribLocation查询属性位置值(Location)
// position attribute glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // color attribute glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); // texture coord attribute glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2);

浙公网安备 33010602011771号