나는 다음 코드를 사용하여 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;
}
은 내가 선형을 위해 거기 밖으로 본 유일한 사람이기 때문에 올바른 알고리즘으로 사용하던 생각했다. 포인트 필터링에 있고 (기본 스프라이트 쉐이더에서 maded) 사용자 정의 선형 쉐이더를 사용하여 :
- 1º 질감을 :하지만이 중복 같은 질감과 단결을 사용했습니다.
- 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).