OpenGL 在 ubuntu 和 windows 中的行为不同
OpenGL behaves differently in ubuntu and windows
我正在使用 wxGLContext 和 wxGLCanvas 进行 3D 可视化。我这样初始化opengl
SetCurrent(*canvas);
glEnable(GL_BLEND);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
并绘制对象
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-w, w, -h, h, -10.0f, 10.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
quad = gluNewQuadric();
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL);
//draw the objects
gluDeleteQuadric(quad);
glFlush();
问题是此代码在 windows 中运行良好,但在 ubuntu 中,对象被位于后面的对象裁剪。 glFrontFace 对于所有对象都是正确的,但是裁剪是错误的。
正如评论中提到的HolyBlackCat,
问题是 wxGLContext 的深度缓冲区。
它通过使用 WX_GL_DEPTH_SIZE 8 和 16 而不是 32 来工作。
虽然,我仍然不知道,windows如何处理它而不出错,我更正了一些行如下
int AttribList[] = {WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0};
wxGLCanvas* glc = new wxGLCanvas(parent, wxID_ANY, AttribList,
wxDefaultPosition, wxDefaultSize,
wxFULL_REPAINT_ON_RESIZE);
现在它适用于两种操作系统。
我正在使用 wxGLContext 和 wxGLCanvas 进行 3D 可视化。我这样初始化opengl
SetCurrent(*canvas);
glEnable(GL_BLEND);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
并绘制对象
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-w, w, -h, h, -10.0f, 10.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
quad = gluNewQuadric();
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL);
//draw the objects
gluDeleteQuadric(quad);
glFlush();
问题是此代码在 windows 中运行良好,但在 ubuntu 中,对象被位于后面的对象裁剪。 glFrontFace 对于所有对象都是正确的,但是裁剪是错误的。
正如评论中提到的HolyBlackCat, 问题是 wxGLContext 的深度缓冲区。 它通过使用 WX_GL_DEPTH_SIZE 8 和 16 而不是 32 来工作。
虽然,我仍然不知道,windows如何处理它而不出错,我更正了一些行如下
int AttribList[] = {WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0};
wxGLCanvas* glc = new wxGLCanvas(parent, wxID_ANY, AttribList,
wxDefaultPosition, wxDefaultSize,
wxFULL_REPAINT_ON_RESIZE);
现在它适用于两种操作系统。