3D그래픽2012. 6. 18. 21:29

오래(?) 전에 phong shading을 구현 했었는데, 한동안 다른 일들 때문에 손을 놓고 있었다.

그러다가 오랜만에 alpha blending이 필요한 texture를 적용해야 해서, 아무생각없이 alpha blending을 enable 시켰다.

그런데 뭐냐?-_-; alpha blending이 되기는 하지만, texture image의 alpha 값이 0인 부분도 색이 나타나는 것이 아닌가...;;

그래서 원인을 찾아보기 시작했다.

depth test는 비활성화 되어 있었고, culling을 껐다 켜 보기도 하고, texture image를 열어 alpha 값을 확인 해보기도 했지만 원인을 찾아 못했다.

혹시나, 구현한 shader 코드가 잘못되었나 싶어, goraud shading을 구현한 sample에 texture를 적용 해보기도 했는데, 여기서는 제대로 보였다. 이 shader에서는 fragment shader가 하는일은 vertex shader에서 계산된 lighting value를 texture에서 sampling 된 값과 곱하는게 다였다.


흠... 화면에 보이기는 하니까 fragment shader에서 뭔가 잘 못 되었다 싶어서, lighting이 계산된 값에서 alpha 값을 원본 texture의 alpha 값으로 바꿔보았다. 이번엔 되겠지...하면서. 그런데 그래도 똑같은거다!

그래서 입력으로 들어가는 모든 항목들의 alpha값을 확인 해 봤다.

원인은 역시나 alpha 값 이었다. orz


ambient term의 alpha 값이 1, emission의 alpha 값도 1. 거기다 speculation term을 계산할 때 입력되는 모든 color의 alpha 값도 1이었다! 즉, texture에서 가져온 diffuse term을 제외한 모든 color의 alpha 값이 1!!!!

그래서 계산된 결과값을 모두 더하면 alpha value는 항상 1이 되어서 이런 이상한 상황이 되었던 것!


그래서 구글링을 해 보니, D3D HLSL 소스인데, speculation term을 계산해서 RGB값만 사용하더라...;;

결국 모든 계산을 완료 한 후 alpha 값은 texture에서 가져온 diffuse term의 alpha 값으로 대치하였는데,

그렇다면 alpha 값은 lighting 연산에서 제외하는게 옳단 말인가?

상식적으로 그렇게 하는게 맞을 것도 같은데, 기본기가 없다 보니 헷갈린다.


오늘은 너무 늦었고, 내일부터는 교육이고. 다음주에나?@.@


Posted by 세월의돌