LearnOpenGL | GLSL
程序员文章站
2022-07-04 11:07:29
...
LearnOpenGL | GLSL
着色器语言
输入与输出
-
GLSL定义
in
和out
关键字作为输入输出 -
顶点着色器应该接受一种特殊形式的输入.否则回效率低下.顶点着色器直接从顶点数据中取数据.
-
为了定义顶点数据该如何管理,用
location
这一元数据指定输入变量.主要GPU上配置顶点属性.layout(location=0) ...
-
也可以通过OpenGL中的代码使用
glGetAttribLocation
来查询属性位置值
Uniform
-
Uniform
是一种从CPU的应用向GPU传递数据的方式. -
uniform
是全局的
定义一个 uniform
#version 330 core
out vec4 FragColor;
uniform vec4 ourColor; // 在OpenGL程序代码中设定这个变量
void main()
{
FragColor = ourColor;
}
获得这个uniform的位置
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
给这个uniform设置值
float timeValue = glfwGetTime();
float greenValue = (sin(timeValue) / 2.0f) + 0.5f;
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
glUseProgram(shaderProgram);
// glUniform4f
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
- 若
glGetUniformLocation
返回 -1 ,即没有找到这个值 - 通过
glUniform4f
这个函数将数据送入着色器
传递值的函数
因为OpenGL在其核心是一个C库,所以它不支持类型重载,在函数参数不同的时候就要为其定义新的函数;glUniform是一个典型例子。这个函数有一个特定的后缀,标识设定的uniform的类型。可能的后缀有:
后缀 | 含义 |
---|---|
f |
函数需要一个float作为它的值 |
i |
函数需要一个int作为它的值 |
ui |
函数需要一个unsigned int作为它的值 |
3f |
函数需要3个float作为它的值 |
fv |
函数需要一个float向量/数组作为它的值 |
每当你打算配置一个OpenGL的选项时就可以简单地根据这些规则选择适合你的数据类型的重载函数。在我们的例子里,我们希望分别设定uniform的4个float值,所以我们通过glUniform4f传递我们的数据(注意,我们也可以使用fv
版本)
更多属性
- 深入了解
glVertexAttribPointer
void glVertexAttribPointer(GLuint index,
GLint size,
GLenum type,
GLboolean normalized,
GLsizei stride,
const void *ptr)
// index: 着色器脚本对应变量ID
// size : 此类型数据的个数
// type : 此类型的sizeof值
// normalized : 是否对非float类型数据转化到float时候进行归一化处理
// stride : 此类型数据在数组中的重复间隔宽度,byte类型计数
// ptr : 数据指针, 这个值受到VBO的影响
上一篇: LearnOpenGL
下一篇: LearnOpenGL~简介