- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我必须支持一些使用以下代码绘制点云的遗留代码:
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/
我目前正在尝试为我的世界实现平截头体剔除(再次)。我的世界由大小为 16x256x16 (x, y, z) 的块组成: Frustum frustum = Frustum(engine.proj *
有一个关于我的体素引擎的问题。从现在开始,我基本上是在最大限度地发挥我的发动机的性能,它已经变得非常出色,有时能够达到600fps,但有一个问题,我已经被困了一周,这有点糟糕。。所以就像我之前说的那样
我必须支持一些使用以下代码绘制点云的遗留代码: glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, (float
我有一个 GLSL 着色器,它根据一组贝塞尔曲线(点的 3d 坐标)绘制 3D 曲线。绘图本身是按照我的意愿完成的,除了遮挡不能正常工作,即在某些视点下,应该在最前面的曲线似乎仍然被遮挡,而反向:应该
我目前正在为一个学校项目开发我的第一个 3D 游戏,游戏世界完全受到我的世界的启发(世界完全由立方体组成)。我目前正在寻求提高尝试实现顶点缓冲区对象的性能,但我被卡住了,我已经实现了这些方法:Frus
我在 CPU 上实现了 Clip-Space Frustum Culling。在一个简单的简化案例中,我只是创建了一个基于 4 个不同点的矩形,我将在 GL_LINES 模式下渲染这些点。 但有时,在
我最近刚刚在我的体素游戏中添加了截锥体剔除;乍一看效果很好。然而,我立即注意到视锥体似乎有点偏离——因为窗口边缘附近的一些体素在完全脱离视觉范围之前被过早地切断。这是一张图片这说明了我的努力: 下面是
我是一名优秀的程序员,十分优秀!