gpt4 book ai didi

c++ - 一步传递 GL_FLOAT 和 GL_UNSIGNED_INT

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:18 25 4
gpt4 key购买 nike

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

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;

结果一切似乎都很好。但是,我不喜欢在着色器中将无符号整数 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 作为 uniform 传递也能正常工作,但如果我想批处理我的绘制调用,这并不是很方便。

如果我又瞎了,请原谅我:)

最佳答案

你没有提到在 TexNum 的 GL_UNSIGNED_INT 情况下,你实际上在内存中有整数而不是 float 。

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

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

关于c++ - 一步传递 GL_FLOAT 和 GL_UNSIGNED_INT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44993939/

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