【发布时间】: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