我正在尝试将一个uint传递给我的着色器,但我必须做错了,因为在着色器中值为3212836864而不是4294967295。
我有一个Vertex数组,我存储每个顶点,然后使用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);
}
显然我在某处做错了什么但是我看不到它......非常感谢帮助!
答案 0 :(得分:4)
此处的问题是glVertexAttribPointer
确实指定了浮点数据,因此您必须在着色器中将其作为float
/ vec
进行访问。该函数的normalized
参数只是指定它,结果浮点数将被标准化为[0,1]或直接转换。理论上,您可以像使用非标准化的uint一样使用,只需在着色器中使用in float color
- 但您将失去精确度。
如果要直接将整数值传递给着色器,则必须使用glVertexAttribIPointer
,EXT_gpu_shader4
最初是在{{3}}扩展名中引入的,并且是自版本3以来GL核心的一部分。
答案 1 :(得分: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-table(虚函数实例指针表)。 Vertex2
本身可能是另一个没有精确对齐的类或模板结构。使用offsetof
,您只会看到Vertex2
的实例数据结构的开始位置,而不会看到其中的变量所在的位置。
当涉及到与外部API接口时(我指的是所有未使用与您自己的项目完全相同的编译器编译的内容)或平面内存位置类和模板是您最大的敌人。
您实际需要的是打包结构。不要使用课程;从他们那里获得并添加虚拟功能的动机太多了,这些功能会让事情变得更糟。使用全局范围二元运算符添加语法糖。