Geometry HLSL-全局变量在几何体着色器(DirectX11)中保持不变

Geometry HLSL-全局变量在几何体着色器(DirectX11)中保持不变,geometry,directx,shader,global,hlsl,Geometry,Directx,Shader,Global,Hlsl,我的程序接收由线段组成的输入,并将这些线展开为圆柱形对象(如DX SDK示例浏览器中的PipeGS项目) 我为管道添加了一个半径缩放参数数组,并按程序对其进行了修改,但管道的半径没有改变 我非常确定缩放参数每一帧都会更新,因为我将它们设置为像素值。修改管道时,管道会更改颜色,而其半径保持不变 所以我想知道在GS中使用全局变量是否有任何限制,而我在互联网上没有找到它。(或者只是我用错了关键词) 着色器代码如下所示 cbuffer { ..... float scaleParam[10]

我的程序接收由线段组成的输入,并将这些线展开为圆柱形对象(如DX SDK示例浏览器中的PipeGS项目)

我为管道添加了一个半径缩放参数数组,并按程序对其进行了修改,但管道的半径没有改变

我非常确定缩放参数每一帧都会更新,因为我将它们设置为像素值。修改管道时,管道会更改颜色,而其半径保持不变

所以我想知道在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并将它们正确地传递到着色器中,但在第一次传递时出现了一些错误

第二次编辑:

我修改了上面的着色器代码,并在这里发布了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));
}
void drawsecene()
{
//更新视图矩阵、系数、比例图等。
....
....
//绑定流输出缓冲区
ID3D11Buffer*bufferArray[1]={mStreamOutBuffer};
md3dImmediateContext->SOSetTargets(1,bufferArray,0);
//双过程渲染
D3DX11_technology_DESC techDesc;
mTech->GetDesc(&techDesc);
对于(UINT p=0;pGetPassByIndex(p)->应用(0,md3dImmediateContext);
//第一关
如果(p==0)
{
md3dImmediateContext->IASetVertexBuffers(0,1,
&mVertexBuffer、跨步和偏移);
md3dImmediateContext->Draw(mVertexCount,0);
//解除绑定流输出缓冲区
bufferArray[0]=NULL;
md3dImmediateContext->SOSetTargets(1,bufferArray,0);
}
//第二关
其他的
{                
md3dImmediateContext->IASetVertexBuffers(0,1,
&mStreamOutBuffer、跨步和偏移);
md3dImmediateContext->DrawAuto();
}
}
人力资源(mSwapChain->Present(0,0));
}

检查是否使用
float4
位置,向量的w值是场景中最终位置的比例,例如:

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

要校正缩放位置,您必须只更改向量位置的
.xyz
值。

每次修改参数后,我都通过重建顶点缓冲区和流输出缓冲区来解决此问题,但我仍然不知道到底是什么原因导致此问题。

在进入像素着色器之前,我正在使用float3。如果我将参数设置为固定值(比如2.0f左右)并重新编译程序,我可以正确地缩放它们。但是我没有意识到会有你提到的问题,谢谢你的回复。好的,你能发布更多的着色器代码吗?你是在单一效果下编译的,还是在使用独立的着色器,比如ID3D11VertexShader,ID3D11GeometryShader…?我编辑了我的文章。这是一个单效果多遍渲染程序。我没有在cpp文件中定义着色器变量。