5.Shader
程序员文章站
2024-03-16 17:44:40
...
1.使用in、out关键字声明shader中的输入和输出变量
为输入变量传值有两种方式:
(1)在着色器中声明变量时使用location = t关键字指定顶点属性位置(顶点着色器需要提供一个额外的layout标识),在程序中通过t进行赋值
(2)在程序中使用glGetAttribLocation(变量名)获取变量的地址,然后再进行赋值
2.在顶点着色器和片元着色器之间传值:
如果我们打算从一个着色器向另一个着色器发送数据,在发送方着色器声明一个输出变量,在接收方着色器声明一个输入变量,当两个变量名字和类型一样时,OpenGL就会将两个变量链接在一起
const char * vertexShaderSource =
"#version 330 core\n"
"layout(location = 0) in vec3 aPos;\n"
"out vec4 vertexColor;\n"
"void main(){\n"
"gl_Position = vec4(aPos.x,aPos.y,aPos.z,1.0f);\n"
"vertexColor = vec4(0.5,0.0,0.0,1.0);\n"
"}\0";
const char* fragementShaderSource =
"#version 330 core\n"
"out vec4 FragColor;\n"
"in vec4 vertexColor;"
"void main(){\n"
"FragColor = vertexColor;\n"
"}";
3.uniform变量,uniform变量是从CPU应用向GPU发送数据的一种方式,uniform变量有以下两个特点:
(1)uniform变量是全局变量,在所有着色器中都是独一无二的,而且可以被着色器程序的任意着色器在任意阶段访问
(2)uniform会一直保存变量的数据,直到被更新或重置
定义uniform变量并赋值:(注意赋值前必须先使用程序)
const char* fragementShaderSource =
"#version 330 core\n"
"out vec4 FragColor;\n"
"uniform vec4 mycolor;\n"
"void main(){\n"
"FragColor = mycolor;\n"
"}\n\0";
main()
{
//当变量不存在时返回-1
int mycolorLocation = glGetUniformLocation(shaderProgram,"mycolor");
glUniform4f(mycolorLocation,0.0f,color,0.0f,1.0f);
}
4.使用多个顶点属性,同webGL
上一篇: Unity 2D游戏基本知识笔记2
推荐阅读