简体   繁体   English

Cocoa和OpenGL,如何使用数组设置GLSL顶点属性?

[英]Cocoa and OpenGL, How do I set a GLSL vertex attribute using an array?

I'm fairly new to OpenGL, and I seem to be experiencing some difficulties. 我是OpenGL的新手,我似乎遇到了一些困难。 I've written a simple shader in GLSL, that is supposed to transform vertices by given joint matrices, allowing simple skeletal animation. 我在GLSL中编写了一个简单的着色器,它应该通过给定的关节矩阵变换顶点,允许简单的骨架动画。 Each vertex has a maximum of two bone influences (stored as the x and y components of a Vec2), indices and corresponding weights that are associated with an array of transformation matrices, and are specified as "Attribute variables" in my shader, then set using the "glVertexAttribPointer" function. 每个顶点最多有两个骨骼影响(存储为Vec2的x和y分量),索引和与变换矩阵数组相关联的相应权重,并在我的着色器中指定为“属性变量”,然后设置使用“glVertexAttribPointer”函数。

Here's where the problem arises... I've managed to set the "Uniform Variable" array of matrices properly, when I check those values in the shader, all of them are imported correctly and they contain the correct data. 这就是问题出现的地方......我已经设法正确设置了“统一变量”矩阵数组,当我在着色器中检查这些值时,所有这些值都被正确导入并且它们包含正确的数据。 However, when I attempt to set the joint Indices variable the vertices are multiplied by arbitrary transformation matrices! 但是,当我尝试设置关节Indices变量时,顶点乘以任意变换矩阵! They jump to seemingly random positions in space (which are different every time) from this I am assuming that the indices are set incorrectly and my shader is reading past the end of my joint matrix array into the following memory. 它们跳到空间中看似随机的位置(每次都是不同的)我假设索引设置不正确并且我的着色器正在读取超过我的关节矩阵数组的末尾到下面的内存中。 I'm not exactly sure why, because upon reading all of the information I could find on the subject, I was surprised to see the same (if not very similar) code in their examples, and it seemed to work for them. 我不确定为什么,因为在阅读了关于这个主题的所有信息之后,我很惊讶地看到他们的例子中的相同(如果不是非常相似)代码,它似乎对他们有用。

I have attempted to solve this problem for quite some time now and it's really beginning to get on my nerves... I know that the matrices are correct, and when I manually change the index value in the shader to an arbitrary integer, it reads the correct matrix values and works the way it should, transforming all the vertices by that matrix, but when I try and use the code I wrote to set the attribute variables, it does not seem to work. 我已经尝试解决这个问题很长一段时间了,它真的开始让我神经紧张......我知道矩阵是正确的,当我手动将着色器中的索引值更改为任意整数时,它会读取正确的矩阵值和它应该的方式工作,通过该矩阵转换所有顶点,但是当我尝试使用我写的代码来设置属性变量时,它似乎不起作用。

The code I am using to set the variables is as follows... 我用来设置变量的代码如下......

// 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 );

And my vertex shader looks like this... 我的顶点着色器看起来像这样......

// 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);
}

This is really beginning to frustrate me, and any and all help will be appreciated, 这真的开始让我感到沮丧,任何和所有的帮助将不胜感激,

-Andrew Gotow -Andrew Gotow

Ok, I've figured it out. 好的,我已经弄清楚了。 OpenGL draws triangles with the drawArrays function by reading every 9 values as a triangle (3 vertices with 3 components each). OpenGL通过将每9个值读取为三角形(3个顶点,每个3个组件),使用drawArrays函数绘制三角形。 Because of this, vertices are repepated between triangles, so if two adjacent triangles share a vertex it comes up twice in the array. 因此,顶点在三角形之间重复,因此如果两个相邻的三角形共享一个顶点,它会在数组中出现两次。 So my cube which I originally thought had 8 vertices, actually has 36! 所以我原本认为我的立方体有8个顶点,实际上有36个!

six sides, two triangles a side, three vertices per triangle, all multiplies out to a total of 36 independent vertices instead of 8 shared ones. 六个边,一个边有两个三角形,每个三角形有三个顶点,所有顶点都乘以36个独立顶点,而不是8个共享顶点。

The entire problem was an issue with specifying too few values. 整个问题是指定值太少的问题。 As soon as I extended my test array to include 36 values it worked perfectly. 一旦我将我的测试数组扩展到包含36个值,它就能完美地工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM