opengl glBinding/GLFW“宏替换后出错”

mrfwxfqh  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(144)

我试图学习OpenGL与GLFW/glBinding,我如果我想创建和使用一个顶点缓冲区,我得到了一个错误

error: cannot convert ‘int’ to ‘gl::GLenum’ for argument ‘1’ to ‘void gl::glBindBuffer(gl::GLenum, gl::GLuint)’
 gl::glBindBuffer(GL_ARRAY_BUFFER, VBO);

我的IDE(Clion)告诉我,在宏替换之后有一个参数不匹配(显然)。所以我的问题是:我做错了什么因为如果是宏的错,这个主题在谷歌上的点击率会更高:)
代码:

GLuint VBO;
gl::glGenBuffers(1, &VBO);
gl::glBindBuffer(GL_ARRAY_BUFFER, VBO);

我的建议是这样的,它说不要使用命名空间gl::但是如果我不这样做,我就不能访问这些功能,所以我想这不是问题所在。
谢谢

hs1ihplo

hs1ihplo1#

第一步:根据glBinding的文档,参数应该类似于gl::GL_ARRAY_BUFFER。不过,这并不能解决整个问题。
这是因为您的OpenGL实现使用了#define来公开常量(如GL_ARRAY_BUFFER),具体方式如下:

#define GL_ARRAY_BUFFER 1

这意味着你的代码实际上是预处理的:

gl::glBindBuffer(1, VBO);

而且,在编译器有机会看到您的代码并使用glBinding的GL_ARRAY_BUFFER之前。因此出现了错误。
解决方案是,如文档中所述,* 删除并替换 * 标准GL.h包含来自glBinding的包含。

cmssoen2

cmssoen22#

我知道我迟到了,但这可能会帮助那些谷歌这一点,因为我做了。首先,有两种方法可以解决这个问题,一种是面向未来的方法,另一种是快速而肮脏的方法。
快速和肮脏的方法,如上所述,由Steelbean,是:

#define GLFW_INCLUDE_NONE
#include <glbinding/gl/gl.h>
#include <GLFW/glfw3.h>

这个命令很关键。
优雅且面向未来的方法是创建一个特殊的头文件,在其中添加所有条件#include。作为一个例子,这里是我的。请注意,我只使用头文件中指定的2个库中的1个,但您可以同时使用它们(甚至添加更多):

#pragma once // OR THE OLD-STYLE HEADER GUARD, IF THAT'S WHAT YOU'RE INTO
// This is where you specify what window manager you want to use
#define __WML_GLFW3__ 1
#define __glLOADER_glBINDINGS__ 1



#ifdef __glLOADER_glBINDINGS__

#include <glbinding/gl/gl.h>
#include <glbinding/Binding.h>
//This is here for readability.
namespace gl
{
    using VAO_t = GLuint;
    using program_t = GLuint;
    using shader_t = GLuint;
    using shader_source_t = GLchar*;
    using buffer_t = GLuint;
};

#else

#error "No available GL Loader.\n"

#endif

// If you want to use SFML
#ifdef __WML_SFML__

static const EWindowLib WINDOW_LIB = EWindowLib::sfml;

#elif defined __WML_GLFW3__
#ifdef __glLOADER_glBINDINGS__
#define GLFW_INCLUDE_NONE 1
#endif
#include <GLFW/glfw3.h>

static const EWindowLib WINDOW_LIB = EWindowLib::glfw;

#else

#error "No available window manager library.\n"

#endif

static int initEnvironment()
{

    #ifdef __glLOADER_glBINDINGS__
    glbinding::Binding::initialize();
    #else
    #error "No available GL Loader.\n"
    #endif

    switch(WINDOW_LIB)
    {
        case EWindowLib::sfml:
            break;

        case EWindowLib::glfw:
            if(glfwInit() != GLFW_TRUE)
                return GLFW_FALSE;
            glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
            glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
            glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
            glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
            break;

        default:
            break;
    }
}

static int terminateEnvironment()
{
    #ifdef __WML_GLFW3__
    glfwTerminate();
    #endif

    //TODO: change this into a fancy error-checking method. 
    return (1);
}
  • 请注意,这里的顺序也很重要。* 为了更精确,您需要在包含GLFW之前定义GLFW_INCLUDE_NONE。现在我有了这个头文件(我们称之为DEFS.hpp),我可以通过删除一个定义并添加另一个定义来交替使用SMFL和GLFW进行窗口管理。现在DEFS.hpp将包含在定义程序入口点的源文件中;也就是说,在源文件中包含DEFS.hpp和int main(/*int argc, char** argv*/)。希望这能为您节省一些开发时间。

相关问题