着色器将uint8转换为浮点,然后将其重新解释为uint

问题描述 投票:0回答:1

我有一个顶点属性,我的着色器非常奇怪地咀嚼了它。它以(uint8)1的形式上传到VBO,但是当片段着色器看到它时,它被解释为106535321600x3F800000,您中的某些人可能会认为这是浮点中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的变化使顶点着色器成为0x3F800000indices.w,所以在那里发生了奇怪的事情吗?是什么原因造成的?

c++ opengl glsl shader
1个回答
1
投票

顶点属性的类型是整数,那么您必须使用glVertexAttribIPointer而不是glVertexAttribPointer(专注于I)。参见glVertexAttribPointer

glVertexAttribPointer中指定的类型是源缓冲区中数据的类型,并且未在着色器中指定目标属性类型。如果使用glVertexAttribPointer,则将着色器程序中的属性类型假定为浮点,并转换积分数据。如果使用glVertexAttribPointer,则将这些值保留为整数值。

© www.soinside.com 2019 - 2024. All rights reserved.