- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 opengl 在 android 上开发游戏,但遇到了一点性能问题。
例如,我想绘制一个部分填充有草“灌木丛”的背景。灌木有不同的 x、y、z、不同的大小等等(每个灌木都是一个 2D Sprite ),并且可能会部分隐藏彼此(我使用透视相机)。如果这些 Sprite 很大(即四边形尺寸,而不是纹理尺寸/分辨率),我会遇到很大的性能问题:
如果我使用经典的从前到后绘制(以避免过度绘制),我发现自己因为(我认为)alpha 测试而遇到问题。即使灌木丛只有不透明和完全透明的像素(没有部分透明度),并且如果我使用适当的 alpha 测试比较(GL_EQUAL 1),性能也会很差,因为很多像素必须经过 alpha 测试(如果我理解正确的话) .
如果我在禁用 alpha 测试的情况下使用从后到前的显示,我也会损失很多性能(但这次是因为 overdraw 问题),即使在禁用深度缓冲区写入时也是如此(不确定它是否会执行任何操作)顺便说一句,深度测试被禁用了)。
如果在没有 alpha 测试的情况下从前到后使用,我会有很好的表现,但当然 sprite cutout 完全消失了,这真的很糟糕。
所有的灌木都有相同的纹理,我使用 16 位颜色、mip 映射、几何批处理、剔除面、无着色器等。所有我能想到的提高性能的方法(在其他情况下都不错),除了纹理压缩。我什至过滤 Sprite 以避免将它们“显示”在屏幕之外。我还尝试了一些出于测试目的的“剧烈优化”,例如使纹理完全不透明、大幅降低纹理分辨率、禁用混合等,但除了 alpha 测试删除之外,没有什么是很棒的性能。
我想知道我是否忘记了一些有助于提高性能的东西。从后到前会造成 overdraw ,从前到后由于 alpha 测试很慢(而且我不希望我的灌木丛是“方形”图像,所以我不能禁用 alpha 测试)。如果我创建更小的 Sprite ,性能会好得多(即使有更多的 Sprite ),但这只是一种解决方法。
总而言之,如何在不损失性能的情况下显示需要剪切的重叠大四边形?
附言:我正在测试 nexus one。
PS2:一些优化建议不要创建四边形,而是创建更“适合”纹理的几何体,但这似乎是一个非常乏味的过程,而且我认为对我帮助不大。
最佳答案
由于 early-z,从前到后绘制通常是一个好处:硬件可以在光栅化之后立即进行深度测试,然后再进行纹理获取或着色。使用从前到后的排序,大多数 fragment 都无法通过深度测试,并且您可以节省大量的纹理带宽、着色吞吐量和 zbuffer 写入带宽。
但是 alpha 测试打破了这一点。如果一个 fragment 通过了深度测试,它可能仍然会被 alpha 测试杀死,所以 zwrite 在纹理/着色之前不会发生。大多数可以执行 early-z 的硬件仍然必须在管道中与 zwrite 相同的点进行深度测试,因此对于 alpha 测试,您最终会在纹理和着色之后执行 ztest + zwrite。因此,从前到后的排序只会节省您的 zwrite 带宽,没有别的。
如果你真的想要明显重叠的大 Sprite ,我认为你有两个选择:
(a) 只为您的 Sprite 使用两个或三个不同的 Z 值。通过混合(和 alpha 测试,如果有帮助的话)从后到前绘制它们。层内无重叠:您可以在原始 Assets 中或在运行时预渲染每个层,然后左右移动它。
(b) 如果您的 sprite 具有被半透明边框包围的大不透明区域,您可以在不进行 alpha 测试的第一遍中绘制不透明区域,然后单独绘制边框。这将减少经过 alpha 测试的 fragment 的数量。
关于android - OpenGL/Android 大 Sprite 四边形表现不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16572254/
我确实遇到了这个问题。 我有一个可以是任何形状的多边形(四边形)。当我的鼠标位于多边形内时,我需要找到鼠标所在位置(四边形内)的 x,y 值,就好像多边形是完美的正方形一样。进一步解释;我有一个 32
我的问题是关于 OpenGL 和法线,我理解它们背后的数学原理,并且我取得了一些成功。 我在下面附加的函数接受一个交错的顶点数组,并计算每 4 个顶点的法线。这些代表具有相同方向的 QUADS。据我了
我想检测图像中的矩形。 我使用 cv2.findContours() 和 cv2.convexHull() 过滤掉不规则多边形。 之后,我将使用船体长度来判断轮廓是否为矩形。 hull = cv2.c
有谁知道将 vector 路径转换为由三角形/四边形面组成的描边路径的好算法?理想情况下使用圆线连接。 基本上,我试图绘制一条粗路径,其颜色基于随路径距离变化的值。我正在考虑将路径转换为三角形/四边形
我有 WebGL/OpenGL 的基本知识,但不了解 gl.bufferSubData。所以我的目标是创建一个 SpriteBatch 类,就像这个问题 First Question 一样。由于我认为
我用 OpenGL 渲染两个具有相等 z 的四边形。当我启用 DEPTH 时,我得到以下图像,但当它关闭时,我得到我需要的一个水果而不是另一个。是否可以按我的意愿绘制具有相等 z 的四边形?我的 OG
我一直在尝试让模板测试在我的 OpenTK 2D 游戏中工作,但没有成功 - 我只想在模板缓冲区中绘制低于 say 1 值的纹理部分。花了很长时间阅读模板及其工作原理,但在 C# 中找不到一个示例。下
我有一个 2D 空间,其中包含任意数量的对象(它们是圆形或四边形 - 这无关紧要),在每个时间刻度中具有不同的大小和不同的位置。我想为任何基元(示例图片中的绿色圆圈)找到一个 y 位置,使其不与任何其
我是一名优秀的程序员,十分优秀!