我是相当新的OpenGL的,我似乎遇到了一些困难。我已经写在GLSL一个简单的着色器,是应该给出联合矩阵变换顶点,让简单的骨骼动画。每个顶点具有最大的与变换矩阵阵列相关联,而在我的着色器被指定为“属性变量”两个骨影响(存储为X和A VEC 2的y分量),指数和相应的权重的,则设置使用 “glVertexAttribPointer” 功能。

在此处,问题就出现了......我已经成功地正确设置矩阵的“统一变量”阵列,当我在着色器检查这些值,所有的人都正确地进口,它们包含正确的数据。然而,当我尝试设置联合指标变量的顶点由任意变换矩阵相乘!他们跳转到空间,从这个我假设索引设置不正确,我的着色器读取过去我的关节矩阵阵列分为以下内存的结尾看似随机位置(每次它们是不同的)。我不知道是什么原因,因为在阅读所有我能找到的关于该主题的信息,我很惊讶地看到同样的(如果不是很相似)代码的例子,它似乎为他们工作。

我现在试图解决这个问题相当长的一段时间,它的真正开始让我的神经......我知道矩阵是正确的,当我手动着色器更改索引值的任意整数,它读取正确的矩阵值和作品的方式应,通过矩阵变换所有的顶点,但是当我尝试使用的代码我写设置属性变量,它似乎并没有工作。

我使用的设置的变量的代码如下...

// this works properly...
GLuint boneMatLoc = glGetUniformLocation([[[obj material] shader] programID], "boneMatrices");
glUniformMatrix4fv( boneMatLoc, matCount, GL_TRUE, currentBoneMatrices );

GLfloat testBoneIndices[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};

// this however, does not...
GLuint boneIndexLoc = glGetAttribLocation([[[obj material] shader] programID], "boneIndices");
glEnableVertexAttribArray( boneIndexLoc );
glVertexAttribPointer( boneIndexLoc, 2, GL_FLOAT, GL_FALSE, 0, testBoneIndices );

和我的顶点着色器看起来像这样...

// this shader is supposed to transform the bones by a skeleton, a maximum of two
// bones per vertex with varying weights...

uniform mat4 boneMatrices[32];  // matrices for the bones
attribute vec2 boneIndices;  // x for the first bone, y for the second

//attribute vec2 boneWeight;  // the blend weights between the two bones

void main(void)
{
 gl_TexCoord[0] = gl_MultiTexCoord0; // just set up the texture coordinates...


 vec4 vertexPos1 = 1.0 * boneMatrices[ int(boneIndex.x) ] * gl_Vertex;
 //vec4 vertexPos2 = 0.5 * boneMatrices[ int(boneIndex.y) ] * gl_Vertex;

 gl_Position = gl_ModelViewProjectionMatrix * (vertexPos1);
}

这是真的开始阻挠我,任何和所有帮助将不胜感激,

-Andrew Gotow

有帮助吗?

解决方案

好,我已经理解了它。 OpenGL的通过读取每9个值作为一个三角形(3个顶点,每3个分量)绘制与drawArrays功能三角形。正因为如此,顶点的三角形之间repepated,因此,如果两个相邻的三角形共享一个顶点它的阵列中的两次出现。所以,我的立方体我原本以为有8个顶点,居然有36个!

六个侧面,两个三角形的一侧,每个三角形的三个顶点,所有乘法出到总的36点独立的顶点而不是8点共享的。

在整个问题是与指定太少值的问题。当我扩展我的测试阵列包括36倍的值,它的工作完美。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top