8

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

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 的渲染是安全的吗?

4

1 回答 1

13

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

你不能。

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

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

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

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

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

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

于 2011-11-07T19:26:37.153 回答