opengl超级宝典代码3

第三个例子是第二章的最后一个例子--bounce

代码如下:

// Initial square position and size

GLfloat x = 0.0f;

GLfloat y = 0.0f;

GLfloat rsize = 25;


// Step size in x and y directions

// (number of pixels to move each time)

GLfloat xstep = 1.0f;

GLfloat ystep = 1.0f;


// Keep track of windows changing width and height

GLfloat windowWidth;

GLfloat windowHeight;


///////////////////////////////////////////////////////////

// Called to draw scene

void RenderScene(void)

{

// Clear the window with current clearing color

glClear(GL_COLOR_BUFFER_BIT);


// Set current drawing color to red

// R G B

glColor3f(1.0f, 0.0f, 0.0f);


// Draw a filled rectangle with current color

glRectf(x, y, x + rsize, y - rsize);


// Flush drawing commands and swap

glutSwapBuffers();

}


///////////////////////////////////////////////////////////

// Called by GLUT library when idle (window not being

// resized or moved)

void TimerFunction(int value)

{

// Reverse direction when you reach left or right edge

if(x > windowWidth-rsize || x < -windowWidth)

xstep = -xstep;


// Reverse direction when you reach top or bottom edge

if(y > windowHeight || y < -windowHeight + rsize)

ystep = -ystep;


// Actually move the square

x += xstep;

y += ystep;


// Check bounds. This is in case the window is made

// smaller while the rectangle is bouncing and the

// rectangle suddenly finds itself outside the new

// clipping volume

if(x > (windowWidth-rsize + xstep))

x = windowWidth-rsize-1;

else if(x < -(windowWidth + xstep))

x = -windowWidth -1;


if(y > (windowHeight + ystep))

y = windowHeight-1;

else if(y < -(windowHeight - rsize + ystep))

y = -windowHeight + rsize - 1;




// Redraw the scene with new coordinates

glutPostRedisplay();

glutTimerFunc(33,TimerFunction, 1);

}



///////////////////////////////////////////////////////////

// Setup the rendering state

void SetupRC(void)

{

// Set clear color to blue

glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

}



///////////////////////////////////////////////////////////

// Called by GLUT library when the window has chanaged size

void ChangeSize(int w, int h)

{

GLfloat aspectRatio;


// Prevent a divide by zero

if(h == 0)

h = 1;

// Set Viewport to window dimensions

glViewport(0, 0, w, h);


// Reset coordinate system

glMatrixMode(GL_PROJECTION);

glLoadIdentity();


// Establish clipping volume (left, right, bottom, top, near, far)

aspectRatio = (GLfloat)w / (GLfloat)h;

if (w <= h)

{

windowWidth = 100;

windowHeight = 100 / aspectRatio;

glOrtho (-100.0, 100.0, -windowHeight, windowHeight, 1.0, -1.0);

}

else

{

windowWidth = 100 * aspectRatio;

windowHeight = 100;

glOrtho (-windowWidth, windowWidth, -100.0, 100.0, 1.0, -1.0);

}


glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}


///////////////////////////////////////////////////////////

// Main program entry point

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

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

glutInitWindowSize(800,600);

glutCreateWindow("Bounce");

glutDisplayFunc(RenderScene);

glutReshapeFunc(ChangeSize);

glutTimerFunc(33, TimerFunction, 1);


SetupRC();


glutMainLoop();

return 0;

}


我们不再分析在前两个例子中出现的函数。

第一个地方是如何使用timer,使用的函数glutTimerFunc(33,TimerFunction, 1);,这里第一个参数是毫秒,第二个是timer触发的函数,第三个是传入的参数,注意这个timer每次都只触发一次。

第二个地方是glutPostRedisplay();,它所作的就是强制刷新界面。

第三个地方就是在对显示模式初始化的时候的参数GLUT_DOUBLE,它表示使用双缓存模式,和GLUT_SINGLE不同的是,双缓存方式调用glutSwapBuffers来把还没有刷新的命令效果刷新到,后者使用

glutSwapBuffers

做这个事情。

你可能感兴趣的:(OpenGL)