GLSL中的(无符号)字节

Add*_*ddi 11 opengl unsigned byte types glsl

我的一些顶点属性是单个无符号字节,我在我的GLSL片段着色器中需要它们,不是用于任何"真实"计算,而是用于比较它们(如果你愿意,就像枚举一样).我没有在GLSL中找到任何无符号字节或甚至是字节数据类型,所以有没有办法将它用作输入?如果不是(目前似乎是)GL_UNSIGNED_BYTE的目的是什么?

Nic*_*las 11

GLSL不处理大小类型(嗯,不是小于32位的大小类型).它只有有符号/无符号整数,浮点数,双精度数,布尔值和它们的向量/矩阵.如果将无符号字节作为整数顶点属性传递给顶点着色器,则它可以将其作为uint类型读取,其大小(至少)为32位.传递整数属性需要使用glVertexAttribIPointer/IFormat(注意"I").

然后,顶点着色器可以将此值作为uint类型传递给片段着色器(但仅使用flat插值限定符).当然,三角形的每个片段都会得到相同的值.

  • 我大胆猜测,即使在着色器中字节(8 位)将作为无符号整数(32 位)接收,但将数据作为字节发送的事实无论如何都是一个很好的增益,因为它节省了发送额外的 3 个字节。当您有数百个实例化变换时,这可能会增加。至少我所期望的情况是这样。但不确定使用共享 CPU/GPU 内存是否会有任何增益。 (3认同)