【问题标题】:OpenGL program isn't rendering on Ubuntu with VirtualBoxOpenGL 程序没有在带有 VirtualBox 的 Ubuntu 上渲染
【发布时间】:2015-12-19 05:33:36
【问题描述】:

我开始学习 OpenGL,我决定在 VirtualBox 上使用 Ubuntu 15.10 来做到这一点。我安装了包 mesa-common-dev (gl.h)、libglew-dev (glew.h) 和 libglfw3-dev (glfw3 .h) 并遵循this 教程,我想出了这段代码:

#define GLEW_STATIC

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

using namespace std;

const GLchar* vertexSource =
    "#version 130\n"
    "in vec2 position;"
    "void main() {"
    "    gl_Position = vec4(position, 0.0, 1.0);"
    "}";

const GLchar* fragmentSource =
    "#version 130\n"
    "out vec4 outColor;"
    "uniform vec3 triangleColor;"
    "void main() {"
    "    outColor = vec4(triangleColor, 1.0);"
    "}";

int main(int argc, char *argv[]) {
    // GLFW initialization
    if (!glfwInit()) {
        cout << "Failed to initialize GLFW." << endl;
        return -1;

    }
    cout << "GLFW initialized." << endl;

    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    cout << "Window and context created." << endl;

    // GLEW initialization
    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK) {
        cout << "Failed to initialize GLEW." << endl;
        return -1;

    }
    cout << "GLEW initialized." << endl;

    GLfloat vertices[] = {
         0.0f,  0.5f,
         0.5f, -0.5f,
        -0.5f, -0.5f
    };

    // Create Vertex Array Object
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    cout << "VAO created and binded." << endl;

    //Vertex Buffer Object
    GLuint vbo;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    cout << "VBO created and binded." << endl;

    // Create and compile the vertex shader
    GLint status;
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexSource, NULL);
    glCompileShader(vertexShader);
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status);

    if (!status) {
        // Vertex shader error handling
        char errorLog[512];
        glGetShaderInfoLog(vertexShader, 512, NULL, errorLog);

        cout << errorLog << endl;
        glfwTerminate();
        return -1;
    }
    cout << "Vertex shader created and compiled." << endl;

    // Create and compile the fragment shader
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
    glCompileShader(fragmentShader);
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status);

    if (!status) {
        // Fragment shader error handling
        char errorLog[512];
        glGetShaderInfoLog(fragmentShader, 512, NULL, errorLog);

        cout << errorLog << endl;
        glfwTerminate();
        return -1;
    }
    cout << "Fragment shader created and compiled." << endl;

    // Link the vertex and fragment shader into a shader program
    GLuint shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glBindFragDataLocation(shaderProgram, 0, "outColor");
    glLinkProgram(shaderProgram);
    glUseProgram(shaderProgram);
    cout << "Shaders linked." << endl;

    // Specify the layout of the vertex data
    GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
    glEnableVertexAttribArray(posAttrib);
    glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
    cout << "Layout of the vertex data specified." << endl;

    while( !glfwWindowShouldClose(window) ) {
        glDrawArrays(GL_TRIANGLES, 0, 3);

        if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
            glfwSetWindowShouldClose(window, GL_TRUE);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // Prepare to close the application
    glDeleteProgram(shaderProgram);
    glDeleteShader(fragmentShader);
    glDeleteShader(vertexShader);
    glDeleteBuffers(1, &vbo);
    glDeleteBuffers(1, &vao);
    glfwTerminate();

    return 0;
}

我将它编译为g++ test.cpp -o test -lglfw -lGLEW -lGL,没有错误。

但是,当我执行程序时,它会打开一个黑屏的窗口,而不渲染三角形。我试图执行有人在教程的 cmets 上发布的 this 代码,但我得到了相同的黑屏并且没有渲染多边形。是代码的问题吗?设置 OpenGL 时我错过了什么吗?编译参数是否正确?

【问题讨论】:

  • 在虚拟硬件上开始 OpenGL 编程的第一步是……勇敢,我猜 :)。黑屏听起来很有希望,但首先,通过运行任何已知可以工作的预编译程序来确保 OpenGL 在 Virtual Box 中正常工作。如果这不起作用,则不再是编程问题。下一个健全性检查是设置非黑色 glClearColor 并在每帧执行 glClear() ......颜色是否显示?
  • @Paul-Jan 感谢您的回答!将 glClearColor 和 glClear() 设置为白色可以看到三角形。我没有意识到片段着色器将多边形设置为黑色。我不打算在 Virtual Box 上对 OpenGL 采取很多步骤,它更像是一个临时解决方案,因为我的主要硬件正在维护中。但是如果我在虚拟机中坚持使用它的时间长一点,我会有什么问题呢?
  • 虚拟机非常适合仅使用 CPU 的工作负载,GPU 虚拟化是一个相对较新的添加,并且支持有点不稳定,您最终可能会遇到错误仅发生在 VM 中但在外部运行良好。这可能会导致在尝试调试现实世界中不存在的问题时浪费时间
  • @rlam12 我明白了.. 感谢您的回答,它帮助了很多! :)

标签: c++ opengl glfw glew ubuntu-15.10


【解决方案1】:

由于我既没有为背景也没有为三角形声明颜色,所以默认情况下它们都是黑色的。因此,尽管正在渲染三角形,但它是不可见的。为它们设置颜色解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2021-05-14
    • 2015-08-12
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多