2013-01-07 91 views
2

我的程序接收由線段組成的輸入,並將線條展開爲圓柱狀對象(如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)); 
} 

回答

1

檢查,如果你使用的是float4位置,矢量的W值是場景最終位置的比例,例如:

float4 pos0 = float4(5, 5, 5, 1); 
// is equals that: 
float4 pos1 = float4(10, 10, 10, 2); 

要糾正刻度上的位置您只需要改變矢量位置的值即.xyz

+0

我在進入像素着色器之前使用了float3。如果我將參數設置爲固定值(比如說2.0f左右)並重新編譯我的程序,我可以正確縮放它們。但是我沒有意識到你會提到一個問題,謝謝你的迴應。 – Vivacissimo

+0

好的,你能發佈更多的着色器代碼嗎?並且你正在編譯這個單一的效果或正在使用單獨的着色器,如ID3D11VertexShader,ID3D11GeometryShader ...? – Leo

+0

我編輯了我的帖子。這是一個單效多通道渲染程序。我沒有在cpp文件中定義着色器變量。 – Vivacissimo

0

我修改了參數後每次重建頂點緩衝區和流輸出緩衝區,我解決了這個問題,但我仍然不知道究竟是什麼原因導致了這個問題。