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

问题描述 投票:0回答:5

我正在尝试使用 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;
// ...

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

c++ opengl glsl vertex-shader
5个回答
1
投票

所以,我的答案被删除了,原因不明。

我又来了,这次我会以不同的方式格式化它。

我遇到了与问题完全相同的问题,东西会被绘制得很混乱。至少描述是这样的。

为我解决问题的是打电话

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

再次否决我并删除我的答案,它的内容与原来完全没有改变。

禁止我访问该网站,你的损失。


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

0
投票

长话短说OpenGL规范不支持你想要的。

顶点属性格式最多有 4 个分量。因此,您只能使用 vec4 作为顶点属性的最高维度输入。

参见 OpenGL 4.6 规范,表 10.3,第 354 页。

如果我是你,我会将我的矩阵存储在 UBO / SSBO 中,并使用 gl_VertexID 或作为顶点属性传递的用户定义索引来使用它们。


-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
电话。


-1
投票

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

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

而不是

((Vec4*)matrices) + i
© www.soinside.com 2019 - 2024. All rights reserved.