2017-04-21 83 views
1

我寫了一個用於生成較粗線條的幾何着色器。但現在我有這個問題,屬性[clipplanes(...)]不起作用。還有就是警告:帶有附加clipplanes的幾何着色器

嚴重性代碼說明項目文件的線路抑制狀態 警告X3554未知屬性clipplanes,或對於這一說法屬性無效,有效屬性是:maxvertexcount,MaxVertexCount,例如CRenderer \着色器\幾何着色器\ GS_GenerateThickLines。 hlsl

我知道可以選擇自己寫一個三角形的剪輯,但是在我看來,這似乎有點過分。有沒有在幾何着色器中使用其他clipplanes的方法? 我也有另一個想法:幾何着色器在一條線(2個頂點)和在頂點着色器的[clipplanes(...)]屬性工作...我可以以某種方式得到剪切點,而不是原始頂點內幾何着色器? 欲瞭解更多信息,你可以在這裏找到我的幾何着色器:Render thick lines with instanced rendering in directx 11

+0

使用float cd:SV_ClipDistance作爲GS的輸出,其中cd = dot(clipPlane,vertexPosition);應該這樣做?而且看起來不是很努力? – catflier

+0

@catflier感謝你的迴應,但是有了這個想法,我只能有一個額外的clipplane,或者我可以使用這種技術添加多個? – Thomas

回答

1

[clipplanes]

此屬性只允許在頂點着色器, 這是爲了支持小尺寸器件專門添加(這裏主要是閱讀:手機)。

如果您需要在幾何着色器上執行剔除,則可以使用SV_ClipDistance,這會限制您進入D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT。

這一限制實際上是2,所以可以提供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個元素限制,請不在於它最終提供多一點的靈活性(因爲你可以提供你自己裁剪功能)

在案件2架飛機的極限是爲您的使用情況下,真正的問題,另一種選擇是執行像素着色器的平面裁剪:

  • 使用零ALP哈哈值(如果深度/模板是不重要的)
  • 用夾子或丟棄

對於第二種情況,您需要將您的屏幕空間值作爲另一個語義傳遞到您的像素着色器,如:

struct psInput 
{ 
    float4 pos: SV_POSITION; 
    float4 screenPos : SCPOS; 
}; 

(傳入POS /相同的值screenPos)

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

在這種情況下,你可以有裁剪平面無限量的,但是請注意,夾子不MSA友好的。

+0

非常感謝!你救了我的一天!我會在19點處理你的賞金 – Thomas