其他分享
首页 > 其他分享> > OpenGL学习(2)——GLSL

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程序有如下几个部分

数据类型

这里以vector容器为例,glsl设置了一堆类型,有vecn,bvecn,ivecn,等等。

  1. vec前面的字符表示其保存的类型,比如bvec就是bool,ivec就是int,默认的vec就是float。
  2. 后面的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