01/10/2018, 16:53

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;
}
Nguyễn Phạm Anh Quân viết 19:08 ngày 01/10/2018

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!

Nguyễn G Huy viết 18:58 ngày 01/10/2018

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.

Nguyễn Phạm Anh Quân viết 19:05 ngày 01/10/2018

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é!

Nguyễn G Huy viết 19:01 ngày 01/10/2018

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

Nguyễn Phạm Anh Quân viết 18:57 ngày 01/10/2018

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

Nguyễn G Huy viết 19:09 ngày 01/10/2018

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

Nguyễn Phạm Anh Quân viết 18:58 ngày 01/10/2018

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:

stackoverflow.com
user1796942

Why transforming normals with the transpose of the inverse of the modelview matrix?

opengl, glsl, game-engine, game-physics
asked by user1796942 on 10:59PM - 30 Nov 12

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

Nguyễn G Huy viết 18:53 ngày 01/10/2018

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

Nguyễn G Huy viết 18:55 ngày 01/10/2018

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.

Nguyễn Phạm Anh Quân viết 19:10 ngày 01/10/2018

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

Bài liên quan
0