在 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();
 

【问题讨论】:

您不需要glutSwapBuffersglFlush。无论如何,交换缓冲区都会隐式调用刷新。使用双缓冲区时使用交换缓冲区,使用单缓冲区时使用刷新(您不应该这样做),因此删除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 中绘制一个实心立方体的主要内容,如果未能解决你的问题,请参考以下文章

PyOpenGL 如何选择颜色来绘制每个形状?

使用 GLM 在 OpenGL 中绘制 2 个立方体

C++/OpenGL - 绘制立方体 VBO

OpenGL ES绘制魔方

OpenGL - 当我在立方体上绘制边框时出现额外的线条

OpenGL/GLUT:glTranslatef 和 glRotatef 在绘制立方体之前还是之后?