OpenGL学习(2)——GLSL
作者:互联网
glsl叫opengl shader language。是opengl专门写shader的一门语言
下面是一个典型的shader
#version version_number // 版本号
in type in_variable_name; // 输入
in type in_variable_name;
out type out_variable_name; // 输出
uniform type uniform_name; // 全局变量
int main()
{
// 处理输入并进行一些图形操作
...
// 输出处理过的结果到输出变量
out_variable_name = weird_stuff_we_processed;
}
一个GLSL程序有如下几个部分
- 输入:in
- 输出:out
- 全局变量:uniform
- mian函数
数据类型
- 普通:int,float,double,uint和bool
- 容器:vector,matrix
这里以vector容器为例,glsl设置了一堆类型,有vecn,bvecn,ivecn,等等。
- vec前面的字符表示其保存的类型,比如bvec就是bool,ivec就是int,默认的vec就是float。
- 后面的n是实际数字,比如vec3,表示3个分量的vec
容器的取值和赋值会很随意。他可以一次性取多个分量。看下面的例子
vec2 someVec;
vec4 differentVec = someVec.xyxx; //4个分量分别为someVec的x,y,x和x
vec3 anotherVec = differentVec.zyw; // 3个分量为differentVec的z,y,w
vec4 otherVec = someVec.xxxx + anotherVec.yxzy;
// 构造也很灵活
vec2 vect = vec2(0.5, 0.7); //
vec4 result = vec4(vect, 0.0, 0.0);
vec4 otherResult = vec4(result.xyz, 1.0);
Uniform
uniform变量,是一种全局变量,在一个着色器中声明后,可以通过opengl代码修改这个变量的值
比如,我们定义一个ourColor这个uniform
#version 330 core
out vec4 FragColor;
uniform vec4 ourColor; // 在OpenGL程序代码中设定这个变量
void main()
{
FragColor = ourColor;
}
然后在代码中,给他设置值
// 计算颜色值
float timeValue = glfwGetTime();
float greenValue = (sin(timeValue) / 2.0f) + 0.5f;
// 获取uniform的location
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
glUseProgram(shaderProgram);
// 设置值,有很多个函数,都是以glUniform...开头的,这里是4f,提供4个浮点数表示颜色
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
标签:GLSL,ourColor,name,OpenGL,someVec,uniform,学习,vec4,out 来源: https://www.cnblogs.com/destinyzk/p/16527017.html