Jump to content
  • Advertisement
Sign in to follow this  
Jungletoe

OpenGL Why does OpenGL not show some of my faces?

This topic is 2500 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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


Share this post


Link to post
Share on other sites
Advertisement

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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

[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.

Share this post


Link to post
Share on other sites

[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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

[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...



Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!