[英]C++ GLSL shaders: "error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES" or black window
[英]0:1(10): error: GLSL 3.30 is not supported. ubuntu 18.04 c++
我正在嘗試使用openGL GLFW庫在窗口上繪制一個三角形。 這是我完整的代碼
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
using namespace std;
static unsigned int compileShader ( unsigned int type, const string& source ){
unsigned int id = glCreateShader ( type );
const char* src = source.c_str();
glShaderSource ( id, 1, &src, nullptr );
glCompileShader ( id );
int result = 0;
glGetShaderiv ( id, GL_COMPILE_STATUS, &result );
if ( result == GL_FALSE ){
int length = 0;
glGetShaderiv ( id, GL_INFO_LOG_LENGTH, &length );
char* message = ( char* ) alloca ( length * sizeof ( char ) );
glGetShaderInfoLog ( id, length, &length, message );
cout << "Failed to compile " << ( type == GL_VERTEX_SHADER ? "vertex" : "fragment" ) << "shader" << endl;
cout << message << endl;
glDeleteShader ( id );
}
return id;
}
static int createShader ( const string& vertexShader, const 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;
/* 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 )
cout << "error" << endl;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
cout << glGetString ( GL_VERSION ) << endl;
float positions [ 6 ] = {
-0.5f, -0.5f,
0.0f, 0.5f,
0.5f, -0.5f
};
unsigned int buffer;
glGenBuffers ( 1, &buffer );
glBindBuffer ( GL_ARRAY_BUFFER, buffer );
glBufferData ( GL_ARRAY_BUFFER, 6 * sizeof ( float ),positions, GL_STATIC_DRAW );
glEnableVertexAttribArray ( 0 );
glVertexAttribPointer ( 0, 2, GL_FLOAT, GL_FALSE, sizeof ( float ) * 2, 0 );
string vertexShader =
"#version 320 core\n"
"\n"
"layout ( location = 0 ) in vec4 position;"
"\n"
"void main(){\n"
"gl_Position = position;\n"
"}\n";
string fragmentShader =
"#version 320 core\n"
"\n"
"layout ( location = 0 ) out vec4 color;"
"\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;
}
這是我得到的輸出
3.0 Mesa 18.0.5
Failed to compile vertexshader
0:1(10): error: GLSL 3.20 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, 3.00 ES, 3.10 ES, and 3.20 ES
Failed to compile fragmentshader
0:1(10): error: GLSL 3.20 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, 3.00 ES, 3.10 ES, and 3.20 ES
我已經為此工作了一整天,找不到任何解決方案。 我是openGL編程的新手,這是我的第一次嘗試。 我正在使用ubuntu 18.04
這是sudo glxinfo | grep "OpenGL"
的輸出sudo glxinfo | grep "OpenGL"
sudo glxinfo | grep "OpenGL"
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) HD Graphics 620 (Kaby Lake GT2)
OpenGL core profile version string: 4.5 (Core Profile) Mesa 18.0.5
OpenGL core profile shading language version string: 4.50
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 18.0.5
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 18.0.5
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:
如果有人可以幫助我,將不勝感激,謝謝
多個問題:
#version 320
從未存在,它從GL 3.2的#version 150
變為GL 3.3的#version 330
。 glfwWindowHint()
調用S 前 glfwCreateWindow()
它們只會影響下一個 glfwCreateWindow()
因此在創建窗口后調用它們對您沒有多大作用。 glEnableVertexAttribArray()
和glVertexAttribPointer()
做任何有用的事情之前,您需要綁定一個
全部一起:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
using namespace std;
static unsigned int compileShader( unsigned int type, const string& source )
{
unsigned int id = glCreateShader( type );
const char* src = source.c_str();
glShaderSource( id, 1, &src, nullptr );
glCompileShader( id );
int result = 0;
glGetShaderiv( id, GL_COMPILE_STATUS, &result );
if( result == GL_FALSE )
{
int length = 0;
glGetShaderiv( id, GL_INFO_LOG_LENGTH, &length );
char* message = (char*)alloca( length * sizeof( char ) );
glGetShaderInfoLog( id, length, &length, message );
cout << "Failed to compile " << ( type == GL_VERTEX_SHADER ? "vertex" : "fragment" ) << "shader" << endl;
cout << message << endl;
glDeleteShader( id );
}
return id;
}
static int createShader( const string& vertexShader, const 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 )
cout << "error" << endl;
cout << glGetString( GL_VERSION ) << endl;
GLuint vao = 0;
glCreateVertexArrays( 1, &vao );
glBindVertexArray( vao );
string vertexShader =
"#version 330 core\n"
"\n"
"layout ( location = 0 ) in vec4 position;"
"\n"
"void main(){\n"
"gl_Position = position;\n"
"}\n";
string fragmentShader =
"#version 330 core\n"
"\n"
"layout ( location = 0 ) out vec4 color;"
"\n"
"void main(){\n"
"color = vec4(1.0,0.0,0.0,1.0);\n"
"}\n";
unsigned int shader = createShader( vertexShader, fragmentShader );
glUseProgram( shader );
float positions[ 6 ] = {
-0.5f, -0.5f,
0.5f, -0.5f,
0.0f, 0.5f,
};
unsigned int buffer;
glGenBuffers( 1, &buffer );
glBindBuffer( GL_ARRAY_BUFFER, buffer );
glBufferData( GL_ARRAY_BUFFER, 6 * sizeof( float ), positions, GL_STATIC_DRAW );
glEnableVertexAttribArray( 0 );
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, sizeof( float ) * 2, 0 );
/* 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;
}
我通過在linux上運行以下命令解決了該問題:
export MESA_GL_VERSION_OVERRIDE=3.3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.