"剔除"单个顶点 - glDrawArrays(GL_POINTS)

时间:2014-05-15 10:15:46

标签: c++ c opengl legacy culling

我必须支持一些使用以下代码绘制点云的遗留代码:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, (float*)cloudGlobal.data());

glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, (float*)normals.data());

glDrawArrays(GL_POINTS, 0, (int)cloudGlobal.size());
glFinish();

此代码渲染所有顶点,无论法线与“视线”之间的角度如何。我需要的只是绘制法线指向我们的顶点。

对于面孔,这将被称为“剔除”,但我不知道如何为单纯的顶点启用此选项。请建议。

1 个答案:

答案 0 :(得分:4)

您可以尝试使用照明系统(除非您已经需要它进行着色)。将环境颜色alpha设置为零,然后只需使用alpha测试丢弃零alpha的点。您可能需要在漫反射颜色中设置相当高的alpha值,以避免半透明点,以防需要进行Alpha混合以反映点(渲染光盘而不是正方形)。

这假定顶点有法线(但是因为你在谈论"面对"我认为它们确实如此)。

修改

正如@derhass正确指出的那样,这是行不通的。

如果您有立方体贴图纹理,也许您可​​以将法线复制到texcoord并从立方体贴图执行alpha查找(也可以结合纹理矩阵来考虑相机和点云变换)。

实际上,如果你的法线被标准化,你可以使用纹理矩阵将它们缩放到[-0.49, +0.49],然后使用简单的1D(或2D)条形纹理(半白,半黑 - 包括alpha)。请注意,违反直觉,这需要将纹理包装模式保留为默认值GL_REPEAT(不是钳位)。

如果您的点云具有某些封闭对象的形状,即使没有立方体贴图纹理,您仍然可以通过绘制带有glColorMask(0, 0, 0, 0)(仅写入深度)的虚拟网格来获得类似的行为,这将覆盖"覆盖& #34;面对的点。您也可以将这个网格生成为一组四边形,这些四边形放置在与它们法线相反的方向上的点后面,并且只能从另一侧看到,而不是这些点应该是可见的,从而覆盖它们。

请注意,这只会带来视觉上的改善(看起来像是剔除了点数),而不是性能提升。

出于好奇 - 您的申请是什么以及为什么需要避免着色器?