C++ OpenGL程序是';使用VirtualBox在Ubuntu上进行t渲染
我开始学习OpenGL,我决定在VirtualBox上使用Ubuntu15.10来实现这一点。我安装了mesa common dev(gl.h)、libglew dev(glew.h)和libglfw3 dev(glfw3.h)软件包,在下面的教程中,我产生了以下代码:C++ OpenGL程序是';使用VirtualBox在Ubuntu上进行t渲染,c++,opengl,glfw,glew,ubuntu-15.10,C++,Opengl,Glfw,Glew,Ubuntu 15.10,我开始学习OpenGL,我决定在VirtualBox上使用Ubuntu15.10来实现这一点。我安装了mesa common dev(gl.h)、libglew dev(glew.h)和libglfw3 dev(glfw3.h)软件包,在下面的教程中,我产生了以下代码: #define GLEW_STATIC #include <GL/glew.h> #include <GLFW/glfw3.h> #include <iostream> using nam
#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;
}
#定义GLEW#U静态
#包括
#包括
#包括
使用名称空间std;
常量GLchar*顶点源=
“#版本130\n”
“处于vec2位置;”
“void main(){”
“gl_位置=向量4(位置,0.0,1.0);”
"}";
常量GLchar*碎片源=
“#版本130\n”
“out vec4 OUTCLOR;”
“均匀vec3三角形颜色;”
“void main(){”
outColor=vec4(三角形颜色,1.0)
"}";
int main(int argc,char*argv[]){
//GLFW初始化
如果(!glfwInit()){
cout因为我既没有为背景也没有为三角形声明颜色,它们默认都是黑色的。因此,三角形在渲染时不可见。为它们设置颜色解决了问题。在虚拟硬件上进行OpenGL编程的第一步是……勇敢的,我想:)。black screen听起来很有希望,但首先,通过运行任何已知的可工作预编译程序,确保OpenGL在虚拟框中正常工作。如果不起作用,则不再是编程问题。下一个健全性检查是设置非黑色glClearColor并执行glClear()每帧…颜色是否显示?@Paul Jan感谢您的回答!设置glClearColor和glClear()使用白色可以看到三角形。我没有意识到碎片着色器将多边形设置为黑色。我不打算在虚拟盒上对OpenGL进行太多操作,这更像是一个临时解决方案,因为我的主要硬件正在维护中。但是如果我在virt中坚持使用它更长一点,我会遇到什么问题ual machine?虚拟机对于仅CPU的工作负载非常出色,GPU虚拟化是一个相对较新的添加,而且支持有点不稳定,您可能会在虚拟机中遇到错误,但在外部运行良好。这可能会导致在实际环境中调试不存在的问题时损失数小时world@rlam12我明白了,谢谢你的邀请回答,这帮了大忙!:)