Why does OpenGL not show some of my faces?

Started by
8 comments, last by Jungletoe 12 years, 4 months ago
After implementing my isometric view sometime back, rendering objects has gotten really weird. I assume it has to do with my code in my INIT function and the viewpoint, but I'm not entirely sure. I've been experimenting all day with it by trying to comment out lines and such with no success.

Here is what happens:
cce540b816cb3c68c4a78ffbc3d16305.PNG

Here is what it looks like in Blender:
71a012639deee0cd24b86526e8aa5714.PNG


This is probably a really simple error to fix (I probably just need to drop in another glEnable, although Ive tried almost everything) so I feel bad for posting about it.

Here is the relevant code in my INIT function:


void init()
{
// Set projection transform
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-10.0f, 10.0f, -10.0f, 10.0f, -10.0f, 10.0f);

// Set view transform
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

//lighting
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0); //player lights
glEnable(GL_LIGHT1); //sun light
glEnable(GL_NORMALIZE);
}



And here is my main:


int main( int agrc, char* args[] )
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface* screen=SDL_SetVideoMode(600,400,32, SDL_SWSURFACE|SDL_OPENGL );
bool running = true;
Uint32 start;
SDL_Event event;
init();

while(running)
{
start=SDL_GetTicks();
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
running = false;
break;
}
}
display();
SDL_GL_SwapBuffers();
angle = angle + .1;
if(angle > 360)
angle = 0;
if(1000/30>(SDL_GetTicks()-start))
SDL_Delay(1000/30>(SDL_GetTicks()-start));
}

SDL_FreeSurface(screen);
SDL_Quit();
return 0;
}


Advertisement
Probably need to convert to triangles in blender.

NBA2K, Madden, Maneater, Killing Floor, Sims http://www.pawlowskipinball.com/pinballeternal


Probably need to convert to triangles in blender.


Its not just files exported from Blender that create the problem. When I draw a cube it has the exact same problems.
It's possible that you're not being consistent with whether faces are drawn clockwise or counterclockwise, meaning that some of the faces are "backwards," that is, facing away from the camera. If you have backface culling enabled or any of various lighting setups, those faces will not be rendered or will appear black.
-~-The Cow of Darkness-~-

It's possible that you're not being consistent with whether faces are drawn clockwise or counterclockwise, meaning that some of the faces are "backwards," that is, facing away from the camera. If you have backface culling enabled or any of various lighting setups, those faces will not be rendered or will appear black.


I commented out all of my lighting code and nothing changed. I doubt it has to do with that.

I should also add that when I keep a cube in a static position then the order of events in which I render the different faces of the cube matters. For example, if I render the vertices for the bottom face first then it will eventually be overlayed by the top face once I render it.

[quote name='cowsarenotevil' timestamp='1324184682' post='4894942']
It's possible that you're not being consistent with whether faces are drawn clockwise or counterclockwise, meaning that some of the faces are "backwards," that is, facing away from the camera. If you have backface culling enabled or any of various lighting setups, those faces will not be rendered or will appear black.


I commented out all of my lighting code and nothing changed. I doubt it has to do with that.[/quote]

Did you try doing glDisable(GL_CULL_FACE) right before rendering the faces as well, just to be sure?


I should also add that when I keep a cube in a static position then the order of events in which I render the different faces of the cube matters. For example, if I render the vertices for the bottom face first then it will eventually be overlayed by the top face once I render it.
[/quote]

I see you have glEnable(GL_DEPTH_TEST) in your init code, so my guess is that either your depth buffer is not setup correctly (e.g. zNear and zFar are not set correctly, among other things) or depth testing is being disabled before you actually render the faces somehow.
-~-The Cow of Darkness-~-

[quote name='cowsarenotevil' timestamp='1324184682' post='4894942']
It's possible that you're not being consistent with whether faces are drawn clockwise or counterclockwise, meaning that some of the faces are "backwards," that is, facing away from the camera. If you have backface culling enabled or any of various lighting setups, those faces will not be rendered or will appear black.


I commented out all of my lighting code and nothing changed. I doubt it has to do with that.
[/quote]
That is probably because lighting has nothing to do with anything.

Each quad is made up of 2 triangles, one facing towards the camera and one facing away.
You have not maintained consistent winding when converting the triangle fans, or you have not correctly extracted both faces from each fan.


Each quad is a “face”.
Each face is stored as a “triangle fan”.

Fans are converted as follows:
Assume your fan has 5 points 0 1 2 3 4.
The 3 triangles in this fan/face are:
0 1 2
0 2 3
0 3 4


Your example material is composed entirely of quads, which means 4 points 0 1 2 3.
And 2 triangles:
0 1 2
0 2 3


L. Spiro

I restore Nintendo 64 video-game OST’s into HD! https://www.youtube.com/channel/UCCtX_wedtZ5BoyQBXEhnVZw/playlists?view=1&sort=lad&flow=grid


That is probably because lighting has nothing to do with anything.

Each quad is made up of 2 triangles, one facing towards the camera and one facing away.
You have not maintained consistent winding when converting the triangle fans, or you have not correctly extracted both faces from each fan.


Each quad is a “face”.
Each face is stored as a “triangle fan”.

Fans are converted as follows:
Assume your fan has 5 points 0 1 2 3 4.
The 3 triangles in this fan/face are:
0 1 2
0 2 3
0 3 4


Your example material is composed entirely of quads, which means 4 points 0 1 2 3.
And 2 triangles:
0 1 2
0 2 3


L. Spiro


The only thing is that I haven't complicated my code enough for it to completely bug out like this. The code I used for the isometric view had a comment under it that said "Warning, models might not work correctly under this set up", so I assume that it has to be a problem with that. I posted the code to my modelview matrix and the viewing code in the OP.

EDIT:
I commented out the isometric view part and the problem persists.

Probably need to convert to triangles in blender.


I have to agree with this. I just recently had the same issue as you and then realized that I had forgotten to convert my quads to triangles in blender.


Its not just files exported from Blender that create the problem. When I draw a cube it has the exact same problems.


How do you define your cube? 6 quads with 8 vertices, 6 quads with 24 vertices, 12 triangles with 8 vertices, 12 triangles with 36 vertices? More importantly, you need to list your display function. The problem may lie in there, but we don't know.

[quote name='dpadam450' timestamp='1324184074' post='4894939']
Probably need to convert to triangles in blender.


I have to agree with this. I just recently had the same issue as you and then realized that I had forgotten to convert my quads to triangles in blender.


Its not just files exported from Blender that create the problem. When I draw a cube it has the exact same problems.


How do you define your cube? 6 quads with 8 vertices, 6 quads with 24 vertices, 12 triangles with 8 vertices, 12 triangles with 36 vertices? More importantly, you need to list your display function. The problem may lie in there, but we don't know.
[/quote]

It probably has to do with Blender now that I think about it... how do you make it so that it doesn't export triangles only? After some testing I realized that it only displays the triangles and not any quads.

Here is my display function even though I'm pretty sure its blender now:


void display(){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

//Add ambient light
GLfloat ambientColor[] = {0.2f, 0.2f, 0.2f, 1.0f}; //Color (0.2, 0.2, 0.2)
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor);

//Add sun light
GLfloat lightColor1[] = {0.3f, 0.3f, 0.5f, 1.0f}; //sunlight color
GLfloat lightPos1[] = {-0.5f, 1.0f, 0.5f, 0.0f}; //Coming from the direction
glLightfv(GL_LIGHT1, GL_DIFFUSE, lightColor1);
glLightfv(GL_LIGHT1, GL_POSITION, lightPos1);

drawSmiley(0, 2, 0);

/*
drawStone(0, 0, 0);
drawStone(1, 0, 0);
drawSand(2, 0, 0);
drawStone(0, 0, 1);
drawPlank(0, 0, 2);
drawDirt(0, 0, 3);
drawGrass(0, 1, 3);
*/

glFlush();
}


[size="7"]EDIT:
[size=7]Got it to work, thanks. Now I need to add lighting and texture surfaces somehow...



This topic is closed to new replies.

Advertisement