我的程序接收由線段組成的輸入,並將線條展開爲圓柱狀對象(如DX SDK示例瀏覽器中的PipeGS項目)。HLSL - 幾何着色器(DirectX11)中的全局變量未改變
我爲管道添加了一個半徑縮放參數數組,並且在程序上對它們進行了修改,但管道的半徑沒有改變。
我很確定縮放參數每幀更新,因爲我將它們設置爲像素值。當我修改它們時,管道會在其半徑保持不變時改變顏色。
所以我想知道在GS中使用全局變量是否有任何限制,我沒有在互聯網上找到它。 (或者我以前只是錯誤的關鍵詞)
着色器的代碼是一樣
cbuffer {
.....
float scaleParam[10];
.....
}
// Pass 1
VS_1 { // pass through }
// Tessellation stages
// Hull shader, domain shader and patch constant function
GS_1 {
pipeRadius = MaxRadius * scaleParam[PipeID];
....
// calculate pipe positions base on line-segments and pipeRadius
....
OutputStream.Append (...);
}
// Pixel shader is disabled in the first pass
// Pass 2
VS_2 { // pass through }
// Tessellation stages
// Hull shader, domain shader and patch constant function
// Transform the vertices and normals to world coordinate in DS
// No geometry shader in the second pass
PS_2
{
return float4(scaleParam[0], scaleParam[1], scaleParam[2], 0.0f);
}
編輯: 我萎縮的問題。 我的程序中有2個通行證,第一遍我計算幾何着色器和流出的線段擴展。
在第二遍中,程序從第一遍接收管道位置,細化管道並對它們應用位移映射,以便它們更加詳細。
我可以改變第二遍中的曲面細分因子和像素顏色,並立即在屏幕上看到結果。
當我修改scaleParam時,管道在其半徑保持不變的同時改變顏色。這意味着我確實改變了scaleParam並將它們正確傳遞給着色器,但第一遍中出現了錯誤。
第二個編輯:
我修改shader代碼上面並張貼在這裏cpp文件的一些代碼。 在cpp文件:
void DrawScene()
{
// Update view matrix, TessFactor, scaleParam etc.
....
....
// Bind stream-output buffer
ID3D11Buffer* bufferArray[1] = {mStreamOutBuffer};
md3dImmediateContext->SOSetTargets(1, bufferArray, 0);
// Two pass rendering
D3DX11_TECHNIQUE_DESC techDesc;
mTech->GetDesc(&techDesc);
for(UINT p = 0; p < techDesc.Passes; ++p)
{
mTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
// First pass
if (p==0)
{
md3dImmediateContext->IASetVertexBuffers(0, 1,
&mVertexBuffer, &stride, &offset);
md3dImmediateContext->Draw(mVertexCount,0);
// unbind stream-output buffer
bufferArray[0] = NULL;
md3dImmediateContext->SOSetTargets(1, bufferArray, 0);
}
// Second pass
else
{
md3dImmediateContext->IASetVertexBuffers(0, 1,
&mStreamOutBuffer, &stride, &offset);
md3dImmediateContext->DrawAuto();
}
}
HR(mSwapChain->Present(0, 0));
}
我在進入像素着色器之前使用了float3。如果我將參數設置爲固定值(比如說2.0f左右)並重新編譯我的程序,我可以正確縮放它們。但是我沒有意識到你會提到一個問題,謝謝你的迴應。 – Vivacissimo
好的,你能發佈更多的着色器代碼嗎?並且你正在編譯這個單一的效果或正在使用單獨的着色器,如ID3D11VertexShader,ID3D11GeometryShader ...? – Leo
我編輯了我的帖子。這是一個單效多通道渲染程序。我沒有在cpp文件中定義着色器變量。 – Vivacissimo