에 의해 픽업되지 않기 때문에 버텍스 쉐이더는 3 개의 glm :: mat4 오브젝트를 올바른 위치로 렌더링합니다. 나는 각각의 모델을 1 행씩 균일 한 행렬을 전달하면서 드로잉하고 있었지만 draw call의 양은 프레임 속도를 늦추기 시작했다. 그래서 3 matrix4 vbo를 사용하도록 변경했습니다. 이제는 모든 것이 컴파일되고 객체의 일부를 볼 수 있지만 매트릭스가 쉐이더로 전달되지 않습니다. 나는 누군가가 할 수있는 경우에 이것에 약간 도움을 사랑한다. 다음과 같이 내 코드Matrix VBO가 버텍스 쉐이더
는
static enum BUFFERS {
VERTEX_BUFFER, TEXCOORD_BUFFER, NORMAL_BUFFER, INDEX_BUFFER,
MVP_MAT_VB, MODELVIEW_MAT_VB, NORMAL_MAT_VB
};
#define POSITION_LOCATION 0
#define TEX_COORD_LOCATION 1
#define NORMAL_LOCATION 2
#define MVP_LOCATION 3
#define MODEL_VIEW_LOCATION 7
#define NORMAL_MATRIX_LOCATION 11
만들기 인스턴스가
MeshEntry::MeshEntry(aiMesh *mesh) {
vbo[VERTEX_BUFFER] = NULL;
vbo[TEXCOORD_BUFFER] = NULL;
vbo[NORMAL_BUFFER] = NULL;
vbo[INDEX_BUFFER] = NULL;
vbo[MODELVIEW_MAT_VB] = NULL;
vbo[MVP_MAT_VB] = NULL;
vbo[NORMAL_MAT_VB] = NULL;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
elementCount = mesh->mNumFaces * 3;
if (mesh->HasPositions()) {
float *vertices = new float[mesh->mNumVertices * 3];
for (int i = 0; i < mesh->mNumVertices; ++i) {
vertices[i * 3] = mesh->mVertices[i].x;
vertices[i * 3 + 1] = mesh->mVertices[i].y;
vertices[i * 3 + 2] = mesh->mVertices[i].z;
}
glGenBuffers(1, &vbo[VERTEX_BUFFER]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, 3 * mesh->mNumVertices * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
delete vertices;
}
if (mesh->HasTextureCoords(0)) {
float *texCoords = new float[mesh->mNumVertices * 2];
for (int i = 0; i < mesh->mNumVertices; ++i) {
texCoords[i * 2] = mesh->mTextureCoords[0][i].x;
texCoords[i * 2 + 1] = mesh->mTextureCoords[0][i].y;
}
glGenBuffers(1, &vbo[TEXCOORD_BUFFER]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[TEXCOORD_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, 2 * mesh->mNumVertices * sizeof(GLfloat), texCoords, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(1);
delete texCoords;
}
if (mesh->HasNormals()) {
float *normals = new float[mesh->mNumVertices * 3];
for (int i = 0; i < mesh->mNumVertices; ++i) {
normals[i * 3] = mesh->mNormals[i].x;
normals[i * 3 + 1] = mesh->mNormals[i].y;
normals[i * 3 + 2] = mesh->mNormals[i].z;
}
glGenBuffers(1, &vbo[NORMAL_BUFFER]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[NORMAL_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, 3 * mesh->mNumVertices * sizeof(GLfloat), normals, GL_STATIC_DRAW);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(2);
delete normals;
}
if (mesh->HasFaces()) {
unsigned int *indices = new unsigned int[mesh->mNumFaces * 3];
for (int i = 0; i < mesh->mNumFaces; ++i) {
indices[i * 3] = mesh->mFaces[i].mIndices[0];
indices[i * 3 + 1] = mesh->mFaces[i].mIndices[1];
indices[i * 3 + 2] = mesh->mFaces[i].mIndices[2];
}
glGenBuffers(1, &vbo[INDEX_BUFFER]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[INDEX_BUFFER]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * mesh->mNumFaces * sizeof(GLuint), indices, GL_STATIC_DRAW);
delete indices;
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
glGenBuffers(1, &vbo[MVP_LOCATION]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[MVP_LOCATION]);
for (unsigned int i = 0; i < 4; i++) {
glEnableVertexAttribArray(MVP_LOCATION + i);
glVertexAttribPointer(MVP_LOCATION + i, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (const GLvoid*)(sizeof(GLfloat) * i * 4));
glVertexAttribDivisor(MVP_LOCATION + i, 1);
}
glGenBuffers(1, &vbo[MODELVIEW_MAT_VB]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[MODEL_VIEW_LOCATION]);
for (unsigned int i = 0; i < 4; i++) {
glEnableVertexAttribArray(MODEL_VIEW_LOCATION + i);
glVertexAttribPointer(MODEL_VIEW_LOCATION + i, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (const GLvoid*)(sizeof(GLfloat) * i * 4));
glVertexAttribDivisor(MODEL_VIEW_LOCATION + i, 1);
}
glGenBuffers(1, &vbo[NORMAL_MAT_VB]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[NORMAL_MATRIX_LOCATION]);
for (unsigned int i = 0; i < 4; i++) {
glEnableVertexAttribArray(NORMAL_MATRIX_LOCATION + i);
glVertexAttribPointer(NORMAL_MATRIX_LOCATION + i, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (const GLvoid*)(sizeof(GLfloat) * i * 4));
glVertexAttribDivisor(NORMAL_MATRIX_LOCATION + i, 1);
}
인스턴스 된 렌더링
void MeshEntry::renderInstanced(std::vector<glm::mat4> mvps,
std::vector<glm::mat4> modelViews, std::vector<glm::mat4> normalMats)
{
glBindBuffer(GL_ARRAY_BUFFER, vbo[MVP_MAT_VB]);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * mvps.size(), &mvps[0]
[0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vbo[MODELVIEW_MAT_VB]);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * mvps.size(),
&modelViews[0][0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vbo[NORMAL_MAT_VB]);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * mvps.size(),
&normalMats[0][0], GL_DYNAMIC_DRAW);
glBindVertexArray(vao);
glDrawElementsInstanced(GL_TRIANGLES, elementCount, GL_UNSIGNED_INT,
NULL, mvps.size());
// Make sure the VAO is not changed from the outside
glBindVertexArray(0);
}
버텍스 쉐이더
#version 430 core
layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec2 VertexTex;
layout (location = 2) in vec3 VertexNormal;
layout (location = 3) in mat4 MVP;
layout (location = 7) in mat4 ModelViewMatrix;
layout (location = 11) in mat4 NormalMatrix;
out Data
{
vec3 Position;
vec3 Normal;
vec2 TexCoord;
} data;
void main()
{
data.Normal = normalize(NormalMatrix * vec4(VertexNormal, 0)).xyz;
data.Position = vec3(ModelViewMatrix * vec4(VertexPosition, 1));
data.TexCoord = VertexTex;
gl_Position = MVP * vec4(VertexPosition, 1);
gl_Position = vec4(VertexPosition, 1);
}
를 vbos 상수이다
다시 VBO에서 행렬을 고집하기 전에이 코드가 제대로 작동하므로 입력 값이 정상적으로 보장됩니다. 저는 지난 주에 opengl을 다루기 시작 했으므로 관련성이 있다고 생각되는 모든 코드를 게시 해 주신 것을 용서드립니다. 솔직히 무엇이 잘못 될지 잘 모르겠습니다.
미리 도움을 청하십시오.
을 일하는 한 마 스 니펫을해야 하는가? 그것과 라인 비교를하는 것이 좋을 것입니다. – Xirema
새로운 정보를 얻었으므로 객체를 그리지 만 MVP 행렬이 카메라가 움직이면서 업데이트되지 않아서 질문을 업데이트했습니다. 내 새 코드와 기존 코드의 유일한 차이점은 glUniformMatrix4fv()를 사용하여 1 행 1을 전달하고 DrawElementsInstanced 대신 DrawElements 함수를 호출한다는 것입니다. – gdxn96