首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opengl模型不能跨平台正确重叠

opengl模型不能跨平台正确重叠
EN

Stack Overflow用户
提问于 2011-02-22 02:05:29
回答 1查看 304关注 0票数 1

编辑:我在开头添加了几行新代码,用于深度缓冲,但没有成功。请参阅代码..

编辑2:我正在通过wxwidgets在wxglcanvas上构建模型构建器。我已经在启用深度缓冲和glClear(GL_DEPTH_BUFFER_BIT)的基础上初始化了WX_GL_DEPTH_SIZE为16和WX_GL_DOUBLEBUFFER,但没有成功。值得注意的一件事是,当我画一个圆锥体时,它似乎是在绘制圆锥体,就像我在看它的内部而不是外部一样,所以它看起来就像是凹进去的。

我有一个奇怪的问题,我的openGL模型不能正确重叠。我正在构建一个模型构建器,以便用户可以在画布上创建和旋转模型。

例如:如果我在长方体内有一个圆,并旋转模型,我仍然可以看到长方体内的圆,就像长方体是透明的一样。我的想法是,如果圆圈在盒子里,我应该看不到它。有没有人能猜出是什么导致了这种类型的问题?我没有实现任何类型的透明度,所以我不太确定是什么导致了这种情况。我对openGL还很陌生,所以我的很多努力都是在尝试我在论坛上找到的几行代码,希望它能正常工作。此外,此代码的一部分继承自其他程序。

当我在添加两行代码后测试我的程序时,这个问题似乎只在Ubuntu中发生,而不是在Win7下(如下所示)。

以下是一些用于绘制模型的代码行...

代码语言:javascript
复制
//Newly Added code
      glEnable(GL_DEPTH_TEST);
      glDepthFunc(GL_GEQUAL);
      glClearDepth(1.0f);
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//End newly added code  

glGetIntegerv(GL_MATRIX_MODE, &mm);

glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(identity);
       GrGetInfo();

glViewport(0,0,gw->gc.width,gw->gc.height);
       GrGetInfo();

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Set some predefined parameters

glOrtho ((GLdouble)tmpOtherAxis.minval, (GLdouble)tmpOtherAxis.maxval, 
               (GLdouble)tmpRangeAxis.minval, (GLdouble)tmpRangeAxis.maxval,  
               -range_dist, range_dist);
glMatrixMode(mm);

//ADDED THESE TWO LINES AND MODEL DISPLAYED
//CORRECTLY IN WIN7 BUT NOT UBUNTU
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glPushMatrix();
//Draw model here
glPopMatrix();

任何帮助都将不胜感激,请随时向我询问有关这方面的任何问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-22 02:10:49

在我看来,您的z-buffer并未启用。如果没有z缓冲区,将只按发出的OpenGL命令的顺序绘制几何图形。实际上,没有“落后”。

要让z-buffer正常工作,您需要:

  1. 为渲染窗口请求z缓冲区。这是特定于平台的。
  2. Call glEnable( GL_DEPTH_TEST )。
  3. 使用glClear( ... | GL_DEPTH_BUFFER_BIT );

代码在不同平台上表现不同的两种可能的解释是:(a) z-buffer没有在其中一个平台上(正确地)分配,或者(b)在一个平台上GL_DEPTH_TEST的默认状态是on,而在另一个平台上是OFF。

编辑

在windows应用程序中,在使用wglCreateContext()之前,您将在HDC上的某个位置使用ChoosePixelFormat/SetPixelFormat对。这就是你指定深度缓冲区的地方。

代码语言:javascript
复制
            HDC hdc = GetDC(hwnd);

            PIXELFORMATDESCRIPTOR pfd;
            memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
            pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
            pfd.nVersion = 1;
            pfd.cColorBits = 16;
            pfd.cDepthBits = 16;  // <---- !!! Depth buffer !!!
            pfd.dwFlags = PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;
            pfd.iPixelType = PFD_TYPE_RGBA;

            int format;
            if ((format = ChoosePixelFormat(hdc, &pfd)) != 0)
                    SetPixelFormat(hdc, format, &pfd);

            HGLRC hrc = wglCreateContext(hdc);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5069522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档