Skip to main content
edited tags
Source Link
Calmarius
  • 661
  • 5
  • 13

I develop on Linux if that matters.

UPDATE:

UPDATE:

I develop on Linux if that matters.

UPDATE:

Added some relevant code.
Source Link
Calmarius
  • 661
  • 5
  • 13

UPDATE 2:

Ok I'll post the relevant part of the code, projection and view matrixes are set up using my own functions:

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

Projection matrix set up with this call:

createProjectionMatrix(projMatrix, VERTICAL_FOV, ASPECT_RATIO, Z_NEAR, 10000); 

(VERTICAL_FOV = 90, ASPECT_RATIO = 4.0/3, Z_NEAR = 1)

Level drawing is simply:

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

Cubes are rendered wall by wall (optimizing this will be another story):

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

Vertex shader:

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

Fragment shader:

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

The depth buffer simply set up by enabling it.

UPDATE 2:

Ok I'll post the relevant part of the code, projection and view matrixes are set up using my own functions:

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

Projection matrix set up with this call:

createProjectionMatrix(projMatrix, VERTICAL_FOV, ASPECT_RATIO, Z_NEAR, 10000); 

(VERTICAL_FOV = 90, ASPECT_RATIO = 4.0/3, Z_NEAR = 1)

Level drawing is simply:

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

Cubes are rendered wall by wall (optimizing this will be another story):

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

Vertex shader:

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

Fragment shader:

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

The depth buffer simply set up by enabling it.

Realized that GL_CULL_FACE doesn't need to be enabled to reproduce it.
Source Link
Calmarius
  • 661
  • 5
  • 13

Why nearby triangles tend to disappear when back face culling is on?

I've just enabled back face culling andI've just enabled back face culling and I'm noticing a weird behavior: when all vertices of my triangle is outside the view and 2 of them is behind me (I think) the triangle disappears.

So to see it, here is a GIF.

enter image description here

I suspect the projection matrix reverses the order of the two vertices when they fall behind me, and changes the winding of my triangle.

But it's unclear why does the triangles disappear only if all vertices out of view...

How can I work around this problem, if possible?

UPDATE:

It's pointed out it might not be due to the back face culling. I disabled it and I can indeed reproduce it. The cubes are 20×20 and the vertical field view is 90°. Its vertical apparent size roughly fills the window.

Why nearby triangles tend to disappear when back face culling is on?

I've just enabled back face culling and noticing a weird behavior: when all vertices of my triangle is outside the view and 2 of them is behind me (I think) the triangle disappears.

So to see it, here is a GIF.

enter image description here

I suspect the projection matrix reverses the order of the two vertices when they fall behind me, and changes the winding of my triangle.

But it's unclear why does the triangles disappear only if all vertices out of view...

How can I work around this problem, if possible?

Why nearby triangles tend to disappear?

I've just enabled back face culling and I'm noticing a weird behavior: when all vertices of my triangle is outside the view and 2 of them is behind me (I think) the triangle disappears.

So to see it, here is a GIF.

enter image description here

I suspect the projection matrix reverses the order of the two vertices when they fall behind me, and changes the winding of my triangle.

But it's unclear why does the triangles disappear only if all vertices out of view...

How can I work around this problem, if possible?

UPDATE:

It's pointed out it might not be due to the back face culling. I disabled it and I can indeed reproduce it. The cubes are 20×20 and the vertical field view is 90°. Its vertical apparent size roughly fills the window.

Tweeted twitter.com/#!/StackGameDev/status/416462497114521600
deleted 199 characters in body
Source Link
Calmarius
  • 661
  • 5
  • 13
Loading
added 7 characters in body
Source Link
Calmarius
  • 661
  • 5
  • 13
Loading
Source Link
Calmarius
  • 661
  • 5
  • 13
Loading