如何在GLSL中使用4x4矩阵作为顶点属性?

时间:2012-10-09 03:31:54

标签: c++ opengl glsl vertex-shader

我正在尝试使用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 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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

再次向我推特并删除我的回答,它的内容根本没有改变。

禁止我离开网站,你的损失。

答案 2 :(得分:-1)

首先,您需要为矩阵创建VBO(glGenBuffers),然后将其绑定(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次来电。

答案 3 :(得分:-1)

看起来你的偏移是关闭的。它应该是

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

而不是

((Vec4*)matrices) + i
相关问题