我想知道,我有以下设置:
glEnableVertexAttribArray(VERTEX_COORD_ATTRIB);
glEnableVertexAttribArray(TEXTURE_COORD_ATTRIB);
glEnableVertexAttribArray(COLOR_ATTRIB);
glEnableVertexAttribArray(TEXNUM_ATTRIB);
glVertexAttribPointer(VERTEX_COORD_ATTRIB, 3, GL_FLOAT, GL_FALSE, StrideSize, (void*)0);
glVertexAttribPointer(TEXTURE_COORD_ATTRIB, 2, GL_FLOAT, GL_FALSE, StrideSize, (void*)(VertFloatSize));
glVertexAttribPointer(COLOR_ATTRIB, 4, GL_FLOAT, GL_FALSE, StrideSize, (void*)(VertFloatSize + TexFloatSize));
glVertexAttribPointer(TEXNUM_ATTRIB, 1, GL_FLOAT, GL_FALSE, StrideSize, (void*)(VertFloatSize + TexFloatSize + ColorFloatSize));
而StrideSize是:
GLuint StrideSize = (sizeof(float) * FloatsPerVertex) + (sizeof(float) * TexCoords2D) + (sizeof(float) * ColorInfo) + (sizeof(float));
拥有着色器
layout (location = 0) in vec3 Coords;
layout (location = 2) in vec2 TexCoords;
layout (location = 8) in vec4 DrawColor;
layout (location = 10) in float TexNum;
结果似乎一切都很好。但是我不喜欢将着色的int中的TexNum转换为uint。
但如果我这样做:
glEnableVertexAttribArray(VERTEX_COORD_ATTRIB);
glEnableVertexAttribArray(TEXTURE_COORD_ATTRIB);
glEnableVertexAttribArray(COLOR_ATTRIB);
glEnableVertexAttribArray(TEXNUM_ATTRIB);
glVertexAttribPointer(VERTEX_COORD_ATTRIB, 3, GL_FLOAT, GL_FALSE, StrideSize, (void*)0);
glVertexAttribPointer(TEXTURE_COORD_ATTRIB, 2, GL_FLOAT, GL_FALSE, StrideSize, (void*)(VertFloatSize));
glVertexAttribPointer(COLOR_ATTRIB, 4, GL_FLOAT, GL_FALSE, StrideSize, (void*)(VertFloatSize + TexFloatSize));
glVertexAttribIPointer(TEXNUM_ATTRIB, 1, GL_UNSIGNED_INT, StrideSize, (void*)(VertFloatSize + TexFloatSize + ColorFloatSize));
而StrideSize是:
GLuint StrideSize = (sizeof(float) * FloatsPerVertex) + (sizeof(float) * TexCoords2D) + (sizeof(float) * ColorInfo) + (sizeof(GLuint));
拥有着色器
layout (location = 0) in vec3 Coords;
layout (location = 2) in vec2 TexCoords;
layout (location = 8) in vec4 DrawColor;
layout (location = 10) in uint TexNum;
似乎没有正确传递该值。我知道glVertexAttribPointer总是转换为float,而使用glVertexAttribIPointer代替。 我错过了什么?是否不允许在一个步幅中传递2种不同的数据类型?或者我必须单独缓冲它? 我发现了几个几乎相似的问题,但没有人特别提出这个问题,但我也没有找到任何迹象表明为什么这不起作用。 将TexNum作为制服传递也可以正常工作,但如果我想批量调用我的抽签,则不是很方便。
如果我再次失明,请原谅我:)
答案 0 :(得分:0)
你没有提到,对于TexNum的GL_UNSIGNED_INT,你实际上在内存中有内联而不是浮点数。
那么,您是否将TexNum转换为int?
(你可以在一个步骤中传递你想要的任何数据类型,它必须工作)