Opengl,DrawArrays没有绑定VBO

Rom*_*kov 8 opengl fbo vbo

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

void mainVP()
in varying int    in_vertex_id : VERTEXID
{
    foo(in_vertex_id);
}
Run Code Online (Sandbox Code Playgroud)

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

我尝试运行我的代码而不绑定任何VBO.有用.所以我的渲染看起来像:

size_t num_vertices = ...
glDrawArrays(GL_POINTS, 0, num_vertices);
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*las 12

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

你不能.

OpenGL规范的核心配置文件(3.2及更高版本)明确指出应该允许它,您可以在禁用所有属性的情况下进行渲染.OpenGL规范的兼容性配置文件或3.2之前的任何版本都明确表示您无法执行此操作.

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

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

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

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

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

  • 这些信息过时了吗?我刚刚尝试了一个在Radeon上渲染空VAO的程序,并且效果很好,就像在Nvidia GPU上一样。面向OpenGL 4.3 / GLSL 430。 (2认同)