在类中渲染OpenGL对象?

卡特

我正在尝试学习现代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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在OpenGL中渲染镜头前的对象

来自分类Dev

在OpenGL中渲染对象时消除颜色通道

来自分类Dev

在OpenGL中渲染对象的哪种方式更有效?

来自分类Dev

OpenGL对象无法正确渲染?

来自分类Dev

opengl中的水渲染

来自分类Dev

iOS中的OpenGl渲染

来自分类Dev

通过复制将opengl对象包装到c ++类中

来自分类Dev

在OpenGL中渲染.ply文件

来自分类Dev

在OpenGL中渲染裁剪的图像

来自分类Dev

在OpenGL中渲染.ply文件

来自分类Dev

在OpenGL中渲染到纹理

来自分类Dev

捕获在OpenGL中渲染的内容

来自分类Dev

OpenGL ES(WebGL)渲染许多小对象

来自分类Dev

渲染多个对象时,opengl闪烁

来自分类Dev

在 reactjs 中渲染对象

来自分类Dev

如何有效地在openGL中渲染大量对象?

来自分类Dev

使用OpenGL渲染时加载多对象对象

来自分类Dev

QT中的渲染循环功能可在Windows中渲染opengl

来自分类Dev

如何在 React 中渲染同一类的多个对象?(如 Instagram、Facebook 或 Pinterest)

来自分类Dev

Xamarin中的跨平台OpenGL渲染

来自分类Dev

opengl中的渲染目标是什么?

来自分类Dev

纹理在OpenGL中的渲染非常奇怪

来自分类Dev

在OpenGL着色器中渲染纹理

来自分类Dev

在现代OpenGL中渲染大圆形点

来自分类Dev

在OpenGL中渲染纹理1到1

来自分类Dev

opengl中的窗口崩溃和部分渲染

来自分类Dev

多维数据集未在OpenGL中渲染

来自分类Dev

在OpenGL中以1到1渲染纹理

来自分类Dev

在OpenGL着色器中渲染纹理