我已经能够让我的2D渲染器显示透明的断线纹理,方法是测试片段的alpha值,如果它小于1(或任何分数真的)。问题是我想支持使用半透明的纹理。
目前我对精灵进行排序的方法是根据它们使用的纹理来排序,这样我就可以最小化纹理的变化。我唯一能想到让它正常工作的方法就是废除它,只按z顺序排序。但我不想放弃我已经做过的优化。有办法两者兼顾吗?
仅仅在2D中渲染会简化问题吗?
我希望支持半透明精灵,但我的字体渲染器制造半透明的字体纹理,所以我不能只使用剪贴画。
编辑:在做了一些研究之后,似乎真的没有简单的方法可以做到这一点。( 2D渲染器的深度剥离似乎有点过了)我要妥协,让我的渲染器持有两组不同的精灵,剪刀和半透明。我可以先画剪贴画,以我想要的任何顺序,充分利用纹理地图集。然而,半透明的纹理将需要以z顺序排列,而忽略地图集.
如果有人能告诉我更好的方法,我会全神贯注的。
发布于 2013-12-18 21:38:39
在用XNA游戏工作室4.0实现三维图形中给出了这个问题的解决方案(本书的XNA和directX与解决方案无关)。虽然该方法在技术上是不完善的,并且作为广告牌的解决方案,但当禁用深度缓冲区和z排序是一种不可行的方法时,该方法仍然有效。
该问题被描述为需要深度缓冲,以避免纹理错误重叠,但不希望被透明遮掩的多边形掩盖:
解决方案是绘制所有这些精灵两次,使用不同的着色器设置,每次通过。
在第一遍中,只有当“固体”像素不被另一种更高深度的纹理所遮蔽时,它们才会被绘制出来。在第二种情况下,半透明像素将被绘制到任何地方,并混合在一起。
这种解决方案的不完善之处在于,中高阿尔法像素有可能不正确地模糊中低阿尔法像素。这种效果只发生在精灵被从z阶提取出来时,并且只发生在已经是alpha混合的像素上。因此,效果是最小的,应该可以通过调整alpha截止值来减轻它。
https://gamedev.stackexchange.com/questions/51202
复制