Opengl,DrawArrays没有绑定VBO

时间:2011-11-07 17:08:50

标签: opengl vbo fbo

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

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 个答案:

答案 0 :(得分:11)

  

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

你不能。

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

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

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

  

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

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

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