在 OpenGL 中绘制一个实心立方体
Posted
技术标签:
【中文标题】在 OpenGL 中绘制一个实心立方体【英文标题】:Draw a solid cube in OpenGL 【发布时间】:2016-03-06 16:44:19 【问题描述】:我正在尝试在 open GL 中绘制一个实心立方体作为界面按钮的背景。问题是,它根本没有在屏幕上绘制。我有一个处理绘图的类 OGWindow 和一个主类/方法。我从主类中的 OGWindow 调用所有必要的方法。我在这里做错了什么?
这是我的主要课程:
OGWindow theWindow;
int main(int argc, char **argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize( 1000, 600 );
glutInitWindowPosition(0, 0);
glutCreateWindow("OpenGL Demo");
glEnable(GL_DEPTH_TEST); // enable the depth buffer test
glutDisplayFunc(DrawGLScene);
glutReshapeFunc(ReSizeGLScene);
glutMouseFunc(mouseClick);
glutMotionFunc(mouseMotion);
glutPassiveMotionFunc(mousePassiveMotion);
glutIdleFunc(Idle);
theWindow.initGL();
glutMainLoop();
void DrawGLScene(void)
theWindow.myDrawGLScene();
这是我的 OGWindow 类:
void OGWindow::initGL(void)
glClearColor(1.0, 1.0, 1.0, 1.0);
squareX = 1.0;
squareY = 1.0;
squareWidth = 40.0;
squareHeight = 40.0;
squareColour = RED;
squareDraggingP = false;
void OGWindow::MyReSizeGLScene(int fwidth, int fheight)
// Store window size in class variables so it can be accessed in myDrawGLScene() if necessary
wWidth = fwidth;
wHeight = fheight;
// Calculate aspect ration of the OpenGL window
aspect_ratio = (float) fwidth / fheight;
// Set camera so it can see a square area of space running from 0 to 10
// in both X and Y directions, plus a bit of space around it.
Ymin = 0;
Xmin = 0;
Ymax = 600;
// Choose Xmax so that the aspect ration of the projection
// = the aspect ratio of the viewport
//Xmax = (aspect_ratio * (Ymax -Ymin)) + Xmin;
Xmax = 1000;
glMatrixMode(GL_PROJECTION); // Select The Projection Stack
glLoadIdentity();
glOrtho(Xmin, Xmax, Ymin, Ymax, -1.0, 1.0);
glViewport(0, 0, wWidth, wHeight); // Viewport fills the window
void OGWindow::myDrawGLScene(GLvoid) // Here's Where We Do All The Drawing
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the drawing area
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
OGWindow::myDrawModel();
glColor3f(0.0, 0.0, 0.0);
drawToolbar();
drawCreateButton();
glutSwapBuffers(); // Needed if we're running an animation
glFlush();
这是假设在场景中绘制立体立方体的方法:
void OGWindow::drawCreateButton(GLvoid)
glPushMatrix();
glColor3f(0.0, 1.0, 0.0);
glTranslatef(10.0,30.0,0.0);
glutSolidCube(4);
glPopMatrix();
【问题讨论】:
您不需要glutSwapBuffers
和glFlush
。无论如何,交换缓冲区都会隐式调用刷新。使用双缓冲区时使用交换缓冲区,使用单缓冲区时使用刷新(您不应该这样做),因此删除glFlush
。 See this question 另外,您的立方体非常小(在尺寸为 1000,600 的窗口上是 4 号),所以如果您增加它的大小或缩放它,您可能会看到一些东西。
感谢您的建议,不胜感激。我确实尝试过扩大规模,是的,没有看到任何东西的运气.. :/
这可能是您在OGWindow::myDrawModel()
或drawToolbar()
中所做的其他事情。
我不知道为什么,但我无法使用“glutSoildCube”方法绘制任何内容。相反,我使用以下内容绘制矩形/立方体(我只会在前面看到,因此立方体看起来像一个矩形):glBegin(GL_QUADS); ...4 个顶点.. glEnd();知道为什么这有效而另一种方法无效吗? :)
这很可能是由于您在此处设置的深度:glOrtho(Xmin, Xmax, Ymin, Ymax, -1.0, 1.0);例如,尝试将最后两个数字更改为 -100.0、100.0。 :)
【参考方案1】:
对不起,如果我没有回答您的问题,但您似乎没有使用现代 OpenGL,在现代应用程序中应避免使用像 glMatrixMode(GL_PROJECTION);
这样的函数以及代码中的更多内容。
您应该使用 VBO 和着色器,而不是 glVertex()
和 glColor()
。
这是一个易于理解的现代 OpenGL 教程:OpenGL tutorial for beginners
【讨论】:
感谢您的建议。但是,这是我在大学学习的 OpenGL 版本,老师特别要求使用它。 遗憾的是,现在大学里仍然教授固定流水线 OpenGL。我帮不上什么忙,因为我很久以前就使用过它,然后我切换到了现代管道。好好学习! 对不起,如果我在这里迂腐,但这不是一个答案,而是一个很好的建议,可以放在 cmets 部分。以上是关于在 OpenGL 中绘制一个实心立方体的主要内容,如果未能解决你的问题,请参考以下文章