使用核心 OpenGL 版本
Use core OpenGL version
我在 glsl 中编写一个着色器,当我 运行 遇到一个问题,我需要的功能在我使用的版本中不可用。我 运行 glxinfo | grep 'OpenGL'
得到了这个输出:
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Sandybridge Mobile
OpenGL core profile version string: 3.3 (Core Profile) Mesa 18.3.6
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 18.3.6
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 18.3.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
根据输出,我可以访问 OpenGL 核心 3.3 和 GLSL 核心 3.30,如下所示:
OpenGL core profile version string: 3.3 (Core Profile) Mesa 18.3.6
OpenGL core profile shading language version string: 3.30
唯一的问题是,每当我尝试使用 GLSL 核心 330 时,都会收到一条错误消息:
GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES
.
我正在使用 GLFW 创建 OpenGL 上下文。创建上下文的行是:glfwMakeContextCurrent(window);
有谁知道允许我访问 OpenGL 核心或以某种方式更新驱动程序以使我能够访问更高版本的 OpenGL 的方法吗?
____________________________________________________________________________
额外信息:
格式:Code : output
glGetString(GL_VERSION) : 3.0 Mesa 18.3.6
glGetString (GL_SHADING_LANGUAGE_VERSION) : 1.30
着色器:
vertex shader:
#version 330 core
layout(location = 0) in vec4 position;
void main(){
gl_Position = position;
};
fragment shader:
#version 330 core
layout(location = 0) out vec4 color;
void main(){
color = vec4(1.0, 0.0, 0.0, 1.0);
};
这是我正在尝试的代码 运行:
#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_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;
}
std::cout << glGetString(GL_VERSION) << std::endl;
std::cout << glGetString (GL_SHADING_LANGUAGE_VERSION) << std::endl;
float vertices[6] = {
-0.5f, -0.5f,
0.0f, 0.5f,
-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(buf); // try replacing buf with 0
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
std::string vertexshader =
"#version 330 core\n"
"\n"
"layout(location = 0) in vec4 position;\n"
"\n"
"void main(){\n"
" gl_Position = position;\n"
"}\n";
std::string fragmentshader =
"#version 330 core\n"
"\n"
"out vec4 color;\n"
"\n"
"void main(){\n"
" color = vec4(1.0, 0.0, 0.0, 1.0);\n"
"}\n";
unsigned int shader = CreateShader(vertexshader, fragmentshader);
glUseProgram(shader);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
OS: LINUX DEBIAN
通过添加
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
在 window 创建之前,我能够让它工作。
如果您不知道 MAJOR 和 MINOR 是什么意思,请看这里:
TLDR:
“主要”和“次要”是单个版本号的两个组成部分,以点分隔。
因此,将主要版本和次要版本都设置为 3,我就能够请求 OpenGL 3.3 Core Profile。
现在当我 运行:
std::cout << glGetString(GL_VERSION) << std::endl;
std::cout << glGetString (GL_SHADING_LANGUAGE_VERSION) << std::endl;
我得到:
3.3 (Core Profile) Mesa 18.3.6
3.30
我在 glsl 中编写一个着色器,当我 运行 遇到一个问题,我需要的功能在我使用的版本中不可用。我 运行 glxinfo | grep 'OpenGL'
得到了这个输出:
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Sandybridge Mobile
OpenGL core profile version string: 3.3 (Core Profile) Mesa 18.3.6
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 18.3.6
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 18.3.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
根据输出,我可以访问 OpenGL 核心 3.3 和 GLSL 核心 3.30,如下所示:
OpenGL core profile version string: 3.3 (Core Profile) Mesa 18.3.6
OpenGL core profile shading language version string: 3.30
唯一的问题是,每当我尝试使用 GLSL 核心 330 时,都会收到一条错误消息:
GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES
.
我正在使用 GLFW 创建 OpenGL 上下文。创建上下文的行是:glfwMakeContextCurrent(window);
有谁知道允许我访问 OpenGL 核心或以某种方式更新驱动程序以使我能够访问更高版本的 OpenGL 的方法吗?
____________________________________________________________________________
额外信息:
格式:Code : output
glGetString(GL_VERSION) : 3.0 Mesa 18.3.6
glGetString (GL_SHADING_LANGUAGE_VERSION) : 1.30
着色器:
vertex shader:
#version 330 core
layout(location = 0) in vec4 position;
void main(){
gl_Position = position;
};
fragment shader:
#version 330 core
layout(location = 0) out vec4 color;
void main(){
color = vec4(1.0, 0.0, 0.0, 1.0);
};
这是我正在尝试的代码 运行:
#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_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;
}
std::cout << glGetString(GL_VERSION) << std::endl;
std::cout << glGetString (GL_SHADING_LANGUAGE_VERSION) << std::endl;
float vertices[6] = {
-0.5f, -0.5f,
0.0f, 0.5f,
-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(buf); // try replacing buf with 0
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
std::string vertexshader =
"#version 330 core\n"
"\n"
"layout(location = 0) in vec4 position;\n"
"\n"
"void main(){\n"
" gl_Position = position;\n"
"}\n";
std::string fragmentshader =
"#version 330 core\n"
"\n"
"out vec4 color;\n"
"\n"
"void main(){\n"
" color = vec4(1.0, 0.0, 0.0, 1.0);\n"
"}\n";
unsigned int shader = CreateShader(vertexshader, fragmentshader);
glUseProgram(shader);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
OS: LINUX DEBIAN
通过添加
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
在 window 创建之前,我能够让它工作。
如果您不知道 MAJOR 和 MINOR 是什么意思,请看这里:
TLDR: “主要”和“次要”是单个版本号的两个组成部分,以点分隔。
因此,将主要版本和次要版本都设置为 3,我就能够请求 OpenGL 3.3 Core Profile。
现在当我 运行:
std::cout << glGetString(GL_VERSION) << std::endl;
std::cout << glGetString (GL_SHADING_LANGUAGE_VERSION) << std::endl;
我得到:
3.3 (Core Profile) Mesa 18.3.6
3.30