当前位置: 首页 > 工具软件 > Globulation 2 > 使用案例 >

OpenGL---2

郗阳德
2023-12-01

书上的例子+百度函数:

#include <Windows.h>
#include <gl/glut.h> //我是通过在电脑中搜索GL.h然后人工的把glut.h放在了里面--vs2012



static GLfloat spin = 0.0;

void init()
{
	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_FLAT);
}


//显示回调函数
void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glPushMatrix();
	glRotatef(spin, 0.0, 0.0, 1.0);
	glColor3f(1.0,1.0,1.0);
	glRectf(-25.0,-25.0,25.0,25.0);
	glPopMatrix();
	glutSwapBuffers(); //交换缓冲区 双缓冲技术
}

void spinPlay(void)
{
	spin = spin + 2.0;
	if (spin > 360.0)
		spin -= 360.0;
	glutPostRedisplay();

}

void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void mouse(int button, int state, int x, int y)
{
	switch (button)
	{
	case GLUT_LEFT_BUTTON:
		if (state == GLUT_DOWN)
			glutIdleFunc(spinPlay);
		break;
	case GLUT_MIDDLE_BUTTON:
		if (state == GLUT_DOWN)
			glutIdleFunc(NULL); //空闲处理函数
		break;
	default:
		break;
	}
}

int main(int argc, char **argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //双缓冲
	glutInitWindowSize(250,250);
	glutInitWindowPosition(100,100);
	glutCreateWindow(argv[0]);
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMouseFunc(mouse);
	glutMainLoop(); //开启事件循环 已注册的显示回调函数被触发
	return 0;
}
void glShadeModel(GLenum model);

参数可以为GL_SMOOTH(默认值)或GL_FLAT;  GL_FLAT-恒定着色,使用图元中某个顶点的颜色渲染整个图元

GL-SMOOTH(光滑着色)独立的处理图元中各个顶点的着色。


glPushMatrix()和glPopMatrix()

将本次要进行的缩放,平移等操作放在这两个函数之间,他们两的配对使用可以消除上一次的变化对本次变化的影响。使本次变换是以世界坐标系的原点为参考点进行。


glRotatef(GLfloat angle, GLfloatf x, GLfloatf y, GLfloatf z)

第一个表示旋转的角度,后面的x,y,z貌似表示一个整体向量,图形围绕着这个向量旋转angle度。可以尝试改变后面3个参数来看效果。


glutSwapBuffers是OpenGL中GLUT工具包中用于实现双缓冲技术的一个重要函数,该函数的功能是交换两个缓冲区指针。---用于解决画面闪烁的问题,即使绘制的东西同时出现在屏幕上。双缓冲技术就是使用两个缓冲区-前台缓冲和后台缓冲,前台缓冲是我们看到的屏幕,后台缓冲则在内存当中,每次的绘图操作都在后台进行,当绘制完成时,把绘制的最终结果都复制到屏幕上,这样我们看到的GDI元素都是同时出现在屏幕上,就可解决频繁刷新时屏幕闪烁的问题。


OpenGL中实现双缓冲:1,在调用glInitDisplayModel函数时开启GLUT_DOUBLE。2,调用glutDisplayFunc(display)注册函数时,在回调函数中所有绘制操作完成后调用glutSwapBuffers()交换两个缓冲区指针。3.调用glutIdelFunc注册一个空闲时绘制操作函数,注册的这个函数再调用display函数。


glMatrixModel()指定哪一个矩阵是当前矩阵

这个函数其实就是对接下来要做什么进行声明,也就是在做下一步之前告诉计算机我要对“什么”进行操作了。这个“什么"包括GL_MODELVIEW.GL_PROJECTION, GL_TEXTURE

GL_PROJECTION是对投影矩阵,GL_MODELVIEW是对模型视图,GL_TEXTURE是对纹理矩阵进行操作

与glLoadIdentity一同使用,glLoadIdentity这个函数的功能是重置当前的矩阵为单位矩阵,在glLoadIdentity()之后我们为场景设置了透视图。


 类似资料: