我有一个顶点属性,我的着色器非常奇怪地咀嚼了它。它以(uint8)1
的形式上传到VBO,但是当片段着色器看到它时,它被解释为10653532160
或0x3F800000
,您中的某些人可能会认为这是浮点中1.0f
的位模式。
我不知道为什么?我可以确认它是作为1(0x00000001
)上传到VBO的。
顶点属性定义为:
struct Vertex{
...
glm::u8vec4 c2; // attribute with problems
};
// not-normalized
glVertexAttribPointer(aColor2, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, c2));
虽然着色器绑定了该属性
glBindAttribLocation(programID, aColor2, "c2");
顶点着色器相当均匀地通过属性:
#version 330
in lowp uvec4 c2; // <-- this value is uploaded to the VBO as 0x00, 0x00, 0x00, 0x01;
flat out lowp uvec4 indices;
void main(){
indices = c2;
}
最后,片段着色器掌握了它:
flat in lowp uvec4 indices; // <-- this value is now 0, 0, 0, 0x3F800000
out lowp vec4 fragColor;
void main(){
fragColor = vec4(indices) / 256.0;
}
根据我的着色器检查器,indices
的变化使顶点着色器成为0x3F800000
的indices.w
,所以在那里发生了奇怪的事情吗?是什么原因造成的?
顶点属性的类型是整数,那么您必须使用glVertexAttribIPointer
而不是glVertexAttribPointer
(专注于I
)。参见glVertexAttribPointer
。
glVertexAttribPointer
中指定的类型是源缓冲区中数据的类型,并且未在着色器中指定目标属性类型。如果使用glVertexAttribPointer
,则将着色器程序中的属性类型假定为浮点,并转换积分数据。如果使用glVertexAttribPointer
,则将这些值保留为整数值。