我有以下顶点着色器:
#version 330 core
struct Bone
{
int parent;
float scale;
mat4 matrix;
};
uniform mat4 MVP;
uniform Bone[67] Bones;
layout(location = 0) in vec3 position;
layout(location = 1) in int boneIndex;
layout(location = 2) in vec4 weight;
layout(location = 3) in vec3 normal;
layout(location = 4) in vec2 UVCords;
out vec2 UV;
void main()
{
gl_Position = MVP * vec4(position, 1.0f);
UV = UVCords;
}
我这样填写(C ++):
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0); //float position[3]
glVertexAttribPointer(1, 1, GL_INT, GL_FALSE, sizeof(Vertex), (void*)12); //char boneIndex[4]
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)16); //float weights[4]
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)32); //float normals[3]
glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)44); //float textureCords[2]
包含实际数据的缓冲区对象是以下数组:
struct Vertex
{
float position[3];
char boneIndex[4];
float weights[4];
float normals[3];
float textureCords[2];
};
现在,我的问题是,如何从GLSL端的int boneIndex
中提取四个字节?因为我知道GLSL不支持字节大小的类型,我想不得不将它提取到四个不同的int变量,我只是不知道如何。
答案 0 :(得分:2)
这里有两个问题。首先,您没有正确设置整数属性指针。您必须使用glVertexAttribIPointer
使数据在管道中以整数形式提供。
要访问单个字节,您可以使用GLSL中的标准整数位移操作,就像在C中一样。我建议使用无符号整数(和无符号字符)。因此,例如,访问值中第二高的字节可以由(boneIndex >> 16) & 0xff
完成。