LearnOpenGL(三)之GLSL

本文介绍了GLSL(OpenGLShadingLanguage)的基本概念,包括着色器的结构、数据类型(如基本类型和容器类型)、输入与输出变量的使用,以及Uniform变量的传递。通过顶点着色器和片段着色器示例,展示了如何在GPU上进行着色器编程。
摘要由CSDN通过智能技术生成

一、GLSL

着色器是使用一种叫GLSL的类C语言写成的。

着色器的开头总是要声明版本,接着是输入和输出变量、uniform

和main函数。每个着色器的入口点都是main函数,在这个函数中

我们处理所有的输入变量,并将结果输出到输出变量中。

二、数据类型

GLSL中包含C等其它语言大部分的默认基础数据类型:intfloatdoubleuintbool。GLSL也有两种容器类型,分别是向量(Vector)和矩阵(Matrix)。

1、分量

GLSL中的向量是一个可以包含有2、3或者4个分量的容器,分量的类型可以是前面默认基础类型的任意一个。

有如下形式(n代表分量的数量):

一个向量的分量可以通过vec.x这种方式获取,这里x是指这个向量的第一个分量。也可以分别使用.x、.y、.z和.w来获取它们的第1、2、3、4个分量。对颜色可以使用rgba,或是对纹理坐标使用stpq访问相同的分量。

三、输入与输出

GLSL使用inout来定义着色器的输入和输出。着色器使用这两个关键字设定输入和输出,只要它的输出变量与下一个着色器阶段的输入匹配,它就会传递下去。

如下面的例子,片段着色器中的vertexColor就和顶点着色器中的vertexColor链接了。

//顶点着色器
#version 330 core
layout (location = 0) in vec3 aPos; // 位置变量的属性位置值为0

out vec4 vertexColor; // 为片段着色器指定一个颜色输出

void main()
{
    gl_Position = vec4(aPos, 1.0); // 注意我们如何把一个vec3作为vec4的构造器的参数
    vertexColor = vec4(0.5, 0.0, 0.0, 1.0); // 把输出变量设置为暗红色
}

//片段着色器
#version 330 core
out vec4 FragColor;

in vec4 vertexColor; // 从顶点着色器传来的输入变量(名称相同、类型相同)

void main()
{
    FragColor = vertexColor;
}

2、Uniform

使用Uniform可以将在 CPU 上的数据传递到 GPU 的着色器里。

uniform变量可以被所有的着色器在任意阶段访问,并且会一直保存它们的数据,直到它们被重置或更新。

可以使用glGetUniformLocation查询uniform ourColor的位置值,然后可以通过glUniform4f函数设置uniform值。注意,查询uniform地址不要求之前使用过着色器程序,但是更新一个uniform之前必须先使用程序(调用glUseProgram),因为它是在当前激活的着色器程序中设置uniform的。

以下是一个简单例子:

int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");//获取uniform属性的索引/位置值
glUseProgram(shaderProgram);//使用程序,激活着色器程序
glUniform4f(vertexColorLocation, 0.0f, 1.0f, 0.0f, 1.0f);//设置uniform值

glUniform函数有一个特定的后缀,标识设定的uniform的类型。可能的后缀有:

demo下载:点击跳转

觉得有帮助的话,打赏一下呗。。

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值