[英]Issue with passing integer vertex attributes with “in” keyword
I'm working on bone animation.我正在研究骨头 animation。 I have a vertex struct that basically looks like我有一个基本上看起来像的顶点结构
struct MeshVertex
{
glm::vec3 pos;
glm::vec3 normal;
glm::vec2 tex;
glm::vec3 tangent;
glm::vec3 bitangent;
uint32_t ids[4] = {};
float weights[4] = {};
void print() const;
};
The mesh is a basic cube with one bone.网格是带有一根骨头的基本立方体。 Therefore ids = {0,0,0,0}
and weights = {1.0f,0.0f,0.0f,0.0f}
for every single vertex.因此,每个顶点的ids = {0,0,0,0}
和weights = {1.0f,0.0f,0.0f,0.0f}
。 In my mesh class I have a static function Mesh::genFormat()
that handles attributes.在我的网格 class 中,我有一个处理属性的 static function Mesh::genFormat()
。 vao
is a static int
in the mesh class and for_i
is just a convenient macro I use to do for loops. vao
是网格 class 中的 static int
,而for_i
只是我用来执行循环的一个方便的宏。 Note that I correctly use glVertexArrayAttrib I Format.请注意,我正确使用了 glVertexArrayAttrib I Format。
Mesh::Mesh(const std::vector<MeshVertex>& vertices, const std::vector<uint>& indices, const std::vector<Texture>& textures)
{
m_textures = textures;
m_num_indices = indices.size();
// create vertex and index buffers
glCreateBuffers(1, &m_vbo);
glCreateBuffers(1, &m_ibo);
glNamedBufferData(m_vbo, sizeof(MeshVertex) * vertices.size(), &vertices[0], GL_STATIC_DRAW);
glNamedBufferData(m_ibo, sizeof(uint) * indices.size(), &indices[0], GL_STATIC_DRAW);
}
void Mesh::genFormat()
{
glCreateVertexArrays(1, &vao);
for_i(7) { glEnableVertexArrayAttrib(vao, i); }
glVertexArrayAttribFormat(vao, 0, 3, GL_FLOAT, false, offsetof(MeshVertex, pos)));
glVertexArrayAttribFormat(vao, 1, 3, GL_FLOAT, false, offsetof(MeshVertex, normal));
glVertexArrayAttribFormat(vao, 2, 2, GL_FLOAT, false, offsetof(MeshVertex, tex));
glVertexArrayAttribFormat(vao, 3, 3, GL_FLOAT, false, offsetof(MeshVertex, tangent));
glVertexArrayAttribFormat(vao, 4, 3, GL_FLOAT, false, offsetof(MeshVertex, bitangent));
glVertexArrayAttribIFormat(vao, 5, 4, GL_UNSIGNED_INT, offsetof(MeshVertex, ids)));
glVertexArrayAttribFormat(vao, 6, 4, GL_FLOAT, false, offsetof(MeshVertex, weights)));
for_i(7) { glVertexArrayAttribBinding(vao, i, 0); }
glBindVertexArray(0);
}
The following GLSL won't render anything.以下 GLSL 不会呈现任何内容。
#version 460 core
layout(location = 0) in vec3 Pos;
layout(location = 1) in vec3 Normal;
layout(location = 2) in vec2 Tex;
layout(location = 3) in vec3 Tan;
layout(location = 4) in vec3 BiTan;
layout(location = 5) in uvec4 BoneIds;
layout(location = 6) in vec4 Weights;
out vec3 normal;
out vec2 tex;
layout(binding = 2, std140) uniform Camera
{
mat4 VP;
vec4 cpos;
};
uniform mat4 node;
uniform mat4 bones_inverse_bind_mesh_parent[50];
void main()
{
tex = Tex;
mat4 W = mat4(0.0f);
if (Weights[0] != 0.0f)
{
for (uint i = 0; i < 4; i++)
W = W + (Weights[i] * bones_inverse_bind_mesh_parent[BoneIds[i]]);
W = node * W;
}
else
W = node;
gl_Position = VP * W * vec4(Pos, 1.0);
}
Since BoneIds[i]
is always zero, if I replace由于BoneIds[i]
始终为零,如果我替换
W = W + (Weights[i] * bones_inverse_bind_mesh_parent[BoneIds[i]]);
with和
W = W + (Weights[i] * bones_inverse_bind_mesh_parent[0]);
the result should be unchanged.结果应该保持不变。 My matrix transforms are currently a bit off (something to fix later), but now the cube renders fine.我的矩阵变换目前有点偏离(稍后会修复),但现在立方体渲染得很好。 So there is something wrong with BoneIds
.所以BoneIds
有问题。 After bashing my head against the wall on this for a while, I instead replaced在这上面撞了我的头一段时间后,我代替了
layout(location = 5) in uvec4 BoneIds;
with和
layout(location = 5) varying uvec4 BoneIds;
after seeing some old GLSL online, and now everything works.在网上看到一些旧的 GLSL 之后,现在一切正常。 What I don't understand is why.我不明白为什么。 I've seen plenty of GLSL code on the internet work with integer attributes using the in
keyword.我在互联网上看到很多 GLSL 代码使用in
关键字使用 integer 属性。
UPDATE:更新:
If I replace glVertexArrayAttrib I Format in Mesh::genFormat()
with如果我将Mesh::genFormat()
中的 glVertexArrayAttrib I Format 替换为
glVertexArrayAttribFormat(vao, 5, 4, GL_UNSIGNED_INT, false, offsetof(MeshVertex, ids));
in C++ and在 C++ 和
layout(location = 5) in vec4 BoneIds;
in GLSL and cast bone ids from float to int in the glsl code, the code also works.在 GLSL 中并在 glsl 代码中将骨骼 id 从 float 转换为 int,该代码也可以工作。
Okay I solved the issue, even though I don't quite understand how this fixes the problem.好的,我解决了这个问题,尽管我不太明白这是如何解决问题的。 My preferred graphics processor was on auto but when I forced it to use the NVIDIA processor over my integrated graphics, everything works out fine.我首选的图形处理器是自动的,但是当我强迫它在集成显卡上使用 NVIDIA 处理器时,一切正常。 image of solution解决方案的图像
Update:更新:
I think it is as simple as my Intel processor graphics supporting OpenGL 4.4 and glVertexArrayAttribIFormat
came about in OpenGL 4.5.我认为它就像支持 OpenGL 4.4 和glVertexArrayAttribIFormat
的英特尔处理器图形一样简单,出现在 OpenGL 4.5 中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.