1

我正在尝试将一个 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);

这是 Vertex 结构

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);
}

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

4

2 回答 2

4

这里的问题是它glVertexAttribPointer确实指定了浮点数据,因此您必须在着色器中以float/的形式访问它们。vecnormalized函数的参数只是指定它,结果浮点数将被标准化为 [0,1] 或直接转换。从理论上讲,您可以像以前一样使用未规范化的 uint,并且只in float color在着色器中使用 - 但您将失去精度。

如果你想直接将整数值传递给着色器,你必须使用glVertexAttribIPointer,它最初是在EXT_gpu_shader4扩展中引入的,并且从版本 3 开始是 GL 核心的一部分。

于 2013-06-23T13:35:57.670 回答
0

好的,这个

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;
    }
};

是一个问题:在模板和它是一个包含类成员的类之间,该结构中每个元素的精确对齐是完全不确定的;在此基础上添加一个可能的 v 表(虚函数实例指针表)。Vertex2本身可能是另一个没有精确对齐的类或模板结构。使用offsetof你只会看到实例数据结构的Vertex2开始位置,而不是其中的变量在哪里。

当涉及到与外部 API 的接口时(我的意思是所有未使用与您自己的项目相同的编译器编译的所有内容)平面内存位置类和模板是您最大的敌人。

你真正需要的是打包结构。不要使用类;从它们中派生并添加虚拟功能的动机太大了,这会完全搞砸。使用全局范围二元运算符添加语法糖。

于 2013-06-23T12:19:21.890 回答