블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (666)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (105)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (217)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total343,756
Today5
Yesterday73

half 관련 문제는 intel만 있는줄 알았는데...

문제를 일으킨 핸드폰은 아래와 같다.
핸드폰 이름 : G3
모델 번호 : LG-F400K
Android 버전 : 6.0
GPU : Adreno TM 330


문제를 일으키지 않은 핸드폰

1.
핸드폰 이름 : G Pro
모델 번호 : LG-F240L
Android 버전 : 4.4.2
GPU : Adreno TM 320


2. 
핸드폰 이름 : SN-N900L, 삼성 갤럭시 노트3
모델 번호 : SN-N900L
Android 버전 : 5.0
GPU : Adreno TM 330


문제가 발생했던 코드는 아래와 같다.
float2 coord = i.uv.xy;
half4 color = tex2D(_MainTex, coord);
half3 b0 = tex2D(_Bloom0, coord).rgb * _BloomIntensity0;
half3 b1 = tex2D(_Bloom1, coord).rgb * _BloomIntensity1;

fixed3 outline = (color.r+color.g+color.b + b0.r+b0.g+b0.b + b1.r+b1.g+b1.b)*_BlurColor.rgb
color.rgb = lerp( outline, color.rgb, sign( (color.r + color.g + color.b)));

fixed blackOffset = 0.0;
float colorAlpha = (outline.r+outline.g+outline.b);
color.a = colorAlpha;
return color;
결과물에 _BlurColor 값이 적용이 안되는 버그가 발생했다.

이것 역시 half 자료형을 제대로 처리 해 주지 못해서 난 문제인듯 하다.
보통 color은 fixed를 사용하고 uv는 half를 높은 정밀도가 필요하면 float를 사용하는데
특정 폰에서만 문제가 발생해서 결국 아래와 같이 코드를 바꿔주었다.

fixed4 frag ( v2f_simple i ) : COLOR
{
        float4 finalColor = tex2D(_MainTex, i.uv);
        fixed3 b0 = tex2D(_Bloom0, i.uv).rgb * _BloomIntensity0;
fixed3 b1 = tex2D(_Bloom1, i.uv).rgb * _BloomIntensity1;

fixed3 outline = (finalColor.r+finalColor.g+finalColor.b + b0.r+b0.g+b0.b + b1.r+b1.g+b1.b)*_BlurColor.rgb;
finalColor.rgb = lerp( _BlurColor, finalColor.rgb, sign( (finalColor.r + finalColor.g + finalColor.b)));

finalColor.a = (outline.r+outline.g+outline.b);
return finalColor;

하지만 이렇게 하면 fixed를 잘 처리해 주는 애들까지 float를 써야 하는 거라서
그냥 왠만하면 아래와 같이 고치긴 했었다.

fixed4 finalColor;
fixed4 frag(...) : COLOR
{
      finalColor = tex2D(..,.);
}
하지만 이번에는 위와 같이 해도 되지 않아서 어쩔수 없이 float로 바꿔주었다.

그래서 결과론적으로 이렇게 결론을 내렸다.
fixed4 color;
float4 frag(..) : ..
{
..
}
위와 같이 반환값이 float인 경우는 함수 외부로 fixed4를 사용해도 된다. 
어차피 float4로 변환해서 반환될 테니까.

fixed4 frag()
{
float4 color;
...
}
위와 같은 경우는 최종결과값을 함수내부에 넣어줘야 한다.

칩셋들만의 fixed, half의 처리 방식이 틀려서 그런거니 어쩔수 없음.



'Unity > Unity Study' 카테고리의 다른 글

Unity 5.5 AssetBundle.LoadAssetAsync  (0) 2017.01.18
Optimizing Shader Load Time  (0) 2017.01.16
특정 android mobile chipset에서 half 문제  (0) 2016.09.21
shader tip with Intel  (0) 2016.09.08
unity bug with tegra k1  (0) 2016.09.03
unity material parameter 변경  (0) 2016.05.12
Posted by 붕대마음

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함