glClearBufferfv - 未在此范围内声明?

Posted

技术标签:

【中文标题】glClearBufferfv - 未在此范围内声明?【英文标题】:glClearBufferfv - not declared in this scope? 【发布时间】:2016-05-30 15:29:53 【问题描述】:

编辑:如果有人遇到这种错误,并且正在使用 GLEW,那么在使用 OpenGL 4.5 功能时,以下内容会有所帮助:

glewExperimental = GL_TRUE;

之后只需初始化 GLEW 就可以了。

我刚刚开始使用 OpenGL。目前我正在尝试用红色清除整个屏幕,如此处的代码所示:

#include "GLFW/glfw3.h"

#define WIDTH 1280
#define HEIGHT 720

int main(void)

    GLFWwindow *window;

    if(!glfwInit()) 
        return -1;
    

    window = glfwCreateWindow(WIDTH, HEIGHT, "Test OpenGL", NULL, NULL);

    if(!window) 
        glfwTerminate();
        return -1;
    

    glfwMakeContextCurrent(window);
    static GLfloat red[] = 1.0f, 0.0f, 0.0f, 1.0f;
    glClearBufferfv(GL_COLOR, 0, red);

    while(!glfwWindowShouldClose(window)) 
        //glEnableClientState(GL_VERTEX_ARRAY);
        //glDisableClientState(GL_VERTEX_ARRAY);

        glfwSwapBuffers(window);
        glfwPollEvents();
    

    glfwTerminate();
    return 0;

但是有一个问题。我正在使用 g++ 编译用 Code::Blocks 编写的代码。另外,我正在学习 OpenGL SuperBible 第 7 版,在那里我获得了用红色清除屏幕的代码。在我使用 glClearColor(255, 0, 0, 0)glClear(GL_COLOR_BUFFER_BIT); 之前 但是在本书中,使用 glClearBufferfv 清除屏幕,会引发以下异常:

错误:“glClearBufferfv”未在此范围内声明

当然,我想将书中的代码用于学习目的,如果可以的话,那就太好了。可悲的是,它没有。有什么想法,为什么?

【问题讨论】:

【参考方案1】:

glClearBufferfv 是一个较新的 OpenGL 函数,这意味着在技术上讲 OpenGL 的显卡可能不支持它。这意味着该函数需要由您或OpenGL loading library加载,然后您才能使用它。

SuperBible 示例代码附带 gl3w 加载程序,作为其 s7 帮助程序库的一部分。你可以:

使用 s7,本书中的其他示例也可能依赖于它 跳过 s7 并使用 gl3w 或任何其他加载器,就像我个人最喜欢的 libepoxy 不要使用加载器和load the functions you need by hand。这很快就会变得乏味,但这确实意味着您可以看到发生了什么。

GLFW documentation 也有一些有用的指针。

【讨论】:

好吧,所以我开始使用 GLEW,这似乎是最适合我的目的,但现在我收到以下错误:未定义引用 _imp______glewClearBufferfv 我也倾向于不使用 sb7.h,因为我不打算在未来使用它。 这听起来像是一个链接问题。你读过 GLEW 的 installation instructions 吗? 好吧,我同时尝试了其他方法。我在包含 glew.h 之前定义了 GLEW_STATIC,并链接到 glew32s.lib,而不是 glew32.lib,但它对我不起作用。所以我想,我会按照你的建议使用gl3w(为什么我什至不使用它?:D)我想问一件事:链接器的加载顺序是否正确?:glfw3,opengl32, gdi32, 包括\Win32\glew32s.lib 我没有要检查的 Windows 机器,但这似乎是明智的。如果你现在不能让加载器工作,你可以一直使用glfwGetProcAddress,直到你这样做。 你能给我一个快速指南吗?我以前从未使用过这个。我试过:glfwGetProcAddress(glClearBufferfv(GL_COLOR, 0, red));我敢肯定,这是错误的:D

以上是关于glClearBufferfv - 未在此范围内声明?的主要内容,如果未能解决你的问题,请参考以下文章

qrand 未在此范围内声明

未在此范围内声明 CvSVM 错误

C++ Win API 函数'未在此范围内声明'

C++ 错误:未在此范围内声明类/对象

数据“未在此范围内声明的成员”

Arduino:错误:“abs”未在此范围内声明