簡體   English   中英

如何在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;
// ...

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

您可以在着色器使用布局中嘗試類似的操作

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

因此,由於未知原因,我的答案被刪除了。

我再次開始,這次我將采用不同的格式。

我遇到的問題與曾經存在的問題完全一樣,東西會被弄得一團糟。 至少那是描述。

對我來說固定的是打電話

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

再次拒絕我投票並刪除我的答案,它的內容完全沒有改變。

禁止我進入網站,您的損失。

首先,您需要為矩陣創建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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM