gpt4 book ai didi

c++ - 将 uint 传递给着色器会更改其值

转载 作者:行者123 更新时间:2023-11-30 01:58:32 25 4
gpt4 key购买 nike

我正在尝试将一个 uint 传递给我的着色器,但我一定是做错了什么,因为在着色器中该值是 3212836864 而不是 4294967295。

我有一个顶点数组,我在使用 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertex) * 4 * vertexBufferArrayInserts, vertexBufferArray);

将每个顶点发送到着色器之前存储它们

这些是我的 glVertexAttribPointer 调用:

    shaderPosAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(shaderPosAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
glEnableVertexAttribArray(shaderPosAttrib);

shaderTexCoordAttrib = glGetAttribLocation(shaderProgram, "texCoord");
glVertexAttribPointer(shaderTexCoordAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, texCoords));
glEnableVertexAttribArray(shaderTexCoordAttrib);

shaderColorAttrib = glGetAttribLocation(shaderProgram, "color");
glVertexAttribPointer(shaderColorAttrib, 1, GL_UNSIGNED_INT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, color));
glEnableVertexAttribArray(shaderColorAttrib);

这是顶点结构

struct Vertex
{
Vector2<GLfloat> position;
Vector2<GLfloat> texCoords;
GLuint color;

Vertex() {

}

Vertex(Vector2<GLfloat> position, Vector2<GLfloat> texCoords, GLuint color) {
this->position = position;
this->texCoords = texCoords;
this->color = color;
}
};

顶点着色器:

#version 150

in vec2 position;
in vec2 texCoord;
in uint color;

out vec2 TexCoord;
out uint Color;

uniform mat4 projMat;

void main()
{
TexCoord = texCoord;
Color = color;
gl_Position = projMat * vec4(position, 0.0, 1.0);
}

片段着色器:

#version 150

in vec2 TexCoord;
in uint Color;

out vec4 outColor;

uniform sampler2D tex;

void main()
{
float colorr = 0;

if(Color == 3212836864)
colorr = 1;

outColor = texture(tex, TexCoord) * vec4(colorr, colorr, colorr, 1.0);
}

显然我在某处做错了,但我看不到...非常感谢帮助!

最佳答案

这里的问题是 glVertexAttribPointer确实指定了 float 数据,因此您必须以float 访问它们/vec在着色器中。 normalized该函数的参数只是指定结果 float 将被规范化为 [0,1] 或直接转换。理论上,您可以像现在这样使用非规范化的单位,只需使用 in float color在着色器中 - 但您将失去精度。

如果你想直接将整数值传递给着色器,你必须使用 glVertexAttribIPointer ,最初在 EXT_gpu_shader4 中介绍扩展,自第 3 版起是 GL 核心的一部分。

关于c++ - 将 uint 传递给着色器会更改其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17260493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com