glBinding / GLFW"宏替换后错误"

时间:2017-05-06 13:48:11

标签: c++ opengl

我正在尝试使用GLFW / glBinding学习OpenGL,如果我想创建和使用顶点缓冲区,我会得到Compilingerror

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);    

我的教程是this并且它表示不使用名称空间gl ::但如果我不能访问这些功能,那么我想这不是问题所在。

感谢

2 个答案:

答案 0 :(得分:3)

第一步:根据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的包含。

答案 1 :(得分:2)

我知道我已经迟到了,但这可能会像谷歌那样帮助Google。 首先,有两种解决方法,一种面向未来的方法和一种快速而肮脏的方法。

如上所述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将包含在定义程序入口点的源文件中;也就是说,在包含int main(/*int argc, char** argv*/)的源文件中包含DEFS.hpp。希望这可以为您节省一些开发时间。