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