rastertek.com에서 dx11 튜토리얼 공부 ⇒ hlsl 코드 이해
⇒ LocalSpaceRendering인 경우의 if 블럭에서 line shape 패턴 인스턴스에 대한 matrix의 offset 부분(_m30_m31_m32)에 input.offset을 할당해 줌 ⇒ 위치 벗어났던거 수정됨
shape의 원래 모델은 polyline인데 polyline의 각 점만 표현됨 ⇒ shape node의 렌더 테크닉의 default shader list 중 GS와 PS가 각각 GSPointClipPlane 과 PSPoint인 점 의심 ⇒ GS는 GSLineClipPlane, PS는 PSLine으로 변경했더니 약간의 문제(아래)가 있지만 polyline이 정상적으로 표시됨
상기된 문제: polyline으로 구성된 shape이 일부가 안보임 ⇒ 자세히(확대해서) 보니까 점점 흐려지는거같음(fading 관련인가 의심)
(비정상 케이스의 화질이 구린것을 감안하세요)
정상

비정상 - 화살표의 일부가 뜯어먹힌것처럼 보임

fading 관련은 pixel shader에서 계산되는거로 보여서 렌더테크닉의 PSLine → PSLineColor로 변경했더니 정상적으로 출력됨
PSLineColor로 변경하는게 올바른 해결 방법이 아닌 것으로 보임(patternLength에 따른 계산 등이 없고 그냥 받은 그대로 색상 표현하므로)
psLine의 if (patternLength >0) 아래 블럭에서
float4 texColor = texDiffuseMap.SampleLevel(samplerBillboard, input.tex.xy, 0);부분의
input.tex.xy를 input.tex.yz 로 변경했더니 사라진 라인 구성이 변함(다른 부분이 사라짐)
psLine은 line shape node가 아닌 일반 다른 line 관련된 모델을 렌더링 하기 위해서도 쓰이고 있고 정상작동 하므로 위 코드의 texColor를 계산하는 방법이나 파라미터형식 잘못됐을 확률(input.tex.yz라고 해야 했다던가)은 적어 보임 ⇒ input.tex의 값이 틀렸을 경우부터 확인
해당 모델의 Shader path는 다음과 같은 단계의 렌더링 파이프를 거친다
- 픽셀 쉐이더:
vsPointClipInstancing- Clipping과 Instancing(라인 타입 패턴에 대한 인스턴스) 정보만 추가로 가지고vsPoint쉐이더의main함수 호출 ⇒ 결국vsPointLine - 지오메트리 쉐이더:
GSLine - 픽셀 쉐이더:
PSLine
PSLine의 input.tex는 GSLine에서 결정해주는데
output.tex = float3(texMin, ?, polyLineLength);
또는
output.tex = float3(texMax, ?, polyLineLength);여기서 ?는 대충 조건에 따라 특정 int타입 값이 들어가는 모양새
polyLineLength 부분은 픽셀 쉐이더PSLine 에서 input.tex.xy처럼 z성분을 사용하지 않으므로 상관 없고
그러면 이 texMin과 texMax는 어디서 정의하는지 보면
float texMin = segmentStartOffset / max(1e-5, texScale); // start u
float texMax = (segmentStartOffset + segmentLength) / max(1e-5, texScale); // end u그리고 segmentStartOffset과 segmentLength는
float segmentLength = length(input[startIndex].wp.xyz - input[startIndex + 1].wp.xyz);
float segmentStartOffset = input[startIndex].offset;여기서의 input이라 하면 vsPointClipInstancing ⇒ vsPointLine 에서 전달해 준건데, 처음에 shape의 위치 관련 오류를 수정할 때 코드를 보면서 vsPointLine 에서 input.offset에다가 무엇을 할당해 준 기억이 없다. 그런데
float segmentStartOffset = input[startIndex].offset;내가 할당해준 적 없는(기존 코드에서도 할당하는 부분이 없었음) input.offset을 여기서 사용하고 있음
vsPointLine로 가서 InstancingParam이 있는 경우의 if 블럭 안에서
output.offset = input.offset;을 추가해 주었다. offset 은 다른 점들에 대한 world, view, projection 매트릭스 연산을 안해줘도 되는가? 싶지만 일단 넣음
성공
CommonBuffer는 Material에 따라 정해지는것으로 보이는데 line의 경우 Pointline 인듯