当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 求教:OpenGL中怎么重绘?
帖子发表于 : 2009-05-22 11:14 

注册: 2007-01-17 22:09
帖子: 86
送出感谢: 0 次
接收感谢: 0 次
我刚开始学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;
 }


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 求教:OpenGL中怎么重绘?
帖子发表于 : 2009-05-22 11:21 
头像

注册: 2008-06-23 15:19
帖子: 3030
地址: 北欧某国
系统: ���������
送出感谢: 21
接收感谢: 6
在消息循环中加入,窗口被遮挡后重绘窗口就好了。不过具体的我也不是很清楚。
我看您使用的完全都是OpenGL接口,我可以帮您查一下。


_________________
http://noie.name 网站改版中。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 求教:OpenGL中怎么重绘?
帖子发表于 : 2009-05-22 11:40 

注册: 2007-01-17 22:09
帖子: 86
送出感谢: 0 次
接收感谢: 0 次
那先谢谢你了,我用的OpenGL是mesa及glut系统就是ubuntu9.04不知道那个消息应该怎么写?


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 求教:OpenGL中怎么重绘?
帖子发表于 : 2009-05-22 12:07 
头像

注册: 2008-06-23 15:19
帖子: 3030
地址: 北欧某国
系统: ���������
送出感谢: 21
接收感谢: 6
您好,我试着编译了一下您的程序,也遇到了和您一样的问题。
我仔细看了一下您的程序,我觉得没问题,不知道您使用的是什么显卡驱动?
我用的是Ubuntu 9.04和Radeon开源驱动,我猜,这也许是开源驱动的一个bug。
以上尽为猜测,仅供参考。

对了,glutDisplayFunc ( display );这一句是用来接收重绘消息的,开始是我弄错了。


_________________
http://noie.name 网站改版中。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 求教:OpenGL中怎么重绘?
帖子发表于 : 2009-05-22 12:15 

注册: 2007-01-17 22:09
帖子: 86
送出感谢: 0 次
接收感谢: 0 次
我的显卡是Inter的集成显卡,估计也是开源驱动吧~


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 求教:OpenGL中怎么重绘?
帖子发表于 : 2009-05-29 0:22 

注册: 2008-09-10 15:31
帖子: 2
送出感谢: 0 次
接收感谢: 0 次
既然你已经使用glut,那么在任何你认为需要重绘的时候,调用glutPostRedisplay。

我不了解linux下的消息,因此最稳妥的方法似乎是使用glutTimerFunc设置一个定时器,不断调用glutPostRedisplay函数。


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 求教:OpenGL中怎么重绘?
帖子发表于 : 2009-06-06 10:21 

注册: 2007-04-21 7:37
帖子: 99
送出感谢: 0 次
接收感谢: 0 次
重绘:glutPostRedisplay();
调用它就重绘,即使窗口被挡住,也会重绘

你可以在Idle中调用这个函数,


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 求教:OpenGL中怎么重绘?
帖子发表于 : 2009-06-06 10:23 

注册: 2007-04-21 7:37
帖子: 99
送出感谢: 0 次
接收感谢: 0 次
我有其他问题,就是程序运行时,看不到窗口边框阿
你没有遇到马


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 求教:OpenGL中怎么重绘?
帖子发表于 : 2010-05-27 19:21 

注册: 2009-06-07 12:05
帖子: 10
送出感谢: 0 次
接收感谢: 0 次
这应该是开源驱动的bug吧,或者是linux的bug(不太可能,嗯)。
我在windows下试过了,完全正常,没有lz说的问题。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译