求教:OpenGL中怎么重绘?

软件和网站开发以及相关技术探讨
回复
bluetornado
帖子: 86
注册时间: 2007-01-17 22:09

求教:OpenGL中怎么重绘?

#1

帖子 bluetornado » 2009-05-22 11:14

我刚开始学OpenGL,在网上找了一点资料,编译了一下例子,可惜不知道怎么重绘,当窗口被其它的窗口覆盖时就没有了~,好象只有窗口大小改变时它才能重绘,下面是我用的代码,我用的编译命令是g++ -lglut opengl.cpp -o opengl(原文说用gcc -I/usr/local/include -L/usr/local/lib -L/usr/X11R6/lib -lglut -lGLU -lGL -lX11 -lXext -lXmu -lXi -lm light.c -o light编译,右惜我的找不到lxmu与lxi,然后我用的那种方法编译与g++ -I/usr/local/include -L/usr/local/lib -L/usr/X11R6/lib -lglut -lGLU -lGL -lX11 -lXext -lm opengl.cpp -o opengl都是一样的)

代码: 全选

  /* light.c
 此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
 */
 /* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
 
#include <GL/glut.h>
#include <GL/gl.h>
#include<GL/glu.h>
#include <stdlib.h>
  
 /* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
void init ( void )
{
     GLfloat mat_specular [ ] = { 1.0, 1.0, 1.0, 1.0 };
     GLfloat mat_shininess [ ] = { 50.0 };
     GLfloat light_position [ ] = { 1.0, 1.0, 1.0, 0.0 };
 
     glClearColor ( 0.0, 0.0, 0.0, 0.0 );
     glShadeModel ( GL_SMOOTH );
 
     glMaterialfv ( GL_FRONT, GL_SPECULAR, mat_specular);
     glMaterialfv ( GL_FRONT, GL_SHININESS, mat_shininess);
     glLightfv ( GL_LIGHT0, GL_POSITION, light_position);
 
     glEnable (GL_LIGHTING);
     glEnable (GL_LIGHT0);
     glEnable (GL_DEPTH_TEST);
}
 
 /*调用GLUT函数,绘制一个球*/
void display ( void )
{
     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glutSolidSphere (1.0, 40, 50);
	 glColor3f(1.0f,0.5f,0.0f);
	 glBegin(GL_LINES);
	 glVertex3f(-100.0f,-100.0f,-100.0f);
	 glVertex3f(100.0f,100.0f,100.0f);
	 glEnd();
	 glutSwapBuffers();
     glFlush ();
 }
 
 
 /* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
 void reshape (int w, int h)
 {
     glViewport (0, 0, (GLsizei) w, (GLsizei) h);
     glMatrixMode (GL_PROJECTION);
     glLoadIdentity ( );
     if (w <= h)
         glOrtho (-1.5, 1.5, -1.5 * ( GLfloat ) h / ( GLfloat ) w, 1.5 * ( GLfloat ) h / ( GLfloat ) w, -10.0, 10.0 );
     else
         glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h, 1.5 * ( GLfloat ) w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
     glMatrixMode ( GL_MODELVIEW );
     glLoadIdentity ( ) ;
 }
 
 
 /* 定义对键盘的响应函数 */
 void keyboard ( unsigned char key, int x, int y)
 {
     /*按Esc键退出*/
     switch (key) 
     {
         case 27:
         exit ( 0 );
         break;
     }
 }
 
 
 int main(int argc, char** argv)
 {
     /* GLUT环境初始化*/
     glutInit (&argc, argv);
     /* 显示模式初始化 */
     glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
     /* 定义窗口大小 */
     glutInitWindowSize (300, 300);
     /* 定义窗口位置 */
     glutInitWindowPosition (100, 100);
     /* 显示窗口,窗口标题为执行函数名 */
     glutCreateWindow ( argv [ 0 ] );
     /* 调用OpenGL初始化函数 */
     init ( );
     /* 注册OpenGL绘图函数 */
     glutDisplayFunc ( display );
     /* 注册窗口大小改变时的响应函数 */
     glutReshapeFunc ( reshape );
     /* 注册键盘响应函数 */
     glutKeyboardFunc ( keyboard );
     /* 进入GLUT消息循环,开始执行程序 */
     glutMainLoop( );
     return 0;
 }
头像
Hello World!
帖子: 3051
注册时间: 2008-06-23 15:19
系统: ���������
来自: 北欧某国
联系:

Re: 求教:OpenGL中怎么重绘?

#2

帖子 Hello World! » 2009-05-22 11:21

在消息循环中加入,窗口被遮挡后重绘窗口就好了。不过具体的我也不是很清楚。
我看您使用的完全都是OpenGL接口,我可以帮您查一下。
http://noie.name 网站改版中。
bluetornado
帖子: 86
注册时间: 2007-01-17 22:09

Re: 求教:OpenGL中怎么重绘?

#3

帖子 bluetornado » 2009-05-22 11:40

那先谢谢你了,我用的OpenGL是mesa及glut系统就是ubuntu9.04不知道那个消息应该怎么写?
头像
Hello World!
帖子: 3051
注册时间: 2008-06-23 15:19
系统: ���������
来自: 北欧某国
联系:

Re: 求教:OpenGL中怎么重绘?

#4

帖子 Hello World! » 2009-05-22 12:07

您好,我试着编译了一下您的程序,也遇到了和您一样的问题。
我仔细看了一下您的程序,我觉得没问题,不知道您使用的是什么显卡驱动?
我用的是Ubuntu 9.04和Radeon开源驱动,我猜,这也许是开源驱动的一个bug。
以上尽为猜测,仅供参考。

对了,glutDisplayFunc ( display );这一句是用来接收重绘消息的,开始是我弄错了。
http://noie.name 网站改版中。
bluetornado
帖子: 86
注册时间: 2007-01-17 22:09

Re: 求教:OpenGL中怎么重绘?

#5

帖子 bluetornado » 2009-05-22 12:15

我的显卡是Inter的集成显卡,估计也是开源驱动吧~
wuwenye
帖子: 2
注册时间: 2008-09-10 15:31

Re: 求教:OpenGL中怎么重绘?

#6

帖子 wuwenye » 2009-05-29 0:22

既然你已经使用glut,那么在任何你认为需要重绘的时候,调用glutPostRedisplay。

我不了解linux下的消息,因此最稳妥的方法似乎是使用glutTimerFunc设置一个定时器,不断调用glutPostRedisplay函数。
xinyu391
帖子: 99
注册时间: 2007-04-21 7:37

Re: 求教:OpenGL中怎么重绘?

#7

帖子 xinyu391 » 2009-06-06 10:21

重绘:glutPostRedisplay();
调用它就重绘,即使窗口被挡住,也会重绘

你可以在Idle中调用这个函数,
xinyu391
帖子: 99
注册时间: 2007-04-21 7:37

Re: 求教:OpenGL中怎么重绘?

#8

帖子 xinyu391 » 2009-06-06 10:23

我有其他问题,就是程序运行时,看不到窗口边框阿
你没有遇到马
smsdf
帖子: 10
注册时间: 2009-06-07 12:05

Re: 求教:OpenGL中怎么重绘?

#9

帖子 smsdf » 2010-05-27 19:21

这应该是开源驱动的bug吧,或者是linux的bug(不太可能,嗯)。
我在windows下试过了,完全正常,没有lz说的问题。
回复