2014-06-11 1 views
0

기하학 쉐이더를 사용하여 렌더러 (TressFX 용)를 확장하려고하므로 모든 것이 제대로 작동하는지 확인하기 위해 babysteps를 사용하고 있습니다. 따라서 삼각형을 위해 작동하는 Simpel Pass-Through Geometry Shader를 만들었지 만 출력을 볼 수 없기 때문에 어떤 이유로 선이나 점 (삼각형을 선과 점으로 변환)에 사용할 수 없습니다. Result linkHLSL : Triangle-2-Points/Lines 기하학 쉐이더 문제

왜 누군가가 선과 점에서 작동하지 않는지 지적 할 수 있다면 기쁠 것입니다.

코드

ASetPrimitiveTopology가

정점 셰이더

struct PS_INPUT_HAIR_AA 
{ 
    float4 Position : SV_POSITION; 
    float4 Tangent : Tangent; 
    float4 p0p1  : TEXCOORD0; 
}; 

PS_INPUT_HAIR_AA VS_RenderHair(uint vertexId : SV_VertexID) 
{ 
    PS_INPUT_HAIR_AA Output = (PS_INPUT_HAIR_AA)0; 

    Calculate position etc... 

    Output.Position = mul(float4(v, 1), g_mViewProj); 
    Output.Tangent = float4(t, ratio); 
    Output.p0p1  = float4(v.xy, g_HairVertexPositions[vertexId+1].xy); 

    return Output; 
} 

형상 (일)에 대한 삼각형 쉐이더을 D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST 설정된다

기하학

[maxvertexcount(64)] // more than enough 
void GS_RenderHairPassThrough(triangle PS_INPUT_HAIR_AA input[3], inout PointStream<PS_INPUT_HAIR_AA> OutputStream) 
{ 
    PS_INPUT_HAIR_AA output = (PS_INPUT_HAIR_AA)0; 

    for(uint i = 0; i < 3; ++i) { 
     output.Position = input[i].Position; 
     output.Tangent = input[i].Tangent; 
     output.p0p1  = input[i].p0p1; 
     OutputStream.Append(output); 
     OutputStream.RestartStrip(); // Not sure if I need this 
    } 
} 

[maxvertexcount(64)] // more than enough 
void GS_RenderHairPassThrough(triangle PS_INPUT_HAIR_AA input[3], inout LineStream<PS_INPUT_HAIR_AA> OutputStream) 
{ 
    PS_INPUT_HAIR_AA output = (PS_INPUT_HAIR_AA)0; 

    for(uint i = 0; i < 3; ++i) { 
     output.Position = input[i].Position; 
     output.Tangent = input[i].Tangent; 
     output.p0p1  = input[i].p0p1; 
     OutputStream.Append(output); 
    } 
    OutputStream.RestartStrip(); 
} 

그러나 점과 선에 대한 쉐이더 (작동하지 않는) 경우 I 하드 코드 포인트의 output.Position은/라인 통과 지오메트리 쉐이더를 내가 얻을 관리 할 수 ​​있습니다 나는 화면에서 볼 수있는 출력.

답변

0

기하학적 셰이더에서 원시 토폴로지를 변경할 수 있다고 생각하지 않습니다. 메쉬를 선/점으로 렌더링하려면 렌더링 함수에서 그 점을 아래와 같이 설정하십시오. 당신은, 당신은 내가 볼

void GS_RenderHairPassThrough(line PS_INPUT_HAIR_AA input[3], inout PointStream<PS_INPUT_HAIR_AA> OutputStream) 
or 
void GS_RenderHairPassThrough(point PS_INPUT_HAIR_AA input[3], inout PointStream<PS_INPUT_HAIR_AA> OutputStream) 

당신이 GS_RenderHairPassThrough

의 첫 번째 인수로 그들 모두 triangle을 사용하여 사용해야합니다 지오메트리 쉐이더의 기본 유형을 변경하려는 경우

g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINELIST); 
or 
g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_POINTLIST); 

또 다른 한가지는