【问题标题】:Basic Vertex Buffer Example not working基本顶点缓冲区示例不起作用
【发布时间】:2014-12-08 21:41:09
【问题描述】:

我即将实现一个非常基本的渲染模块。现在是时候改变使用 VBO 将原语渲染为现代方法的旧方法了,到目前为止,我了解它是如何工作的,但我无法让我的 PoC 正常工作。

加载基本模型(三角形)没有产生opengl错误(glBindVertexArray是glBindVertexArrayAPPLE的宏):

    float pos[] = { 
    -1.0f, -1.0f,-5.0f, 
    -1.0f, 1.0f, -5.0f,
    1.0f,1.0f,-5.0f, 
    };

printf("%d %d", map_VAO, map_VBO);
checkGLError();
glGenVertexArrays(1, &map_VAO);

checkGLError();
glGenBuffers(1, &map_VBO);

printf("%d %d", map_VAO, map_VBO); // here with 4.1 map_VAO is 0

checkGLError();
glEnableClientState(GL_VERTEX_ARRAY);

glBindVertexArrays(map_VAO);
glBindBuffer(GL_ARRAY_BUFFER, map_VBO);
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), &pos[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); 

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArrays(0);

glDisableClientState(GL_VERTEX_ARRAY);

return 0;

并且在主循环中(绘图部分):

// .. clear buffers load identity etc... 

glColor3f(0.33f,0.0f,0.0f);

glEnableClientState(GL_VERTEX_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, map_VBO);
glBindVertexArrayAPPLE(map_VAO);
glEnableVertexAttribArray(0); 

glDrawArrays(GL_TRIANGLES, 0, 3); 

glBindBuffer(GL_ARRAY_BUFFER, 0 );
glBindVertexArrayAPPLE(0);

glDisableClientState(GL_VERTEX_ARRAY);

新的绘图部分:(删除不必要的客户端状态和绑定)

glColor3f(0.33f,0.0f,0.0f);

glBindVertexArrayAPPLE(map_VAO);

glDrawArrays(GL_TRIANGLES, 0, 3);

但是什么都没有显示。我曾尝试更改配置文件和 OpenGL 版本,但出现了其他问题。 我可以用旧方法画一个简单的三角形:

glBegin(GL_TRIANGLES);
glVertex3f( -1.0f, -1.0f, -5.0f);
glVertex3f( -1.0f, 1.0f, -5.0f);
glVertex3f(  1.0f, 1.0f,-5.0f);
glEnd();

问题:我做错了什么?,有某种与 VBO 和 VAO 相关的激活?

其他问题:为什么当我使用 open gl 4.1 Core 配置文件时,我无法使用 genVertexArray 获得 VAO 名称? (它说无效操作)

【问题讨论】:

    标签: c opengl


    【解决方案1】:

    一些事情:

    1. glEnableClientState 已弃用。 glEnableClientState 用于告诉 OpenGL 您正在使用顶点数组来实现您不再使用的固定函数功能,因此调用此函数没有用(并且可能会导致奇怪的结果)。
    2. glEnableVertexAttribArray(0); 绘图功能无需再次启用。启用第 0 个顶点属性已存储在您的 VAO 中。
    3. glBindBuffer(GL_ARRAY_BUFFER, map_VBO); 另外,绘图函数中不需要调用这个函数。 glVertexAttribPointer 在您配置 VAO 时存储 VBO 绑定。

    因此,请删除 glEnable/Disable-ClientState 函数并记住您只需要在您的情况下绑定 VAO。我相信您的错误原因是第 1 点。第 2 点和第 3 点只是为了改进您的代码;)

    【讨论】:

    • 感谢您的提示,我已按照您的指示进行了清洁,但我仍然没有三角形。旧方法仍然可以正常工作。
    • 嗯,很有趣。我看到您提到 glGenVertexArrays 将 map_VAO 设置为 0。它应该大于 1。然后您可能会收到 GL_INVALID_VALUE 错误(尝试检查)。在那种情况下,你的 map_VAO 变量是什么?它应该是一个无符号整数吗?还是一组无符号整数?
    • 当我使用其他配置文件(4.1 核心)时,我在 map_VAO 中只得到 0,这两个变量都是 GLuint
    • 很奇怪。您确定您正在运行 OpenGL 核心上下文吗?因为如果是这样,您不应该在您的情况下使用旧方法。可能是您的上下文切换到不支持 VAO 的旧上下文(如果您没有明确指定核心配置文件,Mac OS X 会这样做)。否则,我不知道是什么导致了错误。编辑:我看到 Andon M. Coleman,刚刚为这个特定案例创建了一个答案:按照他的指示,你应该得到你的三角形 :)
    【解决方案2】:

    您没有将glGenVertexArrays 包裹在glGenVertexArraysAPPLE 周围,是吗? (就像你提到的为glBindVertexArray做的那样)

    该功能在 OS X 的核心配置文件中不存在,您会注意到扩展字符串中明显缺少 GL_APPLE_vertex_array_object。它存在于旧版 (2.1) 配置文件 as seen here 但不在核心 (3.2+) as seen here 中。

    在 OS X 上使用核心配置文件时,您应该#include <OpenGL/gl3.h> 并调用glGenVertexArrays (...) 而不是glGenVertexArraysAPPLE (...)

    仅在 OS X 上的 OpenGL 2.1 上下文中调用 VertexArray*APPLE 函数,否则您将收到 GL_INVALID_OPERATION 错误。

    【讨论】:

    • 我对 opengl 上的版本有点迷失,首先我的 glGetString 版本返回 OpenGL 版本:2.1 NVIDIA-10.0.43 310.41.05f01,当我单独包含 gl3.h 时,我得到编译器警告:/ Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers/gl.h|5 col 2 警告| gl.h 和 gl3.h 都包括在内。如果使用已删除的 OpenGL 功能,编译器将不会调用错误。
    • 是的,您不应该同时包含gl.hgl3.h。基本上,当您构建在 OpenGL 2.1 中运行的软件时,您应该包含 <OpenGL/gl.h>,而当您构建它的核心 3.2+(包括 GL4)时,您应该包含 <OpenGL/gl3.h>。它是这样设计的,因此您不会意外使用未在您尝试使用的 OpenGL 版本中定义的函数。但如果你同时包含两者,那么这种好处就会消失。
    • IM 使用 glfw 设置 opengl 的版本,当我使用 2.1 时,它编译时没有警告,也没有显示任何内容。当我使用带有警告的 3.2 前向兼容编译时(关于 gl3.h 和 gl.h 都包括在内,即使我只有 gl3.h。当我进入核心时,它会因 glLoadIdentity 调用的无效操作而失败,并且显示的版本是 4.1
    • 是的,glLoadIdentity 在核心配置文件中无效。基本上,所有标记为已弃用的 OpenGL 3.0 都已从核心配置文件中删除。如果您的代码依赖于 glLoadIdentity(或任何与着色器无关的矩阵函数)之类的东西,那么它将无法在核心配置文件中工作。
    • 好吧,即使我完全没有 glGetError 错误,VBO 相关功能似乎 2.1 VBO 对我不起作用:gl*APPLE 不起作用,将版本升级到 3.2 迫使我使用核心配置文件,然后我必须更改每个矩阵函数。 =/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    相关资源
    最近更新 更多