|
楼主 |
发表于 2011-6-21 09:14:40
|
显示全部楼层
回复 2# array
我把代码做了一些改动,改成在display中修改数据并使用立即模式绘制, 如下。也是一样的问题。看起来像是windows没有通知gl应该重绘,当有遮挡窗体在移动时,可以看到会刷新数据。- // OPENGL头文件
- #include <gl/glew.h>
- #include <GL/glut.h>
- #include <GL/glu.h>
- #include <GL/gl.h>
- #include <string>
- #include <sstream>
- #include <assert.h>
- #define _USE_MATH_DEFINES
- #include <math.h>
- #include <iostream>
- //////////////////////////////////////////////////////////////////////////
- // 关于GLUT的部分
- //////////////////////////////////////////////////////////////////////////
- // 窗口参数
- const int gWinWidth = 1024;
- const int gWinHeight = 768;
- const char* gWinTitile = "glut beginning!";
- float eye_z; // 视点和原点位置的z差
- // “退出”菜单ID
- static const int QUIT_VALUE = 99;
- // 显示列表ID
- GLuint listID;
- // 缓存对象 modify by cr 2011/6/20
- GLuint buffers[2];// 顶点,颜色
- // insert by cr 2011/06/20
- bool useDisplayList = false;
- bool useVertexArrays = false;
- bool useBufferObjects = false;
- GLfloat* vertices = NULL;
- GLuint verticesNum;
- unsigned int num=0;
- GLfloat data[] = {
- -100.f, -100.f, 0.f,
- 100.f, -100.f, 0.f,
- 0.f, 100.f, 0.f};
- GLfloat color[] = {
- 1.f, 1.f, 0.f, 1.f,
- 1.f, 0.f, 0.f, 1.f,
- 0.f, 1.f, 0.f, 1.f};
- static void idle(void)
- {
- }
- // 重要回调1:显示回调,GLUT调用它完成重绘。
- static void display(void)
- {
- num ++;
- std::cout<< " "<< num <<";" ;
- glClear(GL_COLOR_BUFFER_BIT);
- // 将模型矩阵往后退eye_z,即向屏幕里移动eye_z
- glLoadIdentity();
- glTranslatef(0.f,0.f,-eye_z);
- //glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
- //GLfloat* ptr = (GLfloat*) glMapBuffer(GL_ARRAY_BUFFER,GL_READ_WRITE);
- //for (unsigned int i = 0; i< verticesNum; i+=3)
- //{
- // ptr[i] += 1.f;
- //}
- //glUnmapBuffer(GL_ARRAY_BUFFER);
- for (unsigned int i = 0; i< verticesNum; i+=3)
- {
- data[i] += 5.f;
- }
- if (useBufferObjects)
- {
- glDrawArrays(GL_TRIANGLES, 0, 3);
- }
- else
- {
- if (useDisplayList)
- // 绘制显示列表的内容
- glCallList(listID);
- else
- {
- glBegin( GL_TRIANGLES );
- glColor4fv(&color[0]);
- glVertex3fv( &data[0] );
- glColor4fv(&color[4]);
- glVertex3fv( &data[3] );
- glColor4fv(&color[8]);
- glVertex3fv( &data[6] );
- glEnd();
- }
- }
- // 交换缓存,即将后缓存中的内容刷新到帧缓存,
- // 帧缓存中的内容会被显示设备即刻显示出来。
- glutSwapBuffers();
- assert(glGetError() == GL_NO_ERROR);
- }
- // 重要回调2:重塑回调。
- // 在窗口size发成变化时,GLUT会调用它。类同c#中窗体的sizechanged()
- static void reshape(int w, int h)
- {
- // 更新视口
- glViewport(0,0,w,h);
- // 更新投影矩阵和屏幕纵横比
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- eye_z = (h/2) / atanf(M_PI*50./180.);
- gluPerspective(50., (double)w/(double)h, 1., 10000.);
- // 矩阵状态置为模型变换
- glMatrixMode(GL_MODELVIEW);
- assert(glGetError() == GL_NO_ERROR);
- }
- // 重要回调3:GLUT菜单回调。类同c#中menuitem::clicked()
- static void mainMenuCB(int value)
- {
- if (value == QUIT_VALUE)
- exit(0);
- }
- // 一些重要的初始化
- static void initGLUT(void)
- {
- // 关闭抖动。
- // 抖动是色位不够的时候用较少的颜色来模拟缺少的颜色的一种方法
- glDisable(GL_DITHER);
- // 获得GL版本
- // getGetString()
- std::string ver((const char*) glGetString(GL_VERSION));
- assert(!ver.empty());
- std::istringstream verStream(ver);
- // 分解版本号,major.minor.xx, 最后的xx没有取出
- int major, minor ;
- char dummySep;
- verStream >> major >> dummySep >> minor;
- // 即OpenGL1.1以上才支持定点数组,但原先的判断方法貌似有问题
- //const bool useVertexArrays = ( (major >= 1) && (minor >= 1) ); //原先的 delete by cr 2011/6/20
- //const bool useVertexArrays = ((major*10+minor) >= 11); // modify by cr 2011/6/20
- useVertexArrays = ((major*10+minor) >= 11);
- // 1.5以上支持缓存对象
- //const bool useBufferObjects = ((major*10+minor) >= 15); // modify by cr 2011/6/20
- //useBufferObjects = ((major*10+minor) >= 15);
- verticesNum = 3*3;
- vertices = (GLfloat*)malloc( sizeof(GLfloat) * verticesNum );
- GLfloat* tmpptr = vertices;
- *tmpptr = -100.f; tmpptr ++;
- *tmpptr = -100.f; tmpptr ++;
- *tmpptr = 0.f; tmpptr ++;
- *tmpptr = 100.f; tmpptr ++;
- *tmpptr = -100.f; tmpptr ++;
- *tmpptr = 0.f; tmpptr ++;
- *tmpptr = 0.f; tmpptr ++;
- *tmpptr = 100.f; tmpptr ++;
- *tmpptr = 0.f;
- if (useBufferObjects)
- {
- //// 从缓存池获取2个未用的id给vboid
- glGenBuffers(2, buffers);
- glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
- glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(GLfloat) * 3, vertices, GL_DYNAMIC_DRAW);
- //glBindBuffer(GL_ARRAY_BUFFER, buffers[1]);
- //glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(GLfloat) * 4, color, GL_DYNAMIC_DRAW);
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, 0);
- //glVertexPointer(3, GL_FLOAT, 0, 0);
- //glDeleteBuffers(n, &buffers);
- }
- // 使用顶点数组
- else
- {
- if (useVertexArrays)
- {
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, data);
- glEnableClientState(GL_COLOR_ARRAY);
- glColorPointer(4, GL_FLOAT, 0, color);
- //glNormalPointer()
- //glTexCoordPointer()
- }
- if (useDisplayList)
- {
- // 创建显示列表ID
- listID = glGenLists(1);
- // 编译显示列表
- //(即从这里开始到glEndList为止的gl代码都会被编译成一系列指令直接存储在GPU的显存内)
- glNewList(listID, GL_COMPILE);
- }
- if (useVertexArrays)
- {
- glDrawArrays(GL_TRIANGLES, 0, 3);
- }
- else
- {
- glBegin( GL_TRIANGLES );
- glColor4fv(&color[0]);
- glVertex3fv( &data[0] );
- glColor4fv(&color[4]);
- glVertex3fv( &data[3] );
- glColor4fv(&color[8]);
- glVertex3fv( &data[6] );
- glEnd();
- }
- if (useDisplayList)
- {
- // 显示列表结束
- glEndList();
- }
- }
- assert(glGetError() == GL_NO_ERROR);
- // 绑定显示回调和重塑回调
- // Tips: F12转到定义查看更多GLUT回调
- glutIdleFunc(idle);
- glutDisplayFunc(display);
- glutReshapeFunc(reshape);
- // 创建右键菜单,参数是回调函数
- int mainMenu = glutCreateMenu(mainMenuCB);
- glutAddMenuEntry("退出", QUIT_VALUE);
- glutAttachMenu(GLUT_RIGHT_BUTTON);
- }
- //////////////////////////////////////////////////////////////////////////
- // 程序入口
- //////////////////////////////////////////////////////////////////////////
- int main(int argc, char** argv)
- {
- // 1.glutInit
- glutInit(&argc, argv);
- // 2.创建GLUT窗口
- glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);
- glutInitWindowSize(gWinWidth,gWinHeight);
- glutCreateWindow(gWinTitile);
- // glewInit()必须在rc创建以后
- glewInit();
- // 3.一系列对glut的初始化工作
- initGLUT();
- // 4.开始仿真循环
- glutMainLoop();
- return 0;
- }
复制代码 |
|