在GLSL中解压缩4个字节

时间:2014-04-05 09:53:57

标签: c++ opengl glsl

我有以下顶点着色器:

#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变量,我只是不知道如何。

1 个答案:

答案 0 :(得分:2)

这里有两个问题。首先,您没有正确设置整数属性指针。您必须使用glVertexAttribIPointer使数据在管道中以整数形式提供。

要访问单个字节,您可以使用GLSL中的标准整数位移操作,就像在C中一样。我建议使用无符号整数(和无符号字符)。因此,例如,访问值中第二高的字节可以由(boneIndex >> 16) & 0xff完成。