顶点着色器属性位置中的损坏数据

拉胡尔·梅达

由于顶点着色器属性位置中的数据损坏,我的模型看起来很拉伸

这是顶点着色器代码:

#version 330 core

layout (location = 0) in vec3 vertPos;
layout (location = 1) in vec3 vertNormal;
layout (location = 2) in vec2 texCoord;
layout (location = 3) in vec4 boneWeigths;
layout (location = 4) in ivec4 boneIDs;

out vec3 vNormal;
out vec3 fragPos;
out vec2 fragTexCoord;

const int MAX_BONES = 100;

uniform mat4 MVP;
uniform mat4 M;
uniform mat4 boneTransforms[MAX_BONES];

void main()
{
    mat4 boneTx = boneTransforms[boneIDs[0]] * boneWeigths[0]
                + boneTransforms[boneIDs[1]] * boneWeigths[1]
                + boneTransforms[boneIDs[2]] * boneWeigths[2]
                + boneTransforms[boneIDs[3]] * boneWeigths[3];
    vec4 pos = boneTx * vec4(vertPos, 1.0f);
    gl_Position = MVP * pos;
    vec4 normal = boneTx * vec4(vertNormal, 0.0f);
    vNormal = normalize(vec3(M * normal));
    fragPos = vec3(M * pos);
    fragTexCoord = vec2(texCoord.x, texCoord.y);
}

问题似乎是boneIDs中的数据已损坏(boneIDs数据在CPU上正常,但在着色器中获取了损坏的数据)。我尝试在着色器中硬编码boneIDs数据,并且效果很好。

这是VAO的代码:

    // create buffers/arrays
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glGenBuffers(1, &EBO);

    glBindVertexArray(VAO);
    // load data into vertex buffers
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    unsigned int sz = sizeof(BoneVertex);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(BoneVertex), &vertices[0], GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &indices[0], GL_STATIC_DRAW);

    // set the vertex attribute pointers
    // vertex Positions
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(BoneVertex), (void*)0);
    // vertex normals
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(BoneVertex), (void*)(3 * sizeof(float)));
    // vertex texture coords
    glEnableVertexAttribArray(2);
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(BoneVertex), (void*)(6 * sizeof(float)));
    // bone weights
    glEnableVertexAttribArray(3);
    glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(BoneVertex), (void*)(8 * sizeof(float)));
    // bone ids
    glEnableVertexAttribArray(4);
    glVertexAttribPointer(4, 4, GL_INT, GL_FALSE, sizeof(BoneVertex), (void*)(12 * sizeof(float)));

    glBindVertexArray(0);

BoneVertex结构:

struct BoneVertex
{
    glm::vec3 position;
    glm::vec3 normal;
    glm::vec2 textureCoords;
    glm::vec4 boneWeights;
    glm::ivec4 boneIDs;
}

这很奇怪,因为前三个属性数据看起来不错。问题在于boneIDs和boneWeights这是否与填充有关,数据如何在结构中排列?还是我想念其他东西?

谢谢

拉比德76

boneIDs 是具有整数数据类型的顶点着色器输入:

layout (location = 4) in ivec4 boneIDs;

如果要为整数属性指定通用顶点属性数据,则必须使用glVertexAttribIPointer(关注I)而不是glVertexAttribPointer(请参阅glVertexAttribPointer)。
注意,type参数没有指定目标属性的类型,而是指定了源数据数组的元素类型。glVertexAttribPointer将源数据数组转换为浮点值,但glVertexAttribIPointer指定用于整体目标属性的数组。

glVertexAttribPointer(4, 4, GL_INT, GL_FALSE, sizeof(BoneVertex), (void*)(12 * sizeof(float)));

glVertexAttribIPointer(4, 4, GL_INT, sizeof(BoneVertex), (void*)(12 * sizeof(float)));   

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

顶点着色器中属性的位置不正确

如何在顶点着色器中将VBO数据用作位置数据,在片段着色器中如何将统一数据用作颜色数据

如何通过顶点着色器将数据从顶点着色器传递到片段着色器

顶点着色器中的广告牌顶点

丢弃Unity的顶点着色器中的顶点

OpenglES 2.0顶点着色器属性

为什么此属性数据无法正确加载到顶点着色器?

无法设置顶点着色器中输入的位置

如何在顶点着色器中获得未变换的位置?

顶点着色器中的Phong照明

像素和顶点着色器中的缩放问题

顶点着色器中的边界框

从顶点着色器读取变量以在 webgl 中呈现

在OpenGL的顶点着色器中获取元素ID

Swift 5中的金属顶点着色器警告

在顶点着色器中对复数进行运算

无法在Maya插件中编译顶点着色器

在哪里存储缓存数据以在顶点着色器中访问?

顶点着色器如何访问与另一个shaderprogram属性绑定的顶点缓冲区数据?

OpenGL顶点着色器处理

顶点着色器与片段着色器

顶点着色器或片段着色器中的OpenGL ES2.0 Lighting

哪些OpenGL函数会在顶点着色器之前修改顶点位置?

自定义和通用顶点着色器属性在OpenGL和OpenGL ES中的使用

通过顶点attrib指针将颜色坐标传递到顶点着色器中

OpenGL-从顶点着色器访问缓冲区中的下3个顶点

GLSL从“片段着色器”到“顶点着色器”发送颜色数据似乎总是等于0

获取 GLSL 顶点着色器位置以用于 cpu 事件碰撞函数

如何在OpenGL中将值传递给顶点着色器的属性数组?