在我的 Android 应用程序中,我需要显示一个 3D 对象(这没问题),但前边缘应该是实心的,后边缘应该是虚线的。我需要有像图片上这样的东西。如何使用 OpenGL ES 1 或 2 实现它?
我尝试过蒂姆的想法(使用深度缓冲区)。它有效,但有一些伪像,如图片所示,虚线(紫色)线与实线(红色)线重叠:
发生这种情况是因为虚线(紫色(GL_GREATER))是在红线(GL_LEQUAL)之后绘制的。
有什么想法如何预防吗?
Thank you everyone for helping. Now it looks great!!
这是我要做的事情的粗略轮廓。您需要一个用于对象本身的网格,以及另一个用于您要绘制的“边缘线”的 GL_LINES 网格。
- 将实体网格绘制到深度缓冲区中。
- 使用标准着色器绘制“边缘网格”,以便获得实线,但将深度测试设置为 GL_LEQUAL(仅绘制比深度值更近的对象。
- 使用 GL_GREATER 深度测试第二次绘制边缘网格。在此通道中,使用点画着色器来获得虚线效果(下面将进一步解释)。
这可能会出现问题,具体取决于场景中的其他对象,因为在立方体被其他物体遮挡的情况下,您可能会绘制虚线,但也许这对您来说不是问题,或者您可以以某种方式剔除网格,如果它被遮蔽了。
对于点画着色器,您可以将线条的一个顶点的纹理坐标设置为零,并将线条的另一个端点设置为 1。然后在您的着色器中,您可以使用类似于建议的步骤函数tencent,拒绝片段以创建点画图案。
如果您想自己计算哪些线位于对象后面,您也可以跳过深度缓冲区的混乱,尽管对于除立方体以外的任何东西可能需要大量工作。
如果您想使用 OpenGLES 1 而不是 OpenGLES 2,请将点画着色器替换为点画图案的 1D 纹理,并用它来纹理化背线。然而我不是 100% 确定你可以在 OpenGL 中对一条线进行纹理处理,所以这可能行不通。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)