【问题标题】:Opengl, DrawArrays without binding VBOOpengl,DrawArrays 没有绑定 VBO
【发布时间】:2011-12-23 19:20:46
【问题描述】:

我正在使用自定义顶点着色器渲染点数组。 着色器看起来像:

void mainVP()
in varying int    in_vertex_id : VERTEXID
{
    foo(in_vertex_id);
}

所以我唯一需要的是顶点 ID。 但我需要很多顶点,我不想为它们存储假 VBO(它需要大约 16mb 的内存)。

我试图在不绑定任何 VBO 的情况下运行我的代码。有用。 所以我的渲染看起来像:

size_t num_vertices = ...
glDrawArrays(GL_POINTS, 0, num_vertices);

但是我可以确定不绑定 VBO 的渲染是安全的吗?

【问题讨论】:

    标签: opengl vbo fbo


    【解决方案1】:

    但是我可以确定不绑定 VBO 的渲染是安全的吗?

    你不能。

    OpenGL 规范的核心配置文件(3.2 及更高版本)明确指出它应该被允许,您可以在禁用所有属性的情况下进行渲染。 OpenGL 规范的兼容性配置文件或 3.2 之前的任何版本都明确声明您不能这样做。

    当然,这无所谓。 NVIDIA 驱动程序允许您在任何 OpenGL 版本和配置文件上执行此操作。 ATI 的驱动程序不允许您在任何 OpenGL 版本或配置文件上执行此操作。它们都是驱动程序错误,只是方式不同。

    你只需要接受你需要一个虚拟顶点属性。然而:

    但我需要很多顶点,我不想为它们存储假 VBO(这需要大约 16mb 的内存)。

    一个虚拟属性将占用 4 个字节(一个浮点数,或一个标准化字节的 4 个向量。记住:你不关心数据)。所以你可以在 16MB 中容纳 400 万个。

    或者,您可以通过 glDrawArraysInstanced 使用实例化渲染。在那里,您只需渲染一个顶点,但使用 num_vertices 实例。当然,您的着色器必须使用实例 ID。

    【讨论】:

    • glDrawArraysInstanced - 很棒的建议!今天查了一下。有用。对于 400 万个顶点,速度与 glDrawArrays 相同。谢谢。
    • 这些信息过时了吗?我刚刚尝试了一个在 Radeon 上渲染空 VAO 的程序,它运行良好,就像在 Nvidia GPU 上一样。面向 OpenGL 4.3 / GLSL 430。
    • @Vandroiy:可能是这样。自从我检查以来已经超过 5 年了。但是英特尔呢?
    • 我只是在 Intel GPU 上运行它;也没有看到任何问题。如果我理解正确,如果我创建一个新的 VAO,绑定它,不调用 glEnableVertexAttribArray,但调用 glDrawArrays,就会出现问题?不知道我是否误会了什么。但是,如果它只是有效,那就不足为奇了。近年来,OpenGL 支持总体上有所改进。
    猜你喜欢
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多