上图中,通过调用OpenGL API把我们所编写的代码通过Texture Data、Uniforms、attributes三种方式,传递给顶点着色器、片元着色器,通过光栅化,最终渲染成目标图形。
OpenGL有三种方法可以向着色器传递数据:属性、uniform 值、纹理
1、属性(Attributes):
就是对每一个顶点都要作改变的数据元素。实际上,顶点位置本身 就是⼀个属性。属性值可以是浮点数、整数、布尔数据。
属性总是以四维向量的形式进行内部存储的,即使我们不会使用所有的4个分量。⼀个顶点位置可能存储(x,y,z),将占有4个分量中的3个。
实际上如果是在平面情况下:只要在xy平⾯上就能绘制,那么Z分量就会⾃动设置为0;
属性还可以是:纹理坐标、颜⾊色值、关照计算表⾯法线。
属性会从本地客户机内存中复制存储在图形硬件中的一个缓冲区上。这些属性只提供给顶点着⾊器使⽤,对于⽚元着⾊器⽊有太大意义。
声明:这些属性对每个顶点都要做改变,但并不意味着它们的值不能重复。通常情况下,它们都是不一样的,但有可能整个数组都是同一值的情况。
注意:属性值不像其他两种传输方式可以直接作用于片元着色器,必须通过中间介传递才能到片元着色器
2、Uniform值
属性是一种对整个批次属性都取统一值的单一值。它是不变的。通过设置uniform变量就紧接着发送一个图元批次命令,Uniform变量实际上可以无数次限制地使用,设置一个应⽤于整个表⾯的单个颜⾊色值,还可以设置⼀个时间值。在每次渲染某种类型的顶点动画时修改它。
注意:这⾥的uniform 变量每个批次改变一次,⽽不是每个顶点改变一 次。
uniform变量最常见的应⽤是在顶点渲染中设置变换矩阵 。
与属性相同点:可以是浮点值、整数、布尔值 。
与属性不同点:顶点着⾊器和⽚元着⾊器都可以使用uniform变量。uniform 变量还可以是标量类型、⽮量类型、uniform矩阵。
3、纹理(Texture)
在顶点着⾊器、片段着⾊器中都可以对纹理数据进行采样和筛选。
典型的应⽤场景:⽚段着⾊器对⼀个纹理值进⾏采样,然后在⼀个三⻆形表⾯应⽤渲染纹理数据。
纹理数据,不仅仅表现在图形,很多图形文件格式都是以无符号字节 (每个颜⾊通道8位)形式对颜⾊分量进行存储的。
网友评论