着色器
2022-07-14 本文已影响0人
大旺旺的弟弟小旺旺
着色器是运行在GPU上的一个程序,为了完成管线某个特定功能运行的,它只是将一个输入转化为输出的程序,他们只能输出和输入。
GLSL
它是专门来写着色器语言的,它包含了向量和矩阵操作的特性。
书写格式
- 版本
- 输入输出变量,uniform
- main
可以设置的属性是有限制的,有点是16个,有点更多,这个可以进行查询
GL_MAX_VERTEX_ATTRIBS
int nrAttributes;
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes);
std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes << std::endl;
支持的数据类型
int float double uint bool vector matrix
向量
GLSL中向量可以有234个分量,可以是任意类型
- vecn n个float
- bvecn n个bool
- ivecn n和int
- uvecn n个unsigned int分量
- dvecn n个double分量的向量
可以通过.x,.y,.z,.w,还可以通过rgba的方式。
重组
vec2 someVec;
vec4 differentVec = someVec.xyxx;
vec3 anotherVec = differentVec.zyw;
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);
输入和输出
着色器是各自独立的小程序,都是整体的一部分,每个部分只关心输入什么,输出什么,对其它部分并不关心。in和out作为3.0的扛把子来实现。
attribute:属性输入
varying:属性值传递
in输入
out输出
顶点着色器向片段着色器中传递数据,它们的名字是一样的就可以了。
uniform
它是一种从cpu向Gpu发送数据的方式,但是uniform和顶点属性有些不同。
- uniform是全局的,独一无二
- 设置了unoform的值,就会一直的保持,直到重置或者更新
它是全局的,所以我们不需要通过顶点着色器这个中介来完成。
使用uniform
int vertexColorLocation = glGetUniformLocation(shaderProgram,"outColor");
glUniform4f(vertexColorLocation,0.0f,greenValue,0f,1f)