PDA

View Full Version : Very beginnner questions with OpenGL in SDL



fuzzymoochicken
02-11-2008, 05:20 AM
I'm using code from Nehe's tutorial, lesson 2, and a little from another SDL/OpenGL tutorial to learn how to use OpenGL, but I'd prefer to use the SDL library in replacement of having to use Win32 code and such.

The problem that I'm having here is that I should be rendering this:
http://img183.imageshack.us/img183/2762/correcthv3.png

But instead, I'm rendering nothing... until I comment out a glTranslatef line, then I'm rendering this:

http://img98.imageshack.us/img98/1220/wrongot0.png


It's really weird, like it's drawing to the whole screen (I have a widescreen, thus it's stretched and proportions are wrong).

Anyway, here's my code. I've tried toying with it, and comparing it to NeHe's and other SDL/OpenGL tutorials, but it just doesn't seem to work correctly. There's nothing here very complex, so I'm hoping it'll be very easy for you guys to spot.


Main:

int main( int argc, char* argv[] ){

SDL_Init(SDL_INIT_EVERYTHING);

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);

SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE,8 );
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32 );


SDL_Surface* drawContext;
Uint32 flags;

flags = SDL_OPENGL | SDL_FULLSCREEN | SDL_HWSURFACE;
drawContext = SDL_SetVideoMode(1024, 768, 0, flags);


glShadeModel(GL_SMOOTH); // Enables Smooth Shading
glDepthFunc(GL_LEQUAL); // The Type Of Depth Test To Do
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_MODELVIEW);


EventLoop();

SDL_Quit();

return 0;

}//End main

EventLoop():

void EventLoop(void)
{
SDL_Event event;
bool done = false;


while((!done) /*&& (SDL_WaitEvent(&event))*/) {

GLRendering();


SDL_PollEvent(&event);
switch(event.type) {
////////////////////////////////////
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_ESCAPE)
done = true;

break;
//////////////////////////////////////
default:
break;
} // End switch

} // End while

}//End EventLoop

GLRendering():

void GLRendering(){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

//The Line I had to comment out.
// glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0


glBegin(GL_TRIANGLES); // Drawing Using Triangles
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd(); // Finished Drawing The Triangle

glTranslatef(3.0f,0.0f,0.0f); // Move Right 3 Units

glBegin(GL_QUADS); // Draw A Quad
glVertex3f(-1.0f, 1.0f, 0.0f); // Top Left
glVertex3f( 1.0f, 1.0f, 0.0f); // Top Right
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glEnd(); // Done Drawing The Quad


SDL_GL_SwapBuffers();
}

Jan
02-11-2008, 05:46 AM
Seems you have moved the camera forwards, so that the polygons are actually behind you, thus you can't see them.

Try
glTranslatef (-1.5f,0.0f,6.0f);

(switched sign in the z-coordinate)

It's often a bit confusing, which calls you need to do in which order (glTranslate and glRotate) and which signs to use. Often it is not intuitive and you just need to play around with the signs to find out, which combination yields the desired results.

Hope that helps, welcome to OpenGL :-)
Jan.

fuzzymoochicken
02-11-2008, 06:05 AM
Nah, that didn't work. It still shows a blank screen. It seems as though the depth can only be a value between -1.0 and 1.0, otherwise the screen is blank.

Also weird, this just started happening with the line...

glTranslatef (-1.5f,0.0f,-1.0f);
http://img266.imageshack.us/img266/112/wrong2mj7.png
(Can't see it with the white background on these forums, but it's partially drawing the box on the right of the screen).


Any number above 1.0 or below -1.0 shows nothing still. So yeah, it probably is zoomed in, but I don't know how to make it zoom out...

Jan
02-11-2008, 06:54 AM
Do you set up your camera somewhere in your code, or is the code you posted all?

You should have a gluPerspective-call somewhere, where you set up your near and far clipping plane. Otherwise it is indeed possible, that only objects with a distance <= 1 to you, will be drawn, since every thing else is clipped.

Jan.

fuzzymoochicken
02-11-2008, 07:22 AM
Okay, so I added the instruction, but that didn't solve it, for some reason...

However, what's really weird is I copy/pasted the instructions of example code of Lesson 2 straight into the program, making it look as such:


int width = 1024, height = 768;

glViewport(0,0,width,height); // Reset The Current Viewport

glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix



glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations

And now, it's working for some reason wheras it didn't before... but they're the same instructions done in a different order.

So I guess you have to do them in a particular order then? Must've been my problem all along... whoops... x_x

Y-tension
02-11-2008, 10:40 AM
It's only natural. Without glFrustum your viewing volume is the unit cube(you can only view objects with -1 <= x <= 1, -1 <= y <= 1, -1 <= z <= 1).
Thus any translation with absolute z > 1 makes objects disappear(actually, it clips any vertices with z = 0 in the objects). The glFrustum call redifines your viewing volume to start at z = -0.1 and end at z = -100. So now when you translate your objects at -6.0 it is within the viewing volume and thus can be seen. I hope it helped.

s_ridenour
02-11-2008, 04:24 PM
Remember that OpenGL is (essentially) a state machine, so yes, the order of function calls is important.