第三个例子是第二章的最后一个例子--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超级宝典示例代码,都是自己打的,比较详细。只做了前面13章,可以执行,是初学OpenGL的好资料。
opengl 超级宝典 第五版 源代码 opengl 超级宝典 第五版 源代码 opengl 超级宝典 第五版 源代码
openGL超级宝典(第四版)及代码 电子书
OpenGL超级宝典 笔记21 相关代码 用存储区块来传递变换矩阵
opengl 超级宝典 第二版的 源代码
OpenGL超级宝典第五版的源码。没错是源码啊啊啊啊啊啊啊。
经典OpenGL图形学入门书籍《OpenGL超级宝典英文第五版》及所附完整源码。物有所指!
OPENGL超级宝典 代码 chap1
这个资源在超级宝典源码的的基础上添加了一些中文注释,方便理解每一步的目的与作用
OpenGL超级宝典第四版源代码及库文件,及工程文件。用于配置OpenGL环境或学习
《OpenGL超级宝典(第4版)》开篇详细讲解OpenGL图形编程的核心技术,覆盖了从空间中进行绘制到几何变换,从光照到纹理贴图等内容。书中讲解了新的OpenGL功能,包括OpenGL 2.1的强大可编程管线、定点和片段着色和...
《openGL超级宝典(第四版)及代码》 Comprehensive Tutorial and Reference Richard S. Wright, Jr. Benjamin Lipchak Nicholas Haemel
《openGL超级宝典(第四版)及代码》(OpenGL SuperBible (4th Edition))
openGL超级宝典代码.rar OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API, 其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。...
OpenGL超级宝典的随书光盘,里面所有例子的代码
VS2010编译可通过,如果有报错查找下环境配置就可以了
《OpenGL超级宝典》各章源代码,可以进行三维场景建模等,有实例
由于文件过大,分两次上传,该部分为opengl超级宝典第二版chapter1-10的源码,opengl学习必备材料
OpenGL 超级宝典(第五版)源代码,从作者主页下载,并分离出C++源代码。