很早打算系统的学习一下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;
}
原文地址:http://blog.csdn.net/iaccepted/article/details/43802347