GLSL 简单示例在 OSX 上显示空白屏幕

GLSL Simple example shows blanks screen on OSX

我正在尝试制作一个简单的程序来运行。我正在使用 SD2 + OpenGL 着色语言。另外,我正在 MacOS 上尝试这个,更准确地说是 10.15.5。 我知道 Apple 正在弃用 OpenGL 而支持 Metal,但似乎他们至少仍支持 OpenGL 4.1。

这是我正在尝试的程序的简化版本运行:

#include <OpenGL/glext.h>
#include <OpenGL/glu.h>
#include <SDL.h>
#include <iostream>

const int WIDTH = 600;
const int HEIGHT = 600;

const int numVAOs = 1;

GLuint renderingProgram;
GLuint vao[numVAOs];

GLuint createShaderProgram() {
    GLint vertCompiled;
    GLint fragCompiled;
    GLint linked;

    const char *vshaderSource =
            "#version 410\n"
            "void main(void)\n"
            "{gl_Position = vec4(0.0, 0.0, 0.0, 1.0); }";
    const char *fshaderSource =
            "#version 410\n"
            "out vec4 color; \n"
            "void main(void)\n"
            "{color = vec4(1.0, 0.0, 0.0, 1.0);}";

    GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(vShader, 1, &vshaderSource, NULL);
    glShaderSource(fShader, 1, &fshaderSource, NULL);

    glCompileShader(vShader);
    glCompileShader(fShader);

    GLuint vfProgram = glCreateProgram();
    glAttachShader(vfProgram, vShader);
    glAttachShader(vfProgram, fShader);
    glLinkProgram(vfProgram);

    return vfProgram;
}

int main() {
    SDL_Window *window;
    SDL_GLContext gl_context;

    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        return -1;
    }
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

    window = SDL_CreateWindow(
            "OpenGL Shaders",
            SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED,
            WIDTH,
            HEIGHT,
            SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
    gl_context = SDL_GL_CreateContext(window);

    std::cout << glGetString(GL_VERSION) << std::endl;

    renderingProgram = createShaderProgram();
    glGenVertexArraysAPPLE(numVAOs, vao);
    glBindVertexArrayAPPLE(vao[0]);

    bool isRunning = true;
    SDL_Event event;
    while (isRunning) {
        while (SDL_PollEvent(&event)) {
            switch (event.type) {
                case SDL_QUIT:
                    isRunning = false;
                    break;
            }
        }
        glClearColor(1.0, 1.0, 1.0, 1.0);
        glClear(GL_COLOR_BUFFER_BIT);

        glUseProgram(renderingProgram);
        glPointSize(30.0f);
        glDrawArrays(GL_POINTS, 0, 1);

        SDL_GL_SwapWindow(window);
    }

    SDL_GL_DeleteContext(gl_context);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

这仅显示一个空白屏幕,并在控制台上打印 4.1 ATI-3.9.15。所以我确定我得到了正确的配置文件。

我试过 headers。看来我不需要库来获取扩展名称,Apple 似乎已经拥有它们继承人 OpenGL headers。

完整的程序有一些例程可以在 creating/linking 着色器时处理错误,我可以告诉他们它们没有失败 compile/link。

程序应该在屏幕中间显示一个点,但除了白色屏幕(清晰的颜色)外什么也没有显示。

知道我遗漏了什么或做错了什么吗?

好的。我成功了。

问题出在这一行:

glGenVertexArraysAPPLE(numVAOs, vao);
glBindVertexArrayAPPLE(vao[0]);

出于某种原因,这些应用程序的 APPLE 版本不起作用。 我所做的是:

  • 用 brew 安装 GLEW(我认为我不需要)
  • 将我的 cmake 文件更新为 link glew 正确
  • 添加 glew headers 和 glew_init()
  • 将 APPLE 函数替换为“正常”函数。
glGenVertexArrays(numVAOs, vao);
glBindVertexArray(vao[0]);

现在程序显示points/triangles

希望这对以后的其他人有所帮助。