我正在尝试为iOS创建一个3D功能绘图仪。我已成功使用三角形条渲染图形,并通过线条实现绘制线框。但是如果我使用24位(或16位无关紧要)深度缓冲同时渲染两者,则线条会被多边形部分遮挡,使得它们看起来非常薄或完全消失。关闭4xMSAA无法解决问题。请参阅下图以获取示例。
只绘制线条很好 - 线条的厚度恰到好处。如果我对线条禁用深度缓冲,它们也会被正确绘制,但它们当然会出现在所有多边形上方(即多边形确实被多边形隐藏的线条)。我也试图减少多边形的透明度,但没有用。略微增加线的y坐标使它看起来更好,只要你从上面看它们,那么它们确实在那里的多边形前面。
为了获得最佳性能,我会在渲染之前将所有顶点数据和索引静态存储到顶点数组中。因此,我的渲染循环很短:
- (void)drawRect:(CGRect)rect
{
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self.effect prepareToDraw];
for (NSUInteger i = 0; i < _nVertexArrays; i ++)
{
glBindVertexArrayOES(_vertexArrays[i].vertexArray);
glDrawElements(_vertexArrays[i].mode, _vertexArrays[i].indexCount, GL_UNSIGNED_INT, NULL);
}
}
如何同时正确显示多边形和线框?我还想过将线条移动到更接近现在相机的位置,但我不知道如何在OpenGL ES中做到这一点,我不确定它是否会影响性能,因为这种转变取决于相机的当前位置。是否可以在绘制之前动态地将变换应用于线?