如何在 GLSL 中使用 4x4 矩阵作为顶点属性
How to use a 4x4 matrix as a vertex attribute in GLSL?
我正在尝试使用以下代码将 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
,你必须通过 yourself.it 等于你调用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);
首先,您需要为矩阵创建 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
相关文章:
- 我对 MyGraph 属性顶点名称和边权重有问题
- BGL:无法访问捆绑的顶点属性
- 输出(用于 GraphViz)提升图顶点及其属性,使用具有私有变量的类作为捆绑属性
- 我可以将单个顶点索引与具有所有属性(位置、法线、texCoord)的顶点缓冲区一起使用吗?
- 可以在同一 VBO 中存储不同的顶点属性和索引
- Boost:列出GraphMl中指定的顶点和边缘属性
- 如何使用boost::graph dijkstra的算法,如果顶点属性是指针?
- BGL Adjacency_list:如何使用顶点属性(而不是描述符)对OUT_EDGE进行排序
- 在 OpenGL 中,为什么除非我再次重新指定顶点属性,否则我的缓冲区对象不会绘制?
- 打开"GL着色器存储缓冲区对象"以替换"顶点属性"
- 在OpenGL中,如何从内存中编辑特定的顶点缓冲区属性
- 将属性传递给OpenGL顶点着色器的行为很奇怪
- 如何在 GLSL 中使用 4x4 矩阵作为顶点属性
- 在BGL中,如何使用顶点的属性有效地找到相邻顶点
- 为什么要为一个属性指定不同的顶点格式
- 从 boost::adjacency_list 获取边属性(包括相关顶点)
- 顶点着色器的 OpenGL 属性的名称
- 顶点属性 - 对顶点位置使用短点而不是浮点数
- 使用BOOST复制具有相邻顶点的边及其属性
- OpenGL顶点属性指针或着色器不工作