我正在尝试使用 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;
// ...
但是我在屏幕上看到的都是垃圾。
所以,我的答案被删除了,原因不明。
我又来了,这次我会以不同的方式格式化它。
我遇到了与问题完全相同的问题,东西会被绘制得很混乱。至少描述是这样的。
为我解决问题的是打电话
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
再次否决我并删除我的答案,它的内容与原来完全没有改变。
禁止我访问该网站,你的损失。
你可以尝试这样的事情 在你的着色器中使用布局
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);
长话短说OpenGL规范不支持你想要的。
顶点属性格式最多有 4 个分量。因此,您只能使用 vec4 作为顶点属性的最高维度输入。
参见 OpenGL 4.6 规范,表 10.3,第 354 页。
如果我是你,我会将我的矩阵存储在 UBO / SSBO 中,并使用 gl_VertexID 或作为顶点属性传递的用户定义索引来使用它们。
首先您需要为您的矩阵创建 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
电话。
看起来你的偏移量已关闭。应该是
((Vec4*)matrices) + sizeOf(Vec4)*i
而不是
((Vec4*)matrices) + i