问题描述
当我遇到一个没有得到预期结果的问题时,我正在学习 OpenGL 教程。我期待在窗口中看到一个三角形,但结果却是一个空窗口。我对代码进行了许多更改以帮助它在我的机器上运行,但没有解决问题。其中一些更改包括添加:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MInor,3);
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);
为了请求核心配置文件上下文,使用 VBO 添加 VAO,我什至从教程中下载了代码,但无济于事。有人知道解决我的问题的方法吗?
代码:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
static unsigned int CompileShader(unsigned int type,const std::string& source){
unsigned int id = glCreateShader(type);
const char* src = source.c_str();
glShaderSource(id,1,&src,nullptr);
glCompileShader(id);
int result;
glGetShaderiv(id,GL_COMPILE_STATUS,&result);
if(result == GL_FALSE){
int length;
glGetShaderiv(id,GL_INFO_LOG_LENGTH,&length);
char* message = (char*)alloca(length * sizeof(char));
glGetShaderInfoLog(id,length,&length,message);
std::cout << "Failed to compile " << (type == GL_VERTEX_SHADER ? "vertex" : "fragment") << " shader!" << std::endl;
std::cout << message << std::endl;
glDeleteShader(id);
return 0;
}
return id;
}
static unsigned int CreateShader(const std::string& vertexshader,const std::string& fragmentshader){
unsigned int program = glCreateProgram();
unsigned int vs = CompileShader(GL_VERTEX_SHADER,vertexshader);
unsigned int fs = CompileShader(GL_FRAGMENT_SHADER,fragmentshader);
glAttachShader(program,vs);
glAttachShader(program,fs);
glLinkProgram(program);
glValidateProgram(program);
glDeleteShader(vs);
glDeleteShader(fs);
return program;
}
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MInor,3);
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640,480,"Hello World",NULL,NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
if(glewInit() != GLEW_OK){
std::cout << "REEEEEEEEEEE" << std::endl;
}
float vertices[6] = {
-0.5f,-0.5f,0.0f,0.5f,-0.5f
};
unsigned int buf;
glGenBuffers(1,&buf);
glBindBuffer(GL_ARRAY_BUFFER,buf);
glBufferData(GL_ARRAY_BUFFER,6 * sizeof(float),vertices,GL_STATIC_DRAW);
glEnabLevertexAttribArray(0);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,sizeof(float) * 2,0);
std::string vertexshader =
"#version 330 core\n"
"\n"
"in vec4 position;\n"
"out vec4 color;\n"
"\n"
"void main(){\n"
" gl_Position = position;\n"
" color = position;\n"
"}\n";
std::string fragmentshader =
"#version 330 core\n"
"\n"
"in vec4 in_color;\n"
"out vec4 color;\n"
"\n"
"void main(){\n"
" color = in_color;\n"
"}\n";
unsigned int shader = CreateShader(vertexshader,fragmentshader);
gluseProgram(shader);
glClearColor(0.33f,0.33f,1.0f);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES,3);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
CMakeLists:
cmake_minimum_required (VERSION 3.5)
if(POLICY CMP0072)
cmake_policy(SET CMP0072 NEW)
else(NOT POLICY CMP0072)
message(STATUS "Error")
endif(POLICY CMP0072)
project (opengl-learning)
find_package(PkgConfig required)
pkg_search_module(GLFW required glfw3)
include_directories(${GLFW_INCLUDE_Dirs} ${OPENGL_INCLUDE_DIR})
set (GCC_COVERAGE_LINK_FLAGS "-lglfw3 -pthread -ldl -lglu -lGL -lrt -lXrandr -lXxf86vm -lXi -lXinerama -lX11 -lGLEW -lglu -lGL")
add_deFinitions(${GCC_COVERAGE_COMPILE_FLAGS})
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++14")
set (source_dir "${PROJECT_SOURCE_DIR}/src/")
file (GLOB source_files "${source_dir}/*.cpp")
add_executable (opengl-learning ${source_files})
find_package(OpenGL required)
find_package(GLEW required)
target_link_libraries(opengl-learning ${GLFW_LIBRARIES} ${GLEW_LIBRARIES} ${OPENGL_LIBRARIES})
版本(请求核心配置文件)
glGetString(GL_VERSION) >> 3.3 (Core Profile) Mesa 18.3.6
glGetString(GL_SHADING_LANGUAGE_VERSION) >> 3.30
操作系统:Linux Debian 10
如果需要任何额外信息,请随时询问。
解决方法
当您使用核心配置文件 OpenGL Context 时,您必须创建一个 Vertex Array Object:
GLuint vao;
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER,buf);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,sizeof(float) * 2,0);
默认的顶点数组对象 (0) 仅在使用兼容性配置文件 OpenGL 上下文时才有效:
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_COMPAT_PROFILE);
我推荐阅读Vertex Specification。