很早打算系统的学习一下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; }
时间: 2024-12-28 18:34:05