Lỗi ma trận perspective trong OpenGL & GLSL

Hiện tại mình đang viết dưới thư viện glew & glut. mọi việc diễn ra tốt với ma trận Model cho đến khi mình thêm ma trận phối cảnh vào, có hiệu ứng xa gần nhưng nó bị dẹp lại và kéo giãn, khi xoay nó quanh trục Y nó chỉ là 1 mặt phẳng chứ không phải là một khối 3D như trước đó, Mọi người giúp mình với!

Code trong hàm reshape:

	glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

và đây là code trong hàm render:

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(m_program);

m_counter += 0.01;

float rotateX = 0.0;
float rotateY = m_counter*50;
float rotateZ = 0.0;
float transX = 0.0;
float transY = 0.0;
float transZ = 0.0;
float scaleX = 1.0f;
float scaleY = 1.0f;
float scaleZ = 1.0f;

float fovy = 70.0;
float aspect = (float)WIDTH / (float)HEIGHT;
float zNear = 0.1f;
float zFar = 100.0f;

glm::vec3 pos(transX, transY, transZ);
glm::vec3 scale(scaleX, scaleY, scaleZ);
glm::vec3 rot(rotateX, rotateY, rotateZ);
glm::mat4 posMat = glm::translate(pos);
glm::mat4 scaleMat = glm::scale(scale);
glm::mat4 rotX = glm::rotate(rot.x, glm::vec3(1.0, 0.0, 0.0));
glm::mat4 rotY = glm::rotate(rot.y, glm::vec3(0.0, 1.0, 0.0));
glm::mat4 rotZ = glm::rotate(rot.z, glm::vec3(0.0, 0.0, 1.0));
glm::mat4 rotMat = rotX * rotY * rotZ;
glm::mat4 Model = posMat * rotMat * scaleMat;


glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, -5.0f);
glm::vec3 forwards = glm::vec3(0.0f, 0.0f, 1.0f);
glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f);
glm::mat4 projection = glm::perspective(fovy, aspect, zNear, zFar);

glm::mat4 VP = projection * glm::lookAt(cameraPos, cameraPos + forwards, up);
glm::mat4 MVP = VP*Model;

glUniformMatrix4fv(m_unif_ModelViewProjection, 1, GL_TRUE, &MVP[0][0]);
glUniformMatrix4fv(m_unif_Model, 1, GL_TRUE, &Model[0][0]);

//render
glBindTexture(GL_TEXTURE_2D, m_texture);
glBindVertexArray(m_mesh);
glDrawElements(GL_TRIANGLES, m_mesh_count, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);

glutSwapBuffers();

Và vertext shader:

#version 130

in vec3 vertex;
in vec2 textCoords;
in vec3 normal;

out vec2 textCoordsOut;
out vec3 normalOut;

uniform mat4 ModelViewProjection;
uniform mat4 Model;

void main () 
{
   gl_Position = ModelViewProjection*vec4(vertex, 1.0);

   textCoordsOut = vec2(textCoords.x, textCoords.y);

   normalOut = (Model*vec4(normal, 0.0)).xyz;
}

và fragment shader:

 #version 130
out vec4 pixelColor;
in vec2 textCoordsOut;
in vec3 normalOut;

uniform sampler2D diff;

void main () 
{
    vec4 c = texture2D(diff, textCoordsOut) * clamp(dot(vec3(0,0,1), normalOut), 0.0, 1.0);
    pixelColor = c;
}

Góc fovy thường là 45 hay 90 độ chứ ko có 70 độ! Còn hiển thị là 1 mặt phẳng thì do điểm đặt camera, di chuyển camera là hết!

3 Likes

Tks bạn, để mình chỉnh lại, mà sao mình đặt glEnable(GL_DEPTH_TEST) nhưng xoay nó vẫn bị những điểm phía sau đè lên.

Cái này có thể do model của bạn bị ngược normal rồi, chứ mình thấy code bạn setup đúng! Bạn up hình lên mình xem thử nhé!

2 Likes

Mình xoay nó theo trục Y và ở một số gốc nó khiến phía sau xuất hiện

Bạn có cái dòng này trong code của bạn ko?
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

1 Like

Mình có thiết lập GLUT_DEPTH luôn rồi bạn

Những lỗi sai trong shader của bạn:
1/ Nếu có nhân với model matrix thì phải là nhân với model inverse transpose mới đúng, xem thêm:


2/ Phải normalize normal vector trước khi tính toán ánh sáng
3/ clamp() ko dùng như thế!
Tham khảo thêm về per-fragment (pixel) lighting:
https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php

3 Likes

Cảm ơn phản hồi của bạn, mình sẽ tìm hiểu kĩ lại.

1 Like

Hi bạn, bạn xem lại giúp mình xem mình nhân ma trận đúng thứ tự khoog vậy bạn, nếu mình dùng các thông số đó qua các hàm glMatrixMode, gluPerspective, glutLookat thì mình nhận được như mong đợi nhưng nếu mình áp dụng với ma trận trên thì kết quả không như mong đợi.

Chào bạn @Nguyen_G_Huy, hiện tại mình ko làm OpenGL nên mấy cái này mình ko nhớ bạn à, tuy nhiên bạn có thể tham khảo sách của thầy Anton, viết rất đầy đủ, từ căn bản lên! Thầy ấy có website:
http://antongerdelan.net/opengl/

Còn đây là 1 cái math cheat sheet cho OpenGL, bạn tham khảo nhé:
http://antongerdelan.net/teaching/3dprog1/maths_cheat_sheet.pdf

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?