我正在尝试使用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 ::但如果我不能访问这些功能,那么我想这不是问题所在。
感谢
答案 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。希望这可以为您节省一些开发时间。