2

我正在尝试使用 4x4 矩阵作为顶点属性,使用以下代码:

Mat4 matrices[numVerts];

int mtxBoneID = glGetAttribLocation(hProgram, "aMtxBone");

glEnableVertexAttribArray(mtxBoneID + 0);
glEnableVertexAttribArray(mtxBoneID + 1);
glEnableVertexAttribArray(mtxBoneID + 2);
glEnableVertexAttribArray(mtxBoneID + 3);
glVertexAttribPointer(mtxBoneID + 0, 4, GL_FLOAT, GL_FALSE, sizeof(Mat4), ((Vec4*)matrices) + 0);
glVertexAttribPointer(mtxBoneID + 1, 4, GL_FLOAT, GL_FALSE, sizeof(Mat4), ((Vec4*)matrices) + 1);
glVertexAttribPointer(mtxBoneID + 2, 4, GL_FLOAT, GL_FALSE, sizeof(Mat4), ((Vec4*)matrices) + 2);
glVertexAttribPointer(mtxBoneID + 3, 4, GL_FLOAT, GL_FALSE, sizeof(Mat4), ((Vec4*)matrices) + 3);

// shader:
// ...
attribute mat4 aMtxBone;
// ...

但我在屏幕上看到的都是垃圾。

4

4 回答 4

0

你可以在你的着色器使用布局中尝试这样的事情

layout(location=x) in mat4 <name>;

x 不会等于glGetAttribLocation,你必须自己维护它。它等于你调用的次数glVertexAttribPointer。例子

layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 in_Color;
layout(location=2) in vec4 in_Normal;

glVertexAttribPointer(0, xxxxxxxx);
glVertexAttribPointer(1, xxxxxx);
glVertexAttribPointer(2, xxxxxx);
于 2012-10-09T17:42:03.690 回答
0

因此,由于未知原因,我的答案被删除了。

我又来了,这次我会换一种格式。

我遇到了与问题完全相同的问题,事情会被搞得一团糟。至少描述是这样的。

为我解决的问题是打电话

glDrawElementsInstancedBaseVertex(GL_TRIANGLES,
                                    d->drawCount,
                                    GL_UNSIGNED_INT,
                                    0,
                                    p_objects.size(),
                                    0);

画我的东西,仅此而已。

然而!

如果您的东西绘制不正确,这可能不是您遇到的唯一问题。你需要纠正它的整个清单是巨大的。所以我要在这里放一个链接,它有一个关于如何画很多东西的很棒的教程。此外,您可以获取源代码并自己尝试。

http://ogldev.atspace.co.uk/www/tutorial33/tutorial33.html

来源:http: //ogldev.atspace.co.uk/ogldev-source.zip

再次对我投反对票并删除我的答案,它的内容根本没有改变。

禁止我进入网站,你的损失。

于 2015-09-13T21:14:44.983 回答
-1

首先,您需要glGenBuffers为您的矩阵创建 VBO ( ),然后将其 ( glBindBuffer) 绑定为当前,然后使用

glVertexAttribPointer(mtxBoneID + 0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(mtxBoneID + 1, 4, GL_FLOAT, GL_FALSE, 0, 4);
glVertexAttribPointer(mtxBoneID + 2, 4, GL_FLOAT, GL_FALSE, 0, 8);
glVertexAttribPointer(mtxBoneID + 3, 4, GL_FLOAT, GL_FALSE, 0, 12);

而不是你的glVertexAttribPointer电话。

于 2012-10-09T07:54:30.163 回答
-1

看起来您的偏移量已关闭。它应该是

((Vec4*)matrices) + sizeOf(Vec4)*i

代替

((Vec4*)matrices) + i
于 2012-11-21T16:24:24.837 回答