OpenGL不在Linux中绘制



几天来我一直在尝试解决这个问题,但除了用 glfw 替换 sfml 之外,没有其他任何地方。

我首先尝试在OpenGL中使用sfml,但它没有绘制。这就是为什么我尝试使用 glfw 代替。

glsl 文件和主.cpp文件没有错误。

这段代码(但修改较少,因为用glfw替换了sfml(实际上适用于我的其他Windows PC。

现在我正在使用Linux,因为我的另一台PC需要更换主板。 更改"背景"的颜色适用于glClearColor,但绘图则不然。

该程序应该有一个旋转并具有纹理的立方体。 我实际上正在学习OpenGL atm。

我在终端而不是代码块中编译并运行了程序。 并不是说它真的有帮助,而只是提供信息。

感谢您的任何帮助:)

主文件

#include <GL/glew.h>
#include <glfw3.h>
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <chrono>
#include <SOIL.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
void bindBufferData(GLfloat* vertices, GLuint& vbo);
GLuint createShaderProgam(const GLchar* vertexShaderText, const 
GLchar* fragmentShaderText);
std::string loadFileContent(const std::string filepath);
static void glfwerror(int id, const char* description);
int main()
{
int width = 600, height = 600;
if(!glfwInit())
{
std::cout << "Initialization failed" << std::endl;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_DOUBLEBUFFER, 1);
glfwWindowHint(GLFW_DEPTH_BITS, 24);
glfwSetErrorCallback(&glfwerror);
GLFWwindow* window = glfwCreateWindow(width, height, "OpenGL", 
NULL, NULL);
if(!window)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glewExperimental = true;
if (glewInit() != GLEW_OK)
{
std::cout << "failed to initialize: " << 
glewGetErrorString(glewInit()) << std::endl;
}
std::cout << "OpenGL ver: " << glGetString(GL_VERSION) << 
std::endl;
std::cout << "GLSL ver: " << 
glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
float vertices[] = {
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
-0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
-0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
-0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
-0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
-0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
-0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
-0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
-0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
-0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
-0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
-0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
-0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f
};
std::string vertexShaderText = 
loadFileContent("shader.vert.glsl");
std::string fragmentShaderText = 
loadFileContent("shader.frag.glsl");
GLuint shaderProgram = 
createShaderProgam(vertexShaderText.c_str(), 
fragmentShaderText.c_str());
glUseProgram(shaderProgram);
GLuint ebo;
GLuint vbo;
GLuint vao;
GLuint tex;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, 
GL_STATIC_DRAW);
glGenBuffers(1, &ebo);
GLuint elements[]{
0, 1, 2,
2, 3, 0
};
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, 
GL_STATIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
glGenVertexArrays(0, &vao);
glBindVertexArray(vao);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), 
(GLvoid*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), 
(GLvoid*)(3*sizeof(float)));
glEnableVertexAttribArray(1);
GLint texAttrib = glGetAttribLocation(shaderProgram, "texcoord");
glEnableVertexAttribArray(texAttrib);
glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 8 * 
sizeof(float), (GLvoid*)(6 * sizeof(float)));
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
int S_width, S_height;
unsigned char* image = SOIL_load_image("unity_preview_02-.jpeg", 
&S_width, &S_height, 0, SOIL_LOAD_RGB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, S_width, S_height, 0, 
GL_RGB, GL_UNSIGNED_BYTE, image);
SOIL_free_image_data(image);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 
GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 
GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glm::mat4 view = glm::lookAt(
glm::vec3(2.2f, 2.2f, 1.5f),
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 0.0f, 1.0f)
);
GLint uniView = glGetUniformLocation(shaderProgram, "view");
glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(view));
glm::mat4 proj = glm::perspective(glm::radians(45.0f), 800.0f / 
600.0f, 1.0f, 20.0f);
GLuint uniProj = glGetUniformLocation(shaderProgram, "proj");
glUniformMatrix4fv(uniProj, 1, GL_FALSE, glm::value_ptr(proj));
glm::mat4 transf = glm::mat4(1.0f);
GLint unitransf = glGetUniformLocation(shaderProgram, "transf");
glEnable(GL_DEPTH_TEST);
glm::vec4 resultRot = transf * glm::vec4(1.0f, 0.0f, 0.0f, 1.0f);
printf("%f, %f, %fn", resultRot.x, resultRot.y, resultRot.z);
auto t_start = std::chrono::high_resolution_clock::now();
GLfloat angle = -60.0f;
GLfloat speed = 0.0f;
GLfloat y = 0.5f;
GLfloat x = 0.5f;
GLfloat z = 1.5f;
while(!glfwWindowShouldClose(window))
{
glLoadIdentity();
glClearColor(0.0f, 1.0f, 0.7f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Setup view
float Ratio;
glfwGetFramebufferSize(window, &width, &height);
Ratio = width / (float)height;
glViewport(0, 0, width, height);
auto t_now = std::chrono::high_resolution_clock::now();
float time = 
std::chrono::duration_cast<std::chrono::duration<float>>(t_now 
- t_start).count();
t_start = t_now;
transf = glm::rotate(transf, time * glm::radians(angle), 
glm::vec3(x, y, z));
glUniformMatrix4fv(unitransf, 1, GL_FALSE, 
glm::value_ptr(transf));
z += 10 * time;
x += 5 * time;
y -= 5 * time;
//std::cout << x << ", " << y << ", " << z << std::endl;
glColor4f(1.0f, 0.0f, 1.0f, 1.0f);
glDrawArrays(GL_TRIANGLES, 0, 36);
//swap buffer and check for events
glfwSwapBuffers(window);
glfwPollEvents();
}
//sf::sleep(sf::milliseconds(2));
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
}
static void glfwerror(int id, const char* description)
{
std::cout << description << std::endl;
}
void bindBufferData(GLfloat* vertices, GLuint& vbo)
{
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, 
GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
GLuint createShaderProgam(const GLchar* vertexShaderText, const 
GLchar* fragmentShaderText)
{
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
GLuint shaderProgram = glCreateProgram();
glShaderSource(vertexShader, 1, &vertexShaderText, nullptr);
glCompileShader(vertexShader);
GLint succes;
GLchar infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &succes);
if(!succes)
{
glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
std::cout << "failed to compile vertex shader: " << infoLog << 
std::endl;
}
glShaderSource(fragmentShader, 1, &fragmentShaderText, nullptr);
glCompileShader(fragmentShader);
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &succes);
if (!succes)
{
glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
std::cout << "failed to compile fragment shader: " << infoLog 
<< std::endl;
}
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &succes);
if(!succes)
{
glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
std::cout << "failed to link program: " << infoLog << 
std::endl;
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
return shaderProgram;
}
std::string loadFileContent(const std::string filepath)
{
std::ifstream file(filepath);
std::stringstream sstream;
if(!file.is_open())
{
std::cout << "could not find file: " << filepath << std::endl;
}
sstream << file.rdbuf();
return sstream.str();
}

片段着色器

#version 450 core
in vec3 vertexColor;
in vec2 Texcoord;
out vec4 outcolor;
uniform sampler2D tex;
void main()
{
outcolor = texture(tex, Texcoord) * vec4(vertexColor, 1.0);
}

顶点着色器

#version 450 core
layout (location = 0)
in vec3 pos;
layout (location = 1)
in vec3 col;
in vec2 texcoord;
out vec3 vertexColor;
out vec2 Texcoord;
uniform mat4 transf;
uniform mat4 proj;
uniform mat4 view;
void main()
{
Texcoord = texcoord;
vertexColor = col;
gl_Position = proj * view * transf * vec4(pos, 1.0);
}

在 Linux 终端中键入 glxinfo | grep 'version'

输出:

server glx version string: 1.4
client glx version string: 1.4
GLX version: 1.4
Max core profile version: 4.
Max compat profile version: 3.0
Max GLES1 profile version: 1.1
Max GLES[23] profile version: 3.1
OpenGL core profile version string: 4.5 (Core Profile) Mesa 17.2.4
OpenGL core profile shading language version string: 4.50
OpenGL version string: 3.0 Mesa 17.2.4
OpenGL shading language version string: 1.30
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 17.2.4
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 
3.10

乌班图版本

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.3 LTS
Release:    16.04
Codename:   xenial

你的代码不应该真正适用于符合标准的 GL 实现。添加glGetError()@HolyBlackCat suggeded 将导致一些错误,例如,您正在使用已弃用的 GL 调用,如glEnableClientState()glLoadIdentity()等 - 所有这些都在核心配置文件中不可用。

实际上,我不建议添加glGetError()调用。由于使用 GL 4.5,因此可以直接使用调试上下文。对于发生的每个错误,您都会收到人类阅读的文本消息(以及一些或多或少有用的提示(。

我在您的代码中看到的主要问题之一是这个问题:

glGenVertexArrays(0, &vao);

您实际上是在没有 VAO 的情况下渲染的 - 这在核心配置文件中是强制性的。要求 GL 创建VAO 不会得到任何东西,然后只是将一些未初始化的变量绑定为 VAO 也不是一个好主意。

最新更新