【问题标题】:GLSL Simple example shows blanks screen on OSXGLSL 简单示例在 OSX 上显示空白屏幕
【发布时间】:2020-10-26 01:46:25
【问题描述】:

我正在尝试制作一个简单的程序来工作。我正在使用 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。所以我确信我得到了正确的个人资料。

我尝试过使用标题。看来我不需要库来获取扩展名,似乎 Apple 已经将它们包含在继承的 OpenGL 头文件中。

完整的程序有一些在创建/链接着色器时处理错误的例程,我可以告诉他们没有编译/链接失败。

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

知道我错过了什么或做错了什么吗?

【问题讨论】:

  • 您是否有理由将 APPLE 扩展用于 VAO 而不是核心版本?调用glGetError()时有没有报错?
  • 没有理由。这就是我发现可用的。 glGetError 没有收到任何错误

标签: c++ macos opengl glsl sdl-2


【解决方案1】:

好的。我成功了。

问题出在这几行:

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

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

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

现在程序显示点/三角形

希望这对将来的其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 2023-03-18
    • 2015-10-03
    相关资源
    最近更新 更多