我正在用OpenGL和SDL 2在屏幕上画一个三角形。
我的问题在于着色器编译阶段。
以下是我得到的错误:
错误::SHADER::VERTEX::COMPILATION_FAILURE 0:1(10):错误:不支持GLSL 3.30。支持的版本为:1.10、1.20、1.30、1.40、1.00 ES和3.00 ES
错误::SHADER::FRAGMENT::COMPILATION_FAILURE 0:1(10):错误:不支持GLSL 3.30。支持的版本为:1.10、1.20、1.30、1.40、1.00 ES和3.00 ES
错误::SHADER::SHADER::LINKING_FANUS错误:与未编译/未专用着色器链接错误:与未编译/未专用着色器链接
我在一些论坛上看到人们有相同的错误消息,他们被告知默认情况下梅萨将切换到兼容性配置文件而不是核心配置文件,但问题是我已经明确告诉SDL 2创建核心上下文配置文件:
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
字符串
顺便说一句,我已经在同一台计算机上使用了OpenGL 3.30和GLSL 3.30,通过使用GLFW和GLAD没有任何问题,但现在我只想让它与SDL 2和GLEW一起工作。
下面是glxinfo | grep "version"
命令的结果:
server glx version string: 1.4
client glx version string: 1.4
GLX version: 1.4
Max core profile version: 3.3
Max compat profile version: 3.1
Max GLES1 profile version: 1.1
Max GLES[23] profile version: 3.1
OpenGL core profile version string: 3.3 (Core Profile) Mesa 19.1.7
OpenGL core profile shading language version string: 3.30
OpenGL version string: 3.1 Mesa 19.1.7
OpenGL shading language version string: 1.40
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 19.1.7
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.10
GL_EXT_shader_implicit_conversions, GL_EXT_shader_integer_mix,
型
和我的主要功能的内容:
int main(int argc, char* argv[])
{
// =====> INIT VARS
SDL_Window* window;
SDL_Renderer* renderer;
SDL_GLContext glContext;
GLenum err;
// INIT VARS <=====
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
std::cout << SDL_GetError() << std::endl;
return -1;
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
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_DEPTH_SIZE, 24);
window = createWindow(WIDTH, HEIGHT, "TP_PROGRAMMATION_3D");
if(window == nullptr)
{
std::cout << SDL_GetError() << std::endl;
SDL_Quit();
return -1;
}
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if(renderer == nullptr)
{
std::cout << SDL_GetError() << std::endl;
SDL_DestroyWindow(window);
SDL_Quit();
return -1;
}
// OPENGL CONTEXT FOR THE WINDOW
glContext = SDL_GL_CreateContext(window);
// GLEW INIT
err = glewInit();
if(err != GLEW_OK)
{
std::cout << glewGetErrorString(err) << std::endl;
SDL_GL_DeleteContext(glContext);
SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window);
SDL_Quit();
return -1;
}
// EVERYTHING'S FINE : TIME TO PAINT IT GREY
glViewport(0, 0, WIDTH, HEIGHT);
SDL_GL_SetSwapInterval(1);
glClearColor(Color::LIGHT_GREY[0], Color::LIGHT_GREY[1], Color::LIGHT_GREY[2], Color::LIGHT_GREY[3]);
// OPENGL DRAWING CALLS AND MAIN DRAWING LOOP
draw_gl(window);
// END
SDL_GL_DeleteContext(glContext);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
型
着色器代码:
const char* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}";
const char* fragmentShaderSource = "#version 330 core\n"
"out vec4 color;\n"
"void main()\n"
"{\n"
" color = vec4(1.0f, 1.0f, 0.0f, 1.0f);\n"
"}";
型
2条答案
按热度按时间gxwragnw1#
好吧,我得到了它的工作,但老实说,我不知道为什么它的工作,现在与我所做的小变化,因为它似乎是几乎相同的事情。
代码如下:
字符串
vlju58qv2#
对于仍然遇到这个问题的人,因为OP不确定到底发生了什么变化:
我发现在MacOS Ventura上,我必须在 * 运行SDL_Init之前指定Major/Minor *,并且必须在 * 之后设置配置文件掩码。尝试在init之后设置版本将导致无法绑定正确的OpenGL版本,并且尝试在之前设置配置文件掩码将导致OP的错误。
示例代码段:
字符串