GLEW & SFML on MacOS with #version 150 core

GLEW & SFML on MacOS with #version 150 core

我需要在我的 MacOS Big Sur 11.2.2 上使用 OpenGL 创建一些项目。

我的版本:

Renderer:       AMD Radeon Pro 555 OpenGL Engine
OpenGL version: 2.1 ATI-4.2.15
GLSL version:   1.20

我需要渲染一些版本为 150 的着色器:

const GLchar* vertexSource = R"glsl(
#version 150 core
in vec3 position;
in vec3 color;
out vec3 Color;
void main(){
Color = color;

gl_Position = vec4(position, 1.0);

}
)glsl";

const GLchar* fragmentSource = R"glsl(
#version 150 core
in vec3 Color;
out vec4 outColor;
void main()
{
outColor = vec4(Color, 1.0);
}
)glsl";

在渲染着色器上出现错误:

ERROR: 0:2: '' :  version '150' is not supported
ERROR: 0:2: '' : syntax error: #version

我必须在 1.5 版本上创建我的项目,那么我应该如何在我的 MacBook 上 运行 它?是否可以选择使用 1.50 版本渲染或更新我的库?

完整代码:

#include <iostream>
#include <stdio.h>

#include <GL/glew.h>
#include <SFML/Window.hpp>

const GLchar* vertexSource = R"glsl(
#version 150 core
in vec3 position;
in vec3 color;
out vec3 Color;
void main(){
Color = color;

gl_Position = vec4(position, 1.0);

}
)glsl";

const GLchar* fragmentSource = R"glsl(
#version 150 core
in vec3 Color;
out vec4 outColor;
void main()
{
outColor = vec4(Color, 1.0);
}
)glsl";
int main()
{
    sf::ContextSettings settings;
    settings.depthBits = 24;
    settings.stencilBits = 8;

    sf::Window window(sf::VideoMode(800, 800, 32), "OpenGL", sf::Style::Titlebar | sf::Style::Close, settings);

    glewExperimental = GL_TRUE;
    glewInit();

        const GLubyte* renderer = glGetString(GL_RENDERER);
        const GLubyte* version = glGetString(GL_VERSION);
        const GLubyte* glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);
        printf ("Renderer:       %s\n", renderer);
        printf ("OpenGL version: %s\n", version);
        printf ("GLSL version:   %s\n", glslVersion);
    
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    GLuint vbo;
    glGenBuffers(1, &vbo);


    GLfloat vertices[] = {
    0.0f, 0.5f, 1.0f, 0.0f, 0.0f,
    0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
    -0.5f, -0.5f, 0.0f, 0.0f, 1.0f
    };


    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);


    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexSource, NULL);
    glCompileShader(vertexShader);

    GLint status;
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status);

    if(!status) {
        std::cout << "vertexShader: compile failed" << std::endl;
        char buffer[1024];
        
        glGetShaderInfoLog(vertexShader, 1024, NULL, buffer);
        std::cout << buffer << std::endl;
        return 1;
    }
    
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
    glCompileShader(fragmentShader);
    
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status);
    
    if(!status) {
        std::cout << "fragmentShader: compile failed" << std::endl;
        char buffer[1024];
        
        glGetShaderInfoLog(vertexShader, 1024, NULL, buffer);
        std::cout << buffer << std::endl;
        return 1;
    }
    
    GLuint shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    //glBindFragDataLocation(shaderProgram, 0, "outColor");
    glLinkProgram(shaderProgram);
    glUseProgram(shaderProgram);

    GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
    glEnableVertexAttribArray(posAttrib);
    glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), 0);
    GLint colAttrib = glGetAttribLocation(shaderProgram, "color");
    glEnableVertexAttribArray(colAttrib);
    glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));

    bool running = true;
    while (running) {
        sf::Event windowEvent;
        while (window.pollEvent(windowEvent)) {
            switch (windowEvent.type) {
            case sf::Event::Closed:
                running = false;
                break;
            }
        }
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glDrawArrays(GL_TRIANGLE_FAN, 0, 3);
        window.display();
    }
    glDeleteProgram(shaderProgram);
    glDeleteShader(fragmentShader);
    glDeleteShader(vertexShader);
    glDeleteBuffers(1, &vbo);
    glDeleteVertexArrays(1, &vao);
    window.close();
    return 0;
}

您目前正在尝试在 OpenGL 2.1 上下文中执行 OpenGL 3.3 核心配置文件着色器(版本 150 核心),这是不可能的。如果你的硬件支持,可以专门申请一个3.3 core profile context:

sf::ContextSettings settings;
settings.depthBits = 24;
settings.stencilBits = 8;
settings.majorVersion = 3;
settings.minorVersion = 3;
settings.attributeFlags = Core;