BeginPass() / EndPass()
이번에 프로그램을 쉐이더 기반으로 바꾸면서 참 이상한 곳에서 헤메고 있다.
일단 램버트비어법칙을 적용 한 간단한 조명 처리는 하였으나 몇가지 문제점이 발생했었다.
쉐이더 코드중 픽셀쉐이더 부분에서 출력 해 주는 부분은
return In.Color * 1.2f ;
으로 되어 있었는데 이렇게 놔두면 텍스쳐가 있어야 할 부분에 텍스쳐가 출력되질 않는다.
그래서 텍스쳐와 조명값을 같이 전달해 주도록 해 주었다. (곱센연산)
return tex2D(newSampler,In.Tex) * (In.Color * 1.2f) ;
이렇게 하면 또 문제점이 텍스쳐 부분은 정상적으로 나오지만 텍스쳐가 없는 부분은 텍스쳐의 값이 없기에 검은색으로 나왔다..
그래서 덧셈 연삼으로 바꾸어 보았다..............
return tex2D(newSampler,In.Tex) + (In.Color * 1.2f) ;
그럴싸 하게 나오는 것 같지만 역시나 텍스쳐 부분은 너무 밝아서 이건 안되겠다 싶었다.
이런 이유로 쉐이더 속에 플래그를 하나 설정해주고 텍스쳐 부분일 경우에는
return tex2D(newSampler,In.Tex) * (In.Color * 1.2f) ;
를 리턴 해주고 텍스쳐가 없는 부분일 경우에는
return In.Color * 1.2f ;
로 리턴을 해주도록 했다.
쉐이더 코드 쪽에는 문제가 없는데 이제 다시 렌더링을 처리하는 부분에서 문제가 생겼다.
바로 BeginPass() 와 EndPass() ...........
문법이 바뀐지 얼마 안된건지, 쉐이더 책들에는 BeginPass()와 EndPass()가 아닌 그냥 Pass() 로 나와있었다.
그냥 시작하는 부분에 BeginPass() EndPass() 였으면 얼마나 좋았을까..
하지만 이 녀석 속에서 쉐이더쪽으로 값을 전달해 주는거랑 밖에서 값을 전달해 주는 거랑 결과가 달랐다.
BeginPass() EndPass() 속에서 선언을 해야 할 때가 있고 밖에서 선언을 해야 할 때가 있는지..
BeginPass() EndPass() 속에서 텍스쳐값을 전달 해 주면 엉뚱한 텍스쳐값이 넘어가 버렸다. 게다가 주변의 환경에 따라 자꾸 텍스쳐들이 변경되어서 참 난감했다..
우선 텍스쳐값을 BeginPass() EndPass() 밖에서 전달 해 준걸로 해결은 했는데 확실히 알질 못해서 해결을 했는데도 아직도 머리만 아프다.
그리고 BeginPass 사이에서 값들을 전달해주면 정상적으로 변경이 되지 않고 마지막으로 전달해 준 값만 적용 되는 듯 싶었다.
플래그 값이 마지막으로 설정 해 준 값으로만 고정되어 있었다.
그래서 BeginPass() EndPass() 를 메쉬 부분마다 따로 지정해줬다.
pEffect -> SetTexture("Tex",텍스쳐);
pEffect -> SetBool("isTexture",true); // 플래그 값변경도 BeginPass 아래서 하니 제대로 적용이 되질 않았다
pEffect -> BeginPass(0);
pMesh -> DrawSubset(0);
pEffect -> EndPass();
pEffect -> SetBool("isTexture",false);
pEffect -> BeginPass(0);
pMesh -> DrawSubset(1);
pEffect -> EndPass();
아예 이런식으로..
해결은 했으나 더욱 더 미궁속으로 빠져든다 ㅠ_ㅠ
'Programming > DirectX' 카테고리의 다른 글
| D3DXCreateTextureFromFileEx() (4) | 2009/11/30 |
|---|---|
| Parallax Mapping (시차 맵핑) 의 위엄 (2) | 2009/11/21 |
| BeginPass() / EndPass() (2) | 2009/11/20 |
| 다중캐릭터 (0) | 2009/08/11 |
| Mesh Hierarchy Animation (0) | 2009/08/09 |
| LOD 적용 (4) | 2009/07/31 |


댓글을 달아 주세요
셰이더를 공부해야하지만 그전에 3D부터...ㅋ
어렵긴 한데 재밌어.. ㅋ_ㅋ