Autor Wątek: Uniform buffer - problem z dowiązaniem buforu do programu  (Przeczytany 867 razy)

Offline Montjet

  • Użytkownik

# Lipiec 28, 2016, 00:40:40
Biblioteka matematyczna z której korzystam to Eigen.
W klasie Camera tworzę bufor typu Uniform (GL_UNIFORM_BUFFER):
glGenBuffers(1, &viewProjUBO);
glBindBuffer(GL_UNIFORM_BUFFER, viewProjUBO);
glBufferData(GL_UNIFORM_BUFFER, sizeof(viewProjectonMatrix), &viewProjectonMatrix, GL_DYNAMIC_DRAW);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, viewProjUBO);

następnie w głównej funkcji (w celu przetestowania) utworzyłem proste VAO wraz z VBO (pozycje wierzchołków kwadratu) oraz dowiązuję do podanego programu powyżej stworzone UBO:
// test
Eigen::Matrix<float, 2, 1, Eigen::DontAlign> Vertices[4] = {
Eigen::Matrix<float, 2, 1, Eigen::DontAlign>(0.0, 0.0),
Eigen::Matrix<float, 2, 1, Eigen::DontAlign>(0.0, 0.8),
Eigen::Matrix<float, 2, 1, Eigen::DontAlign>(0.8, 0.8),
Eigen::Matrix<float, 2, 1, Eigen::DontAlign>(0.8, 0.0),
};

glGenVertexArrays(1, &(VAO));
glBindVertexArray(VAO);
glGenBuffers(1, &(VBO));

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertices[0]), Vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

camera->UpdateMatrix();
GLuint indexUBO = glGetUniformBlockIndex(**meshPO, "mvp");
// Tworzy blok uniform dla podanego indeksu dla programu (ostatni element do indeks bloku uniform - następny będzie 1), to samo w następnej funkcji (przed-osttani argument)
glUniformBlockBinding(**meshPO, indexUBO, 0);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, camera->ViewProjUBO());

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);


"**meshPO" pobiera GLuint będące programem.

Kod vertex shadera:
#version 420
layout( location = 0 ) in vec2 pos;

uniform mat4 mvp;

void main()
{
vec4 Pos = vec4(pos, -1.0, 1.0);
gl_Position  = mvp * Pos;
}

W oknie pojawia się kwadrat bez transformacji mvp (tak jakby był jednostkowy), dlaczego??
Co robię źle ?

Zawartość w chwili początkowej macierzy "viewProjectonMatrix":


#edit:
Zapomniałem o fragmencie odpowiedzialnym za aktualizacje macierzy:
void Camera::UpdateMatrix() const
{
if (!viewIsUptodate)
{
Eigen::Quaternion<float, Eigen::DontAlign> q = Orientation().conjugate();
viewMatrix.linear() = q.toRotationMatrix();
viewMatrix.translation() = -(viewMatrix.linear() * Position());

viewProjectonMatrix = projectionMatrix * viewMatrix.matrix();

glBindBuffer(GL_UNIFORM_BUFFER, viewProjUBO);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(viewProjectonMatrix), &viewProjectonMatrix);

std::cout << viewProjectonMatrix << std::endl;

viewIsUptodate = true;
}
}
« Ostatnia zmiana: Lipiec 28, 2016, 00:42:27 wysłana przez Montjet »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych