目录
Shader内的一些关键字
- in:上个阶段传来的变量
- out:输出下个阶段的内容
- uniform:在C++程序传入shader的内容
- main 函数:进行一系列操作
向量
操作非常灵活

举例:shader之间的数据传输,并实现渐变颜色
vertexShader.glsl
#version 330 core
layout (location = 0) in vec3 aPos;//由C++代码中VBO绑定的锚定点输入。
out vec4 vertexColor;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
vertexColor=vec4(0.5,0.0,0.0,1.0);
};
fragmentShader.glsl
#version 330 core
out vec4 FragColor;
in vec4 vertexColor;
void main()
{
//FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
FragColor = vertexColor;
};
vertexShader中的aPos,由
//对哪个锚点进行操作:layout=0的锚点,读3个顶点,类型为float,不需要归一化,每次步长为3个float大小,从0处开始读
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
进行读入;
随后vertexShader输出一个vertexColor传入下一个阶段,也就是fragmentShader。
fragmentShader接受vertexShader的输入(vertexColor),同时再输出一个FragColor。
举例:C++向shader传输数据的过程
直接上代码,注意需要把glUserProgram放在前面,启用shaderProblem这个状态
//渲染
void render() {
glUseProgram(shaderProgram);
float _time = glfwGetTime();
float _green = sin(_time) * 0.5f + 0.5f;
int _location = glGetUniformLocation(shaderProgram, "ourColor");
glUniform4f(_location, 0.0f, _green, 0.0f, 1.0f);
glBindVertexArray(VAO);
//以三角形模式绘制,从第0个顶点开始,起作用的有3个点
glDrawArrays(GL_TRIANGLES, 0, 3);
glUseProgram(0);
}</

这篇博客详细介绍了OpenGL中Shader的关键字,包括`in`、`out`、`uniform`和`main`函数。通过示例展示了如何在vertex和fragment shader间传递颜色信息,以及在C++中向shader传输数据的过程。接着,文章讨论了向量的灵活性,并封装了一个Shader类。最后,引入了颜色信息,使用索引绘制(EBO)优化了顶点数据的处理,展示了如何通过顶点索引来改变渲染顺序。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



