简单一个opengl程序,2D图形移动

很早打算系统的学习一下opengl,但是由于课程以及学习算法占据了时间,一直没能开始,现在这段时间开始弄opengl了,这几天看正在看《Opengl 变成指南 第8版》,首先看了GLSL写shader。这里先使用固定管线写个简单的小例子试试,然后开始进行可编程管线。

这个小例子很简单,就是在2D平面画个正方形,然后左右移动。

思路很简单,主要是两个函数,draw 和 move,draw负责绘制,move负责移动的控制,然后设置两个回调函数,glutDisplayFunc和glutIdleFunc,这样在空闲的时候就会调用move函数,设置移动信息,然后发送一个重新显示的信号,这样就能回调draw函数进行在移动后的新位置重新绘制。


#include <gl/glew.h>
#include <gl/glut.h>
#include <iostream>
#include <cstdlib>

using namespace std;

GLfloat rtx = 0, rty = 0, rtz = 0;

void init()
{
	glLoadIdentity();
	glClearColor(0.0, 0.0, 0.0, 0.0);
}

void draw(void)
{
	glClear(GL_COLOR_BUFFER_BIT);

	glPushMatrix();
	glTranslatef(rtx, rty, rtz);

	glBegin(GL_QUADS);
		glColor3f(1.0f, 0.0f, 0.0f);
		glVertex2f(-0.5f, 0.5f);
		glColor3f(0.0f, 1.0f, 0.0f);
		glVertex2f(0.5f, 0.5f);
		glColor3f(0.0f, 0.0f, 1.0f);
		glVertex2f(0.5f, -0.5f);
		glColor3f(0.5f, 0.5f, 0.5f);
		glVertex2f(-0.5f, -0.5f);
	glEnd();

	glPopMatrix();
	glutSwapBuffers();
}

void move()
{
	static GLfloat step = 0.0002;
	if (rtx + step > 0.5 || rtx + step < -0.5)step = -step;
	rtx += step;
	
	glutPostRedisplay();
}

int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(300, 300);
	glutCreateWindow("test");

	init();

	glutDisplayFunc(draw);
	glutIdleFunc(move);

	glutMainLoop();
	return 0;
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。