LearnOpenGL | GLSL

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的影响
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值