我正在尝试学习现代OpenGL并为各种原始类型(例如多维数据集,球体等)创建类。但是,我遇到了一个问题,即我的多维数据集类在其Draw()
函数中未呈现任何内容,但是如果我将其移动,所有到我的main()
功能,它工作正常。
这是cube.cpp的代码:
#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
:
#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
难道我做错了什么?OpenGL是否不同意为索引数组使用静态数组?我尝试摆脱了元素缓冲区对象,而只使用glDrawArrays(...)
,但是它也没有用。如果需要,我也可以提供主要代码。
另外,顶点着色器什么也没做。它仅接收顶点信息并将其提供给gl_Position
。
谢谢你的帮助。
的代码main.cpp
:
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <fstream>
#include <string>
#include "shader.h"
#include "cube.h"
#include "camera.h"
using namespace std;
int main(int argc, char* argv[])
{
if (argc != 3)
{
cout << "Incorrect number of arguments!" << endl;
cout << "Usage: [executable] vertexShader fragmentShader" << endl;
return -1;
}
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(800, 600, "Scene Description Language Generator", nullptr, nullptr);
if (window == nullptr)
{
std::cout << "Failed to create the GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
std::cout << "Failed to initialize GLEW" << std::endl;
return -1;
}
glEnable(GL_DEPTH_TEST);
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
Shader shader(argv[1], argv[2]);
Cube c;
GLuint modelMat = glGetUniformLocation(shader.GetProgram(), "model");
c.SetModelMatrixLoc(modelMat);
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
glClearColor(0.2f, 0.3f, 0.3f, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
shader.Use();
c.Draw();
glfwSwapBuffers(window);
}
glfwTerminate();
return 0;
}
编辑:为main.cpp和cube.h添加了代码,以防万一。
至少有两件事情出了问题。
首先,正如pleluron指出的那样,在创建应用程序窗口和GL上下文之前,将调用多维数据集构造函数。在较旧的系统上,这通常会崩溃。在现代计算机上,窗口系统可能创建了默认的GL上下文,因此为此创建了多维数据集。然后,您的应用程序创建其自己的窗口和上下文,并且该多维数据集被孤立。
创建OpenGL“对象”只能在指定的方法中进行,只有在安全的情况下才调用此方法。在Qt中,这是视图setupGL方法;在MacOS Cocoa中,它是prepareOpenGL;在其他系统中,这是第一个窗口绘制。
正如BDL指出的那样,第二个问题是sizeof(objectVerts)并没有按照您的想象做。打印声明将显示给您。
第三个问题是您没有调用glGetError()。当您做错事情时,OpenGL不会引发异常,并且通常不会崩溃。相反,它什么也不做。养成在每个重要函数或方法的末尾调用glGetError()的习惯,以确保一切正常。如果确实发生错误,请放入更多glGetErrors()以缩小原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句