欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LearnOpenGL | GLSL

程序员文章站 2022-07-04 11:07:29
...

LearnOpenGL | GLSL

着色器语言

输入与输出

  • GLSL定义 inout 关键字作为输入输出

  • 顶点着色器应该接受一种特殊形式的输入.否则回效率低下.顶点着色器直接从顶点数据中取数据.

  • 为了定义顶点数据该如何管理,用 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

https://blog.csdn.net/tom_221x/article/details/38434925

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~简介