刚刚开始自学OpenGL,记录一点学习过程遇到的问题和收获,帮助自己也帮助别人。
首先,这里有一点OpenGL的安装方法和入门的资料:
http://download.youkuaiyun.com/detail/family5love/4308943
照着上面的方法可以很容易地将OpenGL安装到Visual Stdio 2005中,照着资料里面的一点代码运行一下,一个静态的矩形就绘制出来了。
学习教材为OpenGL编程基础-第三版].Edward.Angel著:
http://download.youkuaiyun.com/detail/family5love/4327363
今天学习3.7节的鼠标操作自己写了个鼠标绘制矩形的程序,程序中有个BUG,第一下点击鼠标就会绘制矩形,想了好久不知问题出在哪里。程序源代码如下如下:
//2012 05 24
//问题:为什么第一下点击鼠标就会绘制矩形?
#include <windows.h>
#include <gl/gl.h>
#include <gl/glut.h>
GLfloat x1,y1,x2,y2;
float ww,hh;
int num = 0;//记录已点击鼠标左键次数
GLfloat loc[100][2] = {0};//坐标记录数组
//显示回调函数
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
for(int i=0; i<=num; i+=2)
{
glColor3f(0.0,1.0,1.0);
glBegin(GL_POLYGON);
glVertex2f(loc[i][0], loc[i][1]);
glVertex2f(loc[i][0], loc[i+1][1]);
glVertex2f(loc[i+1][0], loc[i+1][1]);
glVertex2f(loc[i+1][0], loc[i][1]);
glEnd();
}
//glutSwapBuffers();
glFlush();
}
//空闲回调函数
void myIdle(void)
{
glutPostRedisplay();
}
//鼠标响应回调函数
void myMouse(int button, int state, int x, int y)
{
//记录鼠标左键当前坐标
if(state == GLUT_DOWN && button == GLUT_LEFT_BUTTON)
{
loc[num][0] = x;
loc[num][1] = hh - y;
num++;
}
}
//初始化函数
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1,1,-1,1);
}
//窗口重构函数
void myReshape(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,(GLfloat)w,0.0,(GLfloat)h);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,w,h);
ww = w;
hh = h;
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(200,200);
glutInitWindowPosition(500,500);
glutCreateWindow("Mouse");
init();
glutMouseFunc(myMouse);
glutReshapeFunc(myReshape);
glutDisplayFunc(myDisplay);
glutIdleFunc(myIdle);
glutMainLoop();
}