OpenGL 不使用 GLFW 和 GLLoadGen 在 Mavericks 上绘图

Posted

技术标签:

【中文标题】OpenGL 不使用 GLFW 和 GLLoadGen 在 Mavericks 上绘图【英文标题】:OpenGL not drawing on Mavericks with GLFW and GLLoadGen 【发布时间】:2014-10-03 10:50:59 【问题描述】:

我正在尝试为 OpenGL 工作设置跨平台代码库,以下代码在我的硬盘驱动器的 Windows 7 分区上绘制得很好。但是,在 Mavericks 上,我只得到一个黑屏,不知道为什么。我已经尝试了指南和相关问题中建议的所有内容,但到目前为止没有任何效果!希望我只是遗漏了一些明显的东西,因为我对 OpenGL 还是很陌生。

#include "stdafx.h"

#include "gl_core_4_3.hpp"
#include <GLFW/glfw3.h>

int main(int argc, char* argv[])

    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, 1);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

    if (!glfwInit())
    
        fprintf(stderr, "ERROR");
        glfwTerminate();
        return 1;
    

    GLFWwindow* window = glfwCreateWindow(640, 480, "First GLSL Triangle", nullptr, nullptr);
    if (!window)
    
        fprintf(stderr, "ERROR");
        glfwTerminate();
        return 1;
    

    glfwMakeContextCurrent(window);

    gl::exts::LoadTest didLoad = gl::sys::LoadFunctions();
    if (!didLoad)
    
        fprintf(stderr, "ERROR");
        glfwTerminate();
        return 1;
    

    printf("Number of functions that failed to load: %i\n", didLoad.GetNumMissing()); // This is returning 16 on Windows and 82 on Mavericks, however i have no idea how to fix that.

    gl::Enable(gl::DEPTH_TEST);
    gl::DepthFunc(gl::LESS);

    float points[] =
    
        0.0f, 0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        -0.5f, -0.5f, 0.0f,
    ;

    GLuint vbo = 0;
    gl::GenBuffers(1, &vbo);
    gl::BindBuffer(gl::ARRAY_BUFFER, vbo);
    gl::BufferData(gl::ARRAY_BUFFER, sizeof(points) * sizeof(points[0]), points, gl::STATIC_DRAW);

    GLuint vao = 0;
    gl::GenVertexArrays(1, &vao);
    gl::BindVertexArray(vao);
    gl::EnableVertexAttribArray(0);
    gl::BindBuffer(gl::ARRAY_BUFFER, vbo);
    gl::VertexAttribPointer(0, 3, gl::FLOAT, 0, 0, NULL);

    const char* vertexShader = 
        "#version 400\n"
        "in vec3 vp;"
        "void main() "
        "   gl_Position = vec4(vp, 1.0);"
        "";

    const char* fragmentShader =
        "#version 400\n"
        "out vec4 frag_colour;"
        "void main() "
        "   frag_colour = vec4(1.0, 1, 1, 1.0);"
        "";

    GLuint vs = gl::CreateShader(gl::VERTEX_SHADER);
    gl::ShaderSource(vs, 1, &vertexShader, nullptr);
    gl::CompileShader(vs);

    GLuint fs = gl::CreateShader(gl::FRAGMENT_SHADER);
    gl::ShaderSource(fs, 1, &fragmentShader, nullptr);
    gl::CompileShader(fs);

    GLuint shaderProgram = gl::CreateProgram();
    gl::AttachShader(shaderProgram, fs);
    gl::AttachShader(shaderProgram, vs);
    gl::LinkProgram(shaderProgram);

    while (!glfwWindowShouldClose(window))
    
        gl::ClearColor(0, 0, 0, 0);
        gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT);
        gl::UseProgram(shaderProgram);
        gl::BindVertexArray(vao);

        gl::DrawArrays(gl::TRIANGLES, 0, 3);

        glfwPollEvents();
        glfwSwapBuffers(window);
    

    glfwTerminate();
    return 0;

通过 Xcode 编译,使用 2013 Macbook Mini,Intel HD Graphics 5000。还可能值得注意的是 GLLoadGen GetNumMissing() 方法在 OSX 上返回 82 个丢失的函数,我不知道为什么会这样或如何修复它。 GLFW 包含 gl.h 而不是 gl3.h,但通过声明所需的宏来强制它包含 gl3.h 会输出有关包含两个标头的警告,但仍然没有绘制。任何帮助或建议都会很棒。

【问题讨论】:

在调用任何其他 GLFW 函数之前,您必须先调用 glfwInit @datenwolf 这样做会导致它在 GLFWwindow* window = glfwCreateWindow(...) 上出错,它似乎没有创建,所以在下一个 if 语句中退出。 好吧,知道有一些错误只是成功的一半。您还应该报告发生了哪个错误。 glfw.org/docs/latest/group__error.html @datenwolf "请求的客户端 API 版本不可用。"显然 4.3 不是一个东西,4.1 是。奇怪的是其他代码在 Windows 上工作。把所有这些写下来作为答案,我会接受的。 developer.apple.com/opengl/capabilities 【参考方案1】:

您必须在调用任何其他 GLFW 函数之前调用 glfwInit。还注册一个错误回调,以便获得诊断为什么某个 GLFW 操作失败。您请求的 OpenGL 配置文件不受 MacOS X Mavericks 支持。但是在设置窗口提示后调用glfwInit 会重置该选择,因此为什么你得到一个窗口+上下文,而不是所需的配置文件。在前面拉glfwInit 解决了这个问题,但现在由于缺乏操作系统支持,您的窗口+上下文创建失败。

【讨论】:

非常感谢。数小时的头痛消失了!【参考方案2】:

在每次 openGL 调用之后,检查是否有错误(使用 glGetError 或 gl::GetError。对于您的着色器,您必须检查它们是否已正确编译,很可能存在错误。所以检查为好(glGetShader 和 glShaderInfoLog)。对链接阶段执行相同的操作。

【讨论】:

以上是关于OpenGL 不使用 GLFW 和 GLLoadGen 在 Mavericks 上绘图的主要内容,如果未能解决你的问题,请参考以下文章

使用 GLFW3 在 OpenGL 上下文之间共享纹理不起作用

使用 Opengl CORE 函数和 Comptability profile - GLFW

使用OpenGL和GLFW的简单三角形[重复]

OpenGL GLFW简单立方体不渲染

使用 CMake 在 Mac 上链接静态 GLFW 和 OpenGL

OpenGL 使用 Q 和 E 字符移动相机 GLFW 库