Я пытаюсь повторить автоматический билинейной алгоритм фильтрации в Unity3D используя следующий код:Что это за техника, если не билинейная фильтрация?
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;
}
Я думал, что с помощью правильного АЛГОРИТМ, потому что это только один я видел там для билинейной. Но я попробовал его, используя единство с той же текстурой дублируется:
- 1º текстуры: находится в фильтрации точек, и с использованием пользовательских билинейной шейдер (maded из спрайтов шейдера по умолчанию).
- 2º текстуры: в билинейной фильтр с спрайтов по умолчанию шейдер на
И это результат:
Вы можете видеть, что они различны, а также есть некоторые перемещение в моем пользовательском шейдере, что делает спрайт неактивным при вращении по оси Z.
Любая идея о том, что я делаю неправильно? Любая идея о том, что делает Unity3D другим? Есть ли еще один алгоритм, который подходит для фильтрации Unity3D по умолчанию?
Решение
Обновленные с полным решением коды с кодом Нико для других людей, которые ищут для него здесь:
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;
}
И тест изображения с результатом:
Почему бы не вычесть 0,5 точно?
Если вы протестируете его, вы увидите некоторые кромки, где он скачет (пиксель - 1).