OpenGL,不绑定VBO使用DrawArrays

9

我正在使用自定义顶点着色器渲染点阵数组。 着色器如下:

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进行渲染是安全的吗?
1个回答

14

但是如果不绑定VBO进行渲染,我能确定是安全的吗?

无法确定。

OpenGL规范的核心配置文件(3.2及以上版本)明确规定应该允许使用所有属性禁用的方式进行渲染。OpenGL规范的兼容性配置文件或任何3.2版本之前的版本同样明确规定你不能这么做。

当然,这并不重要。NVIDIA驱动程序允许您在任何OpenGL版本和配置文件上这样做。而ATI的驱动程序不允许您在任何OpenGL版本或配置文件上这样做。它们都是驱动程序的错误,只是以不同的方式。

你必须接受需要一个虚拟的顶点属性。但是:

但是我需要很多顶点,我不想为它们存储虚假的VBO(它占用约16MB的内存)。

一个虚拟属性只占用4个字节(单个浮点数或规范化字节的4向量。记住:你不关心数据)。所以你可以在16MB中放置400万个虚拟属性。

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


glDrawArraysInstanced - 好建议!今天我检查了一下。它有效果。对于400万个顶点,速度与glDrawArrays相同。谢谢。 - Roman Silakov
2
这些信息是否已经过时了?我刚刚尝试了一个在Radeon上渲染一个空的VAO的程序,它可以正常工作,就像在Nvidia GPU上一样。目标是OpenGL 4.3 / GLSL 430。 - Vandroiy
1
@Vandroiy:可能是这样。我已经有5年多没有检查过了。但是英特尔呢? - Nicol Bolas
我刚刚在Intel GPU上运行了它;那里也没有看到任何问题。如果我理解正确的话,如果我创建一个新的VAO,绑定它,不调用glEnableVertexAttribArray,但调用glDrawArrays,问题就会出现?不确定我是否理解错了什么。但如果它简单地工作,这并不会太令人惊讶;近年来OpenGL支持通常有所改善。 - Vandroiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接