2017-04-21 6 views
1

더 두꺼운 선을 생성하기위한 기하학 셰이더를 작성했습니다. 하지만 이제는 문제가 생겼습니다. [clipplanes(...)] 속성이 작동하지 않습니다. 경고가 :클리핑 라인이 추가 된 기하학 셰이더

심각도 코드 설명 프로젝트 파일 라인 억제 상태 경고 X3554 알 수없는 속성 clipplanes, 또는이 명령문에 대해 유효하지 않은 속성이 유효한 속성은 다음과 같습니다 maxvertexcount, MaxVertexCount, 예를 CRenderer \ 쉐이더 \ 지오메트리 셰이더 \ GS_GenerateThickLines. hlsl

내 자신에게 삼각형의 클리핑을 쓸 수있는 옵션이 있다는 것을 알고 있지만, 나에게는 너무 무성한 노력처럼 보입니다. 기하학적 셰이더에서 추가 클립 보드를 사용하는 방법이 있습니까? 또 다른 생각 : 기하학 쉐이더가 라인 (2 개의 Vertices)에 들어가고 버텍스 쉐이더 내부에서 [clipplanes(...)] 속성이 작동합니다 ... 어떻게 든 기하학 쉐이더 내부의 원래 정점 대신 클리핑 포인트를 얻을 수 있습니까? 자세한 내용은 당신은 여기 내 지오메트리 쉐이더를 찾을 수 있습니다 Render thick lines with instanced rendering in directx 11

+0

float cd를 사용하면 다음과 같이 GS의 출력으로 SV_ClipDistance가 표시됩니다. cd = dot (clipPlane, vertexPosition); 똑같이해야합니까? 너무 많은 노력처럼 보이지 않습니까? – catflier

+0

@catflier 귀하의 회신에 감사드립니다. 그러나 그 아이디어로 나는 하나의 추가 클립 만 가질 수 있으며,이 기법을 사용하여 하나 이상의 클립 보드를 추가 할 수 있습니까? – Thomas

답변

1

[clipplanes이 특별히 낮은 프로파일 장치를 지원하기 위해 추가 된이 속성은 버텍스 쉐이더에 허용되는

, (여기서는 주로 읽기 : 전화).

기하 구조 셰이더에서 컬링을 수행해야하는 경우 SV_ClipDistance를 사용하면 D3D # _CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 개로 제한됩니다. 2 개 요소 제한 게다가

struct gs2ps 
{ 
    float4 pos: SV_Position; 
    float2 uv : TEXCOORD0; 
    float cd0 : SV_ClipDistance0; 
    float cd1 : SV_ClipDistance1; 
}; 

cbuffer cbClipPlanes : register(b1) 
{ 
    float4 clipPlane0; 
    float4 clipPlane1; 
}; 

gs2ps op; 
op.cd0 = dot(clipPlane0, position); 
op.cd1 = dot(clipPlane1, position); 

, 그것은 결국 좀 더 유연성을 제공하십시오하지 않는 것이 자신을 제공 할 수 (:에 따라 당신이이 개 변수를 제공 할 수 있도록

이 제한은 실제로 2입니다

  • 가 제로 ALP를 사용 클리핑 기능)

    2 개 평면의 한계 사용 사례에 대한 실제 문제입니다 경우

    , 다른 옵션은 픽셀 쉐이더에서 비행기 클리핑을 수행하는 것입니다

    : (깊이/스텐실가 중요하지 않은 경우) 하 값
  • 사용 클립 또는 두 번째 경우를 들어

을 버리고, 당신처럼, 당신의 픽셀 셰이더에 또 다른 의미로 화면 공간 값을 전달해야합니다

struct psInput 
{ 
    float4 pos: SV_POSITION; 
    float4 screenPos : SCPOS; 
}; 
는 클립면의 무제한을 가질 수 경우

float4 PS(psInput input): SV_Target 
{ 
    clip(dot(clipPlane0, input.screenPos)); 
    clip(dot(clipPlane1, input.screenPos)); 
    return color; 
} 

(POS에서 같은 값/screenPos 패스)하지만 클립 MSA하지 않습니다 유의하시기 바랍니다 친절한.

+0

대단히 감사합니다! 너는 내 하루를 구했다! 나는 19시에 현상금을 넘겨 줄거야. – Thomas