我使用自定义顶点着色器渲染点数组。 着色器看起来像:
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的渲染是安全的吗?
答案 0 :(得分:11)
但我可以确定没有绑定VBO的渲染是安全的吗?
你不能。
OpenGL规范的核心配置文件(3.2及更高版本)明确指出应该允许它,您可以在禁用所有属性的情况下进行渲染。 OpenGL规范的兼容性配置文件或3.2之前的任何版本,只是明确说明您不能这样做。
当然,这无关紧要。 NVIDIA驱动程序允许您在任何OpenGL版本和配置文件上执行此操作。 ATI的驱动程序不允许您在任何OpenGL版本或配置文件上执行此操作。它们都是驱动程序错误,只是以不同的方式。
你只需要接受你需要一个虚拟顶点属性。但是:
但我需要很多顶点,我不想为它们存储假的VBO(它需要大约16mb的内存)。
虚拟属性将占用4个字节(单个浮点数或4个归一化字节向量。请记住:您不关心数据)。所以你可以在16MB中容纳400万个。
或者,您可以通过glDrawArraysInstanced使用实例化渲染。在那里,你只渲染一个顶点,但有num_vertices
个实例。当然,着色器必须使用实例ID。