当前位置: 首页 > 知识库问答 >
问题:

OpenGL不使用GLFW和GLLoadGen绘制Mavericks

夏侯航
2023-03-14

我试图为OpenGL工作设置一个跨平台代码库,下面的代码在我硬盘的Windows7分区上绘制得很好。然而,在小牛,我只得到一个黑屏,不知道为什么。我已经尝试了指南和相关问题中建议的所有东西,但到目前为止都没有效果!希望我只是遗漏了一些明显的东西,因为我对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。可能还值得注意的是,OSX上的GLLoadGen GetNumMissing()方法返回了82个丢失的函数,我不知道为什么会这样,也不知道如何修复它。GLFW包含gl.h,而不是gl3.h,但是强制它包含gl3.h,方法是对所需的宏输出声明一个关于包含两个标题和仍然没有绘制的警告。任何帮助或建议都会很好。

共有1个答案

毕泽宇
2023-03-14

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

 类似资料:
  • 我能够创建一个窗口,并清除到所需的颜色。但无法在左下角绘制正方形。

  • 所以,我试图在openGL和GLFW中绘制一个简单的立方体。

  • 在我的呈现器类上: 函数在呈现器类中更改坐标: 当我移动手指时,没有线,只有一条移动的小线...我怎样才能画出整条线,并在我不断移动手指的同时保持线描?当我再次触屏时,也开始新的一行。

  • 我是最新版本的OpenGL的新手,我试图通过以下教程来学习它:http://open.gl/drawing 然而,我正在使用LWJGL的最新版本,并尽最大努力将其OpenGL与教程一样使用。然而,应该绘制的白色三角形却不是。 这是我的代码: 我的着色器与本教程的着色器相同,但无论如何都会为了便于阅读而发布它们: 。蓄意杀伤 .vert 代码运行,但都是黑色的。有什么想法吗?

  • 我对glfw有一个小问题。 我的代码非常简单,我只想创建一个空窗口。 } 此代码编译,但当我运行它时,我只有一个白色窗口。窗口的标题是正确的,但里面的一切都是白色的......我尝试像那样使用glClearColor。 但是我的窗户仍然是白色的....我用的是visual studio 2015。 怎么弄个黑窗? 编辑: 忘了补充这个:glfwMakeContextCurrent(window);

  • 我到处都找过了,我似乎无法让OpenGL绘制一个简单的四边形。窗口在正确的颜色背景下显示得很好,但OpenGL就是不会绘制框。我正在使用OpenGL 4.4.0-构建20.19.15.4463窗口大小为1920x1080 这是我目前拥有的代码: 在Main.java: 在实体框中: