2015-12-19 5 views
0

Я начинаю изучать OpenGL, и я решил использовать Ubuntu 15.10 на VirtualBox для этого. Я установил пакеты меза-синфазный DEV (gl.h), libglew-DEV (glew.h) и libglfw3-DEV (glfw3.h) и после this урока я пришел с этим кодом:Программа OpenGL не рендеринга на Ubuntu с VirtualBox

#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 без ошибок.

Но, когда я запускаю программу, она открывает окно с черным экраном без отображения треугольника. Я попытался выполнить код this, который кто-то опубликовал в комментариях к учебнику, но у меня есть тот же черный экран и не отображаемые полигоны. Является ли проблема с кодом? Пропустил ли я что-то при установке OpenGL? Правильны ли параметры компиляции?

+1

Первые шаги в программировании OpenGL на виртуальном оборудовании - это ... храбрый, я думаю :). Черный экран звучит очень многообещающе, но сначала убедитесь, что OpenGL корректно работает в Virtual Box, запустив любую из известных для работы предварительно скомпилированную программу. Если это не сработает, это уже не проблема программирования. Следующая проверка здравомыслия устанавливает нечерный glClearColor и делает glClear() каждый кадр ... появляется ли цвет? –

+0

@ Paul-Jan Спасибо за ответ! Установка glClearColor и glClear() на белый позволила увидеть треугольник. Я не понимал, что шейдер фрагмента устанавливает полигон в черный цвет. Я не собираюсь делать много шагов в OpenGL в Virtual Box, это скорее похоже на временное решение, так как мое основное оборудование находится в обслуживании. Но какие бы проблемы у меня были, если бы я настаивал на этом немного больше на виртуальной машине? –

+1

Виртуальные машины превосходны для рабочих нагрузок только для CPU, виртуализация GPU - относительно новое дополнение, а поддержка немного нестабильна, вы можете в конечном итоге с ошибками, которые происходят в виртуальной машине, но отлично работают снаружи. Это может привести к потерянным часам, пытаясь отладить несуществующую проблему в реальном мире. – rlam12

ответ

0

Поскольку я не объявлял цвета ни для фона, ни для треугольника, оба по умолчанию были черными. Таким образом, треугольник не был виден, хотя он был визуализирован. Настройка цветов для обоих из них решила проблему.