Я начинаю изучать 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? Правильны ли параметры компиляции?
Первые шаги в программировании OpenGL на виртуальном оборудовании - это ... храбрый, я думаю :). Черный экран звучит очень многообещающе, но сначала убедитесь, что OpenGL корректно работает в Virtual Box, запустив любую из известных для работы предварительно скомпилированную программу. Если это не сработает, это уже не проблема программирования. Следующая проверка здравомыслия устанавливает нечерный glClearColor и делает glClear() каждый кадр ... появляется ли цвет? –
@ Paul-Jan Спасибо за ответ! Установка glClearColor и glClear() на белый позволила увидеть треугольник. Я не понимал, что шейдер фрагмента устанавливает полигон в черный цвет. Я не собираюсь делать много шагов в OpenGL в Virtual Box, это скорее похоже на временное решение, так как мое основное оборудование находится в обслуживании. Но какие бы проблемы у меня были, если бы я настаивал на этом немного больше на виртуальной машине? –
Виртуальные машины превосходны для рабочих нагрузок только для CPU, виртуализация GPU - относительно новое дополнение, а поддержка немного нестабильна, вы можете в конечном итоге с ошибками, которые происходят в виртуальной машине, но отлично работают снаружи. Это может привести к потерянным часам, пытаясь отладить несуществующую проблему в реальном мире. – rlam12