#include <gl/glut.h>
#include<gl/孙历gl.h>
#include<gl/glu.h>
void RenderScene(void)
{
//用当前清除色清除颜色缓冲区,即设定窗口的背景色
glClear(GL_COLOR_BUFFER_BIT)
//设置当前绘图使用的RGB颜色
glColor3f(1.0f, 0.0f, 0.0f)
//使用当前颜色绘制一个填充的矩形
glRectf(100.0f, 150.0f, 150.0f, 100.0f)
//刷新OpenGL命令队列
glFlush()
}
// 函数ChangeSize是窗口大小改变时调用的登记函数
void ChangeSize(GLsizei w, GLsizei h)
{
if(h == 0) h = 1
//设置视区尺寸
glViewport(0, 0, w, h)
// 重置坐标系统,使投影变换复位
则派搜glMatrixMode(GL_PROJECTION)
glLoadIdentity()
// 建立修剪空间的范围
if (w <= h)
glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0f, -1.0f)
else
glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0f, -1.0f)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
}
//函数SetupRC用于初始化,常用来设置场景渲染状态
void SetupRC(void)
{
/羡困/ 设置窗口的清除色为白色
glClearColor(1.0f, 1.0f, 1.0f, 1.0f)
}
void main(void)
{
//初始化GLUT库OpenGL窗口的显示模式
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
// 创建一个名为GLRect的窗口
glutCreateWindow("GLRect")
// 设置当前窗口的显示回调函数和窗口再整形回调函数
glutDisplayFunc(RenderScene)
glutReshapeFunc(ChangeSize)
SetupRC()
//启动主GLUT事件处理循环
glutMainLoop()
}
1.7.1 库和头文件 程序GLRect中包含了4个头文件,其中定义了程序所用的函数原形。此外,OpenGL需要下列*.lib包含在你的工程中:opengl.lib,glu.lib,glut32.lib;另外在运行程序路径下或\win98\system\(\winNT\system32)下需要一些动态连接库:opengl32.dll,glu32.dll,glut32.dll。
1.7.2 函数主体
我们先看所有C程序的入口点:
void main(void)
{
1. 显示模式
第一行代码如下:
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
它告诉GLUT库在创建窗口时使用单缓冲区窗口(GLUT_SINGLE)并使用RGB颜色模式(GLUT_RGB)。由于在屏幕上显示图形是由像素构成的,而像素的颜色及灰度信息都是存储在帧缓冲存储区中,单缓冲区窗口使用单一的帧缓冲存储区,这样所有的绘图命令都在显示窗口中执行;另一种是双缓冲区窗口(GLUT_DOUBLE),它使用了两个帧缓冲存储区,这样在窗口中执行的绘图命令实际上利用其中一个帧缓冲存储区创建一个场景,然后很快地交换到窗口视图中来,这种方法常用于产生动画效果的场合。RGB颜色模式意味着要通过分别提供红、绿、蓝成分的浓度来指定颜色。
2. 创建OpenGL窗口
下一行代码:
glutCreateWindow("GLRect")
它利用glut库中的窗口管理函数在屏幕上创建一个标题为“GLRect”的窗口。
3. 回调函数
后面的两行代码
glutDisplayFunc(RenderScene)
glutReshapeFunc(ChangeSize)
分别用于指定当前窗口的显示回调函数和再整形回调函数。回调函数是响应某种事件而被调用的函数,他由程序员编制,通过GLUT注册函数连接到特定的函数。这样只要需要绘制窗口,GLUT就会调用函数RenderScene;而当窗口的大小或形状发生变化时,GLUT会调用函数ChangeSize。
4.设置上下文并执行
SetupRC()函数与GLUT框架无关,其作用是进行OpenGL的初始化。OpenGL的初始化必须在渲染之前进行,由于OpenGL使用状态机,即每条OpenGL命令都使用当前的渲染状态完成,而对当前渲染状态的任何修改都会影响到之后的任何OpenGL命令,直至再次修改当前渲染状态,故此在一个场景中,许多的状态只要设置一次就可以了。
程序的结尾是最后一个GLUT函数调用:
glutMainLoop( )
}
该函数让GLUT框架开始运行,所有设置的回调函数开始工作,直到用户终止程序为止。
// Bounce.c/迅毁/ Demonstrates a simple animated rectangle program with GLUT
// OpenGL SuperBible, 2nd Edition
// Richard S. Wright Jr.
#include"stdafx.h"
#include <windows.h>
#include <gl/glut.h>
// Initial square position and size
GLfloat x1 = 100.0f
GLfloat y1 = 150.0f
GLsizei rsize = 50
// 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 GB
glColor3f(1.0f, 0.0f, 0.0f)
// Draw a filled rectangle with current color
glRectf(x1, y1, x1+rsize, y1+rsize)
// Flush drawing commands
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(x1 >windowWidth-rsize || x1 <0)
xstep = -xstep
// Reverse direction when you reach top or bottom edge
if(y1 >windowHeight-rsize || y1 <0)
ystep = -ystep
// Check bounds. This is incase the window is made
// smaller and the rectangle is outside the new
//碧袭 clipping volume
if(x1 >windowWidth-rsize)
x1 = windowWidth-rsize-1
if(y1 >windowHeight-rsize)
y1 = windowHeight-rsize-1
// Actually move the square
x1 += xstep
y1 += ystep
// 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(GLsizei w, GLsizei h)
{
// 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()
// Keep the square square, this time, save calculated
// width and height for later use
if (w <= h)
{
windowHeight = 250.0f*h/w
windowWidth = 250.0f
}
else
{
windowWidth = 250.0f*w/h
windowHeight = 250.0f
}
// Set the clipping volume
glOrtho(0.0f, windowWidth, 0.0f, windowHeight, 1.0f, -1.0f)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
}
// Main program entry point
void main(void)
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
glutCreateWindow("Bounce")
glutDisplayFunc(RenderScene)
glutReshapeFunc(ChangeSize)
glutTimerFunc(33, TimerFunction, 1)
SetupRC()
glutMainLoop()
}
//是正方形的,你改一下吧~
程序还是自己试着编,这样才会进步,加油哈!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)