不支持 GLSL 330 内核

GLSL 330 core not supported

本文关键字:内核 GLSL 不支持      更新时间:2023-10-16

所以我基本上是OpenGL的初学者,我试图创建自己的着色器来形成一个简单的三角形。在此过程中,我使用 SDL 创建了窗口(如您所附的屏幕截图所示,它已成功加载),即使本教程使用了 glfw3 并且很高兴(我不得不求助于 SDL,因为我无法有效地包含后者的库)。它一直给我以下错误

"不支持 GLSL。支持的版本有: 1.10, 1.20, 1.30, ...3.20 ES"

SDL 是问题的原因吗?

操作系统: 乌班图 18.04; IDE:代码块;

主.cpp

#include <iostream>
#include <SDL2/SDL.h>
#include <GL/glew.h>
#include "display.h"
using namespace std;
const char *vertexShaderSource = "#version 330 coren"
"layout (location = 0) in vec3 aPos;n"
"void main()n"
"{n"
"gl_Position = vec4(aPos.x,aPos.y,aPos.z,1.0f)n"
"}";
const char *fragmentShaderSource = "#version 330 coren"
"out vec4 FragColor;n"
"void main()n"
"{n"
"FragColor = vec4(1.0f,0.5f,0.2f,1.0f);n"
"}";
int main()
{
Display display(800,600,"Moiz");
while(!display.isClosed())
{
glClearColor(0.0f,0.15f,0.3f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
display.Update();
int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1 , &vertexShaderSource, NULL);
glCompileShader(vertexShader);
int success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILEDn" << infoLog << std::endl;
}
int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource,NULL);
glCompileShader(fragmentShader);
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILEDn" << infoLog << std::endl;
}
}
return 0;
}

显示.cpp

#include <iostream>
#include <string>
#include <SDL2/SDL.h>
#include <GL/glew.h>
#include "display.h"
using namespace std;
Display::Display(int width, int height,const string &title)
{
SDL_Init(SDL_INIT_EVERYTHING);

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
m_window = SDL_CreateWindow(title.c_str(),SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,width,height,SDL_WINDOW_OPENGL);
m_glContext = SDL_GL_CreateContext(m_window);
GLenum status = glewInit();
if(status != GLEW_OK)
{
std::cerr << "GLEW FAILED TO INITIALIZE" << endl;
}
}
bool Display::isClosed(){
return m_isClosed;
}
void Display::Update()
{
SDL_GL_SwapWindow(m_window);
SDL_Event e;
while(SDL_PollEvent(&e))
{
if(e.type == SDL_QUIT)
{
m_isClosed = true;
}
}
}
Display::~Display()
{
SDL_GL_DeleteContext(m_glContext);
SDL_DestroyWindow(m_window);
SDL_Quit();
}
Display::Display(const Display& other)
{
//copy ctor
}
Display& Display::operator=(const Display& rhs)
{
if (this == &rhs) return *this; // handle self assignment
//assignment operator
return *this;
}

:错误图像

错误屏幕截图

  • 顶点着色器中vec4后缺少分号
  • 如果您正在使用Mesa,请注意(历史上;在过去的几周/几个月中,某些驱动程序的情况一直在变化),如果您请求核心上下文,它只会分发GL上下文>3.0。 您可以使用SDL_GL_SetAttribute()发出SDL_CreateWindow()请求:

    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 3 );
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE );
    

总而言之(这就是我所说的MCVE:单个文件,仅取决于SDL/GLEW/GLM/GLFW)等知名库):

#include <iostream>
#include <SDL2/SDL.h>
#include <GL/glew.h>
#include <iostream>
#include <string>
class Display
{
public:
Display( int width, int height, const std::string &title )
: m_isClosed( false )
{
SDL_Init( SDL_INIT_EVERYTHING );
SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_BUFFER_SIZE, 32 );
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 3 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE );
m_window = SDL_CreateWindow
(
title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
width, height,
SDL_WINDOW_OPENGL
);
m_glContext = SDL_GL_CreateContext( m_window );
GLenum status = glewInit();
if( status != GLEW_OK )
{
std::cerr << "GLEW FAILED TO INITIALIZE" << std::endl;
}
}
bool isClosed()
{
return m_isClosed;
}
void Update()
{
SDL_GL_SwapWindow( m_window );
SDL_Event e;
while( SDL_PollEvent( &e ) )
{
if( e.type == SDL_QUIT )
{
m_isClosed = true;
}
}
}
~Display()
{
SDL_GL_DeleteContext( m_glContext );
SDL_DestroyWindow( m_window );
SDL_Quit();
}
Display( const Display& other )
{
//copy ctor
}
Display& operator=( const Display& rhs )
{
if( this == &rhs ) return *this; // handle self assignment
//assignment operator
return *this;
}
private:
SDL_Window* m_window;
SDL_GLContext m_glContext;
bool m_isClosed;
};
const char *vertexShaderSource = "#version 330 coren"
"layout (location = 0) in vec3 aPos;n"
"void main()n"
"{n"
"gl_Position = vec4(aPos.x,aPos.y,aPos.z,1.0f);n"
"}";
const char *fragmentShaderSource = "#version 330 coren"
"out vec4 FragColor;n"
"void main()n"
"{n"
"FragColor = vec4(1.0f,0.5f,0.2f,1.0f);n"
"}";
int main( int argc, char** argv )
{
Display display( 800, 600, "Moiz" );
while( !display.isClosed() )
{
glClearColor( 0.0f, 0.15f, 0.3f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT );
display.Update();
int vertexShader = glCreateShader( GL_VERTEX_SHADER );
glShaderSource( vertexShader, 1, &vertexShaderSource, NULL );
glCompileShader( vertexShader );
int success;
char infoLog[ 512 ];
glGetShaderiv( vertexShader, GL_COMPILE_STATUS, &success );
if( !success )
{
glGetShaderInfoLog( vertexShader, 512, NULL, infoLog );
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILEDn" << infoLog << std::endl;
}
int fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
glShaderSource( fragmentShader, 1, &fragmentShaderSource, NULL );
glCompileShader( fragmentShader );
glGetShaderiv( fragmentShader, GL_COMPILE_STATUS, &success );
if( !success )
{
glGetShaderInfoLog( fragmentShader, 512, NULL, infoLog );
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILEDn" << infoLog << std::endl;
}
}
return 0;
}

此外,请确保检查SDL_CreateWindow()SDL_GL_CreateContext()返回有效值。