Tôi vừa kích hoạt tính năng loại bỏ mặt sau và tôi nhận thấy một hành vi kỳ lạ: khi tất cả các đỉnh của tam giác của tôi nằm ngoài tầm nhìn và 2 trong số chúng nằm phía sau tôi (tôi nghĩ) hình tam giác biến mất.
Vì vậy, để xem nó, đây là một GIF.
Tôi nghi ngờ ma trận chiếu đảo ngược thứ tự của hai đỉnh khi chúng nằm phía sau tôi và thay đổi cuộn dây của tam giác của tôi.
Nhưng không rõ tại sao các hình tam giác biến mất chỉ khi tất cả các đỉnh ngoài tầm nhìn ...
Làm thế nào tôi có thể làm việc xung quanh vấn đề này, nếu có thể?
Tôi phát triển trên Linux nếu điều đó quan trọng.
CẬP NHẬT:
Nó chỉ ra rằng nó có thể không phải là do mặt sau bị loại bỏ. Tôi đã vô hiệu hóa nó và tôi thực sự có thể tái tạo nó. Các hình khối là 20 × 20 và chế độ xem trường dọc là 90 °. Kích thước rõ ràng theo chiều dọc của nó gần như lấp đầy cửa sổ.
CẬP NHẬT 2:
Ok tôi sẽ đăng phần có liên quan của mã, phép chiếu và ma trận xem được thiết lập bằng các hàm riêng của tôi:
void createViewMatrix(
GLfloat matrix[16],
const Vector3 *forward,
const Vector3 *up,
const Vector3 *pos
)
{
/* Setting up perpendicular axes */
Vector3 rright;
Vector3 rup = *up;
Vector3 rforward = *forward;
vbonorm(&rright, &rup, &rforward); /* Orthonormalization (right is computed from scratch) */
/* Filling the matrix */
matrix[0] = rright.x;
matrix[1] = rup.x;
matrix[2] = -rforward.x;
matrix[3] = 0;
matrix[4] = rright.y;
matrix[5] = rup.y;
matrix[6] = -rforward.y;
matrix[7] = 0;
matrix[8] = rright.z;
matrix[9] = rup.z;
matrix[10] = -rforward.z;
matrix[11] = 0;
matrix[12] = -vdp(pos, &rright);
matrix[13] = -vdp(pos, &rup);
matrix[14] = vdp(pos, &rforward);
matrix[15] = 1;
}
void createProjectionMatrix(
GLfloat matrix[16],
GLfloat vfov,
GLfloat aspect,
GLfloat near,
GLfloat far
)
{
GLfloat vfovtan = 1 / tan(RAD(vfov * 0.5));
memset(matrix, 0, sizeof(*matrix) * 16);
matrix[0] = vfovtan / aspect;
matrix[5] = vfovtan;
matrix[10] = (near+far)/(near-far);
matrix[11] = -1;
matrix[14] = (2*near*far)/(near-far);
}
Ma trận chiếu được thiết lập với lệnh gọi này:
createProjectionMatrix(projMatrix, VERTICAL_FOV, ASPECT_RATIO, Z_NEAR, 10000);
(VERTICS_FOV = 90, ASPECT_RATIO = 4.0 / 3, Z_NEAR = 1)
Vẽ mức độ đơn giản là:
void drawStuff()
{
GLfloat projectView[16];
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
createViewMatrix(viewMatrix, &camera.forward, &camera.up, &camera.pos);
multiplyMatrix(projectView, viewMatrix, projMatrix); /*< Row mayor multiplication. */
glUniformMatrix4fv(renderingMatrixId, 1, GL_FALSE, projectView);
bailOnGlError(__FILE__, __LINE__);
renderLevel(&testLevel);
}
Các hình khối được kết xuất bằng tường (tối ưu hóa đây sẽ là một câu chuyện khác):
for (j = 0; j < 6; j++)
{
glBindTexture(GL_TEXTURE_2D, cube->wallTextureIds[j]);
bailOnGlError(__FILE__, __LINE__);
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_INT, (void*)(sizeof(GLuint) * 4 * j));
bailOnGlError(__FILE__, __LINE__);
glUniform4f(extraColorId, 1, 1, 1, 1);
bailOnGlError(__FILE__, __LINE__);
}
Máy tạo bóng Vertex:
#version 110
attribute vec3 position;
attribute vec3 color;
attribute vec2 texCoord;
varying vec4 f_color;
varying vec2 f_texCoord;
uniform mat4 renderingMatrix;
void main()
{
gl_Position = renderingMatrix * vec4(position, 1);
f_color = vec4(color, 1);
f_texCoord = texCoord;
}
Mảnh vỡ mảnh:
#version 110
varying vec4 f_color;
varying vec2 f_texCoord;
uniform sampler2D tex;
uniform vec4 extraColor;
void main()
{
gl_FragColor = texture2D(tex, f_texCoord) * vec4(f_color) * extraColor;
}
Bộ đệm sâu chỉ đơn giản là thiết lập bằng cách kích hoạt nó.