2

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

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();

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

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

4

1 回答 1

4

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

这假设顶点具有法线(但由于您在谈论“背对”,我认为它们确实如此)。

编辑

正如@derhass 正确指出的那样,这不起作用。

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

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

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

请注意,这只会导致视觉改进(看起来点被剔除),而不是性能改进。

只是出于好奇-您的应用程序是什么,为什么需要避免使用着色器?

于 2014-05-15T12:47:01.037 回答