江南百景图技术点一:MultiTexture实现

大佬牛逼,就出方案了

大佬牛批,mark一波

取决于shader

图片大小有限制吗,就是2048X2048X8里面可以合成一个dc?

是的。。。

学习一波,感谢分享~

个人建议不要滥用这个技术,同时active的texture越多占用的显存带宽是很恐怖的,特别是在手机上,搞得好还好,搞不好你一个drawcall都能卡出翔。。。

2赞

我理解不管是否使用MultiTexture shader,纹理数量是一样的,所以显存占用没有变化。
带宽占用和纹理采样次数相关,和active的纹理数量无关。

不过对于这种实现我也有点疑问,虽然在运行效率上DC降了,但是shader的写法是用8个if挨个判断,shader编译后会有两种结果:
一种是编译器优化去掉了分支,即实际上所有分支都走一遍最后合并,相当于一次片元着色器采样8次,而且是采样不同纹理,cache miss问题也会加重,这种是很消耗带宽的。
另一种是产生branching,众所周知shader里产生branching会慢。

2赞

:+1: 是的,对于gl1除了if else应该没有什么办法,必定最高8倍带宽了。gl2应该可以texIds[uniform],不太确定没有试过。
(补充,对于gl1编译的结果我也不太清楚,if else也有可能是branching)

双刃剑,靠自己把握了。

编译结果取决于硬件

是的,需要自己根据项目权衡

实测是能把多纹理合并一个纹理,但是在实际用的时候比如A纹理里之前参与过合图,在正常使用该贴图里的某张精灵帧,发现并不能正常获取该精灵帧,已经乱了,是不是修改了uv坐标导致异常?希望能指教一下

乱了那肯定是没有去正确的合图里面取到内容了。

我的意思是比如我用了您的方法去拿A纹理里面的a精灵帧与B纹理里面的b精灵帧使用了您的方法实现MultiTexture,是显示没问题,正常的,但是会有个问题就是A纹理与B纹理没办法在其他地方正常使用了,比如我们某个功能要用到A纹理里的b精灵帧,就会发现取不到了,取到的位置会显示错误,不知道您这边有解决方案吗

你是不是在编辑器里面看是错乱的。如果你的textureIdx选对了,在浏览器里面看应该就是正常的。


textTexture是在您Layout用到的某个资源的纹理图其他的贴图,但是这边并没有使用到您这边的材质,不知道为什么会位置错乱了

你看看image textureIdx是不是填对了,然后不以编辑器的表现为准。

还有

:grinning:可以加个联系方式吗,可能我表达的有问题

我id就是我wx