sonraki kodu kullanarak Unity3D otomatik çift doğrusal filtreleme algoritması çoğaltmak çalışıyorum:Bu teknik, doğrusal olmayan filtreleme değilse nedir?
fixed4 GetBilinearFilteredColor(float2 texcoord)
{
fixed4 s1 = SampleSpriteTexture(texcoord + float2(0.0, _MainTex_TexelSize.y));
fixed4 s2 = SampleSpriteTexture(texcoord + float2(_MainTex_TexelSize.x, 0.0));
fixed4 s3 = SampleSpriteTexture(texcoord + float2(_MainTex_TexelSize.x, _MainTex_TexelSize.y));
fixed4 s4 = SampleSpriteTexture(texcoord);
float2 TexturePosition = float2(texcoord)* _MainTex_TexelSize.z;
float fu = frac(TexturePosition.x);
float fv = frac(TexturePosition.y);
float4 tmp1 = lerp(s4, s2, fu);
float4 tmp2 = lerp(s1, s3, fu);
return lerp(tmp1, tmp2, fv);
}
fixed4 frag(v2f IN) : SV_Target
{
fixed4 c = GetBilinearFilteredColor(IN.texcoord) * IN.color;
c.rgb *= c.a;
return c;
}
ben bilenear için orada gördük tek olduğu için doğru Algoritmlerin kullanıyordum düşündü. Nokta filtreleme içinde ve (varsayılan peri gölgelendirici maded) özel çift doğrusal shader kullanarak:
- 1º dokusunu: Ama çoğaltılamaz aynı doku ile birlik kullanarak çalıştı.
- 2º doku: Varsayılan sprite shader
ile Bilinear filtresinde Ve bu sonucudur:
Onların farklı olduğunu görmek ve ayrıca bazı yoktur yapabilirsiniz Z ekseni içinde dönerken hareketli grafiğin merkez dışında kalmasını sağlayan yer değiştirmem.
Neyi yanlış yaptığım hakkında bir fikrin var mı? Unity3D ne yapıyor hakkında herhangi bir fikrin var mı? Unity3D varsayılan filtrelemeye uyan başka bir algoritma var mı?
Çözüm
burada arayın diğer kişiler için Nico'nun kodu ile komple kod çözümü ile Güncelleme:
fixed4 GetBilinearFilteredColor(float2 texcoord)
{
fixed4 s1 = SampleSpriteTexture(texcoord + float2(0.0, _MainTex_TexelSize.y));
fixed4 s2 = SampleSpriteTexture(texcoord + float2(_MainTex_TexelSize.x, 0.0));
fixed4 s3 = SampleSpriteTexture(texcoord + float2(_MainTex_TexelSize.x, _MainTex_TexelSize.y));
fixed4 s4 = SampleSpriteTexture(texcoord);
float2 TexturePosition = float2(texcoord)* _MainTex_TexelSize.z;
float fu = frac(TexturePosition.x);
float fv = frac(TexturePosition.y);
float4 tmp1 = lerp(s4, s2, fu);
float4 tmp2 = lerp(s1, s3, fu);
return lerp(tmp1, tmp2, fv);
}
fixed4 frag(v2f IN) : SV_Target
{
fixed4 c = GetBilinearFilteredColor(IN.texcoord - 0.498 * _MainTex_TexelSize.xy) * IN.color;
c.rgb *= c.a;
return c;
}
Ve sonuçla görüntü testi:
Neden tam olarak 0.5 çıkarma?
Eğer test ederseniz, atladığı bazı kenar durumlarını göreceksiniz (piksel - 1).