将GL_FLOAT和GL_UNSIGNED_INT传递到一个步幅中

时间:2017-07-09 07:07:21

标签: c++ opengl

我想知道,我有以下设置:

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作为制服传递也可以正常工作,但如果我想批量调用我的抽签,则不是很方便。

如果我再次失明,请原谅我:)

1 个答案:

答案 0 :(得分:0)

你没有提到,对于TexNum的GL_UNSIGNED_INT,你实际上在内存中有内联而不是浮点数。

那么,您是否将TexNum转换为int?

(你可以在一个步骤中传递你想要的任何数据类型,它必须工作)