我的OpenGL学习记录1

来源:互联网 发布:程序修改分层网络协议 编辑:程序博客网 时间:2024/06/03 02:17

刚刚开始自学OpenGL,记录一点学习过程遇到的问题和收获,帮助自己也帮助别人。

首先,这里有一点OpenGL的安装方法和入门的资料:

http://download.csdn.net/detail/family5love/4308943

照着上面的方法可以很容易地将OpenGL安装到Visual Stdio 2005中,照着资料里面的一点代码运行一下,一个静态的矩形就绘制出来了。

学习教材为OpenGL编程基础-第三版].Edward.Angel著:

http://download.csdn.net/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();
}