2012-12-13 1 views
-1

내 질문에 희망적으로 매우 간단하지만 올바른 데이터 흐름을 얻지 못하는 것 같습니다. 문제는 버텍스 쉐이더에서 테셀레이션 단계 (선체 및 도메인 쉐이더)와 렌더링을 위해 픽셀 쉐이더를 통해 텍스처 좌표와 일반 ​​데이터를 전달하는 방법입니다.Tessellation을 사용하는 HLSL에서 매개 변수 전달

내가 겪고있는 문제는 테셀레이션을 사용하기 전에 데이터가 정점에서 픽셀 쉐이더로 간단히 전달 될 수 있다는 것입니다. 이제이 두 쉐이더 사이에 패치 상수 함수 인 쉐이더 셰이더와 도메인 쉐이더 사이에 여러 단계가 있습니다.

각 섹션을 통해 데이터를 전달하는 방법에 대해 누구나 통찰력을 줄 수 있으며 가능하다면이를 증명할 수있는 빠른 의사 코드가 있으면 매우 감사 할 것입니다. 더 많은 정보 또는 현재 코드가 필요하다면 (작동하지 않더라도) 알려주십시오.

추가 정보 :이 프로그램은 HLSL을 사용하는 DirectX 11 API를 사용하여 C++로 작성되었습니다.

+0

나는 downvote하지 않았다, 그러나 나는 당신의 질문이 SO를 위해 조금 넓다고 생각한다; 시도를하고, 시도한 것을 보여주고, 다른 사람들이 더 잘 도움을 줄 수 있습니다. – Rob

+0

안녕하세요, 죄송합니다, 내가 여러 파일에 걸쳐 있기 때문에 어떤 코드를 게시하고 싶지 않았고 크기가 꽤 큽니다. 테셀레이션을 사용할 때 셰이더의 데이터 흐름에 대한 몇 가지 통찰력을 기대하고있었습니다. –

답변

0

이것은 테셀레이션을 만드는 데 사용한 코드입니다. 필요한 코드 만 표시하도록 코드를 숨 깁니다. ps : tess_factor는 상수 버퍼의 매개 변수입니다.

HS_OUTPUT_DATA hs_patch(InputPatch<VERTEX_PASS, 3> ip, uint pid : SV_PrimitiveID) 
{ 
HS_OUTPUT_DATA ret; 
float tess = tess_factor; 
ret.edges[0] = ret.edges[1] = ret.edges[2] = tess; 
ret.inside = tess; // same value that edges 
return ret; 
} 

[domain("tri")] 
[partitioning("integer")] // integer, fractional_even, fractional_odd 
[outputtopology("triangle_cw")] 
[outputcontrolpoints(3)] 
[patchconstantfunc("hs_patch")] 
HS_OUTPUT hs(InputPatch<VERTEX_PASS, 3> ip, uint index : SV_OutputControlPointID) 
{ 
HS_OUTPUT ret; 
ret.pos = ip[index].pos; 
return ret; 
} 

[domain("tri")] 
VERTEX_PASS ds(HS_OUTPUT_DATA input, float3 dl : SV_DomainLocation, const  
OutputPatch<HS_OUTPUT, 3> bp) 
{ 
    VERTEX_PASS ret; 
    ret.pos = bp[0].pos * dl.x + bp[1].pos * dl.y + bp[2].pos * dl.z; 
    return ret; 
} 
0

Vertex, Hull, Domain 및 Pixel Shader의 상수 버퍼가 분리되어 있습니다. 응용 프로그램의 코드에서 사용하는 상수 버퍼에 매개 변수를 설정하십시오.

ID3D11DeviceContext::PSSetConstantBuffers 
ID3D11DeviceContext::HSGetConstantBuffers 

첫 번째 함수는 상수 버퍼를 Pixel Shader 사용으로 설정합니다. 선체 쉐이드를위한 두 번째 세트. 그러나 귀하의 경우에는 구조체를 사용하여 매개 변수를 전달해야합니다.

struct VERTEX_PASS 
{ 
    float4 pos : SV_POSITION; 
    float4 color : COLOR; 
}; 

struct HS_OUTPUT_DATA 
{ 
    float4 pos : WORLDPOS; 
    float4 color : COLOR; 
    float edges[3] : SV_TessFactor; // not using in this example 
    float inside : SV_InsideTessFactor; // not using in this example 
}; 

HS_OUTPUT_DATA hs_patch(InputPatch<VERTEX_PASS, 3> ip, uint pid : SV_PrimitiveID) 
{ 
    HS_OUTPUT_DATA ret; 
    ret.color = ip[pid].color; // pass the color to forward 
    return ret; 
} 

텍스처 좌표가 같은 생각이지만, 색상은 도메인 쉐이더 단계에서, 텍스처 좌표의 경우, 모든 정점에서 일정, 새 UV를 계산해야합니다에만 색상을 전달하는 내 코드입니다 최종 꼭지점 위치를 계산하는 것처럼 좌표.

0

오류 메시지와 같은 상황을 설명하지 않았으므로 간단한 예제가 필요하다고 생각합니다.

여기 하나 : http://www.rastertek.com/dx11tut38.html

이 저자는 간단하게 거의 모든 코드를 설명, 당신은 테셀레이션 단계의 부분은 렌더링 파이프 라인의 각 단계 사이의 데이터 구조를 정의하는 방법을 이해하고 볼 수 있습니다.

또한 디버그 정보가 활성화 된 쉐이더 코드를 컴파일하는 것이 좋습니다. http://msdn.microsoft.com/zh-tw/library/windows/desktop/ff476261(v=vs.85).aspx

쉐이더 프로그램의 문제점을 알면 즉시 해결할 수 있습니다.

아래에 댓글을 달려고했지만 어떻게 든 댓글 버튼이 사라졌습니다.