gpt4 book ai didi

c++ - "Culling"用于单个顶点 - glDrawArrays(GL_POINTS)

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:35 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

这假设顶点有法线(但因为你说的是​​“背对着”,我假设它们有法线)。

编辑:

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

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

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

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

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

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

关于c++ - "Culling"用于单个顶点 - glDrawArrays(GL_POINTS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com