日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

大量贴图采样限制下的渲染处理方法

發布時間:2024/3/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大量贴图采样限制下的渲染处理方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

因為項目中有換裝系統,換裝系統中有大量的可替換的臉部數據,比如眉毛,睫毛,腮紅,眼影,口紅等,需要十多個貼圖通道。所以我們的shader中需要有十多張貼圖通道

跑再android機器上時,一切都正常顯示。但跑再iphone8時,就會發現材質丟失了

然后查到的報錯信息是采樣次數過多,機器不支持這個采樣次數。iphone8是9個

基于這個問題,有兩種解決方案

第一種:

把多個貼圖合并,也就是再到gpu之前先把所有貼圖合并成一個貼圖,然后給gpu渲染一次。

var pixels = tex.GetPixels32();for (int j = 0; j < pixels.Length; j++){if (pixels[j].a != 0){if (j < colors.Length){var realJ = j;var newPixel = pixels[realJ] * (color * 255);var curColors = colors[realJ];var dstColors = Color32.Lerp(curColors, newPixel, (float)newPixel.a / 255.0f);colors[realJ] = new Color32((byte)(curColors.r > 0 ? (dstColors.r) : newPixel.r),(byte)(curColors.g > 0 ? (dstColors.g) : newPixel.g),(byte)(curColors.b > 0 ? (dstColors.b) : newPixel.b),(byte)(curColors.a > 0 ? (dstColors.a) : newPixel.a));}}}

寫入shader:

var faceOtherShader = Shader.PropertyToID("_FaceOtherMap");bodymat.SetTexture(faceOtherShader, texture2d);

優點:這樣減少了貼圖數量,消耗也更少了,帶寬消耗自然也更小了。

缺點:但這樣做的問題是每次換裝時都需要合并一次貼圖,會有明顯的卡頓,效果也并不是很好。

?

第二種

分兩個材質放貼圖

也就是第一個做光照模型的渲染,第二個做貼圖渲染

盡量讓兩個材質的貼圖采樣個數都小于9個。讓光照模型材質(AvatarMat)先渲染,貼圖渲染(AvatarFaceTexture)后渲染。

然后跑到iphone8上,確實不會出現材質丟失的紫色了。

但是出現了一個問題:

就是腮紅,嘴唇等都會閃爍。

然后看了下這張rt的alpha通道

越白說明alpha越高,可以看到眼睛旁邊和嘴巴旁邊都有半透明的效果。

查找原因:

看了下shader發現

Blend SrcAlpha OneMinusSrcAlpha

混合模式只用了這個。因為這個blend方式是也會把alpha通道做混合的。

然后我們進行分析

先渲染的avatarmat中是不透明的

但后面處理的avatarfacetexture里是有透明

然后混合用Blend SrcAlpha OneMinusSrcAlpha混合公式后得到的是一個帶透明的效果,因為后面在處理的face時,因為alpha是不為1的,所以frontcolor*alpha+backcolor*(1-alpha)肯定得到的是一個半透明的值。

比如:

facetexture當前像素是(0.8,0.8,0.8,0.8)avatarmat的像素是(1,1,1,1)

計算過程:(0.8,0.8,0.8,0.8)*0.8+(1,1,1,1)(1-0.8)=(0.84,0.84,0.84,0.84)

也就是最后的alpha值是0.84,所以是透明的,所以會顯示背景而導致半透明區域是閃爍的。

那么解決辦法也很簡單,就是區分color的混合和alpha的混合。

因為blend有一種模式可以區分color和alpha的混合。

Blend SrcFactor DstFactor, SrcFactorA DstFactorA

也就是前面兩個是顏色混合,后面兩個是顏色混合。正是我們想要的。所以最后的混合方式是

Blend SrcAlpha OneMinusSrcAlpha,One One

問題就解決了

當然這里還要注意FaceTextureshader要做小量的深度偏移,不然會跟身體重疊比較嚴重,導致閃爍發生

優點:切換貼圖不會卡頓,順暢過度

缺點:貼圖采樣數量還是一樣多,所以會產生帶寬過高的問題

以后的優化點可以考慮部分貼圖合并減少貼圖數量。

?

總結

以上是生活随笔為你收集整理的大量贴图采样限制下的渲染处理方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。