在类中渲染OpenGL对象?

时间:2017-01-13 02:23:03

标签: c++ opengl

我正在尝试学习现代OpenGL并为各种原始类型创建类,例如立方体,球体等。但我遇到了一个问题,我的立方体类没有在其{{1}中呈现任何内容函数,但如果我将它全部移动到我的Draw()函数中,它可以正常工作。

这是cube.cpp的代码:

main()

#include "cube.h" #include <iostream> GLuint Cube::indexArr[36] = { 0, 1, 2, // front face 2, 3, 1, 4, 5, 6, 6, 7, 4, 7, 3, 0, 0, 4, 7, 6, 2, 1, 1, 5, 6, 0, 1, 5, 5, 4, 0, 3, 2, 6, 6, 7, 3 }; bool Cube::cubeSetUp = false; GLuint Cube::cubeVBO = 0; GLuint Cube::cubeVAO = 0; GLuint Cube::cubeEBO = 0; Cube::Cube() { if (!cubeSetUp) SetUpCube(); //define the 8 vertices that make up a cube objectVerts = new GLfloat[24] { -0.5f, -0.5f, -0.5f, // front bottom left 0 0.5f, -0.5f, -0.5f, // front bottom right 1 0.5f, 0.5f, -0.5f, // front top right 2 -0.5f, 0.5f, -0.5f, // front top left 3 -0.5f, -0.5f, 0.5f, // back bottom left 4 0.5f, -0.5f, 0.5f, // back bottom right 5 0.5f, 0.5f, 0.5f, // back top right 6 -0.5f, 0.5f, 0.5f // back top left 7 }; } void Cube::Draw() { glBindVertexArray(cubeVAO); //GLfloat modelMatrix[16]; //transform.affine.ConvertToOpenGLMatrix(modelMatrix); //glUniformMatrix4fv(modelMatrixLoc, 1, GL_FALSE, modelMatrix); glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); glBindVertexArray(0); } void Cube::SetUpCube() { cubeSetUp = true; glGenVertexArrays(1, &cubeVAO); glGenBuffers(1, &cubeVBO); glGenBuffers(1, &cubeEBO); glBindVertexArray(cubeVAO); glBindBuffer(GL_ARRAY_BUFFER, cubeVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(objectVerts), objectVerts, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeEBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexArr), indexArr, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } 的代码:

cube.h

我做错了吗? OpenGL不同意为我的索引数组使用静态数组吗?我试图摆脱元素缓冲区对象,只使用#ifndef __CUBE__H_ #define __CUBE__H_ #include "scene_object.h" class Cube : public SceneObject { public: /*************** * Constructor * ***************/ Cube(); /*********************** * Overloaded Function * ***********************/ void Draw(); private: static GLuint indexArr[36]; static bool cubeSetUp; static GLuint cubeVBO, cubeVAO, cubeEBO; void SetUpCube(); }; #endif ,但它也没有用。如果需要,我也可以为main提供代码。

此外,顶点着色器没有做任何事情。它只接收顶点信息并将其提供给glDrawArrays(...)

感谢您的帮助。

gl_Position的代码:

main.cpp

编辑:添加了main.cpp和cube.h的代码,以防它有价值。

1 个答案:

答案 0 :(得分:1)

至少有两件事情出错。

首先,正如pleluron所指出的那样,在应用程序窗口和GL上下文创建之前调用立方体构造函数。在较旧的系统上,这通常会崩溃。在现代计算机上,可能存在由窗口系统创建的默认GL上下文,因此为此创建了多维数据集。然后你的应用程序创建自己的窗口和上下文,并且立方体是孤立的。

创建OpenGL&#34;对象&#34;应该只在指定的方法中发生,只有在安全的情况下才会调用。在Qt中它是视图setupGL方法,在MacOS Cocoa中它是prepareOpenGL,其他系统是第一个窗口绘制。

正如BDL所指出的,第二个问题是sizeof(objectVerts)没有按照你的想法做到。打印声明将显示给您。

第三个问题是你没有调用glGetError()。当你做错事时,OpenGL不会抛出异常,并且通常不会崩溃。相反,它什么也没做。养成在每个重要函数或方法结束时调用glGetError()的习惯,以确保一切正常。如果确实发生了错误,请添加更多glGetErrors()以缩小原因。