我的程序接收由线段组成的输入,并将这些线段展开为圆柱体状对象(如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时,管道会改变颜色,而半径保持不变。这意味着我确实改变了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));
}
检查是否使用float4
位置,向量的w值是场景中最终位置的比例,例如:
float4 pos0 = float4(5, 5, 5, 1);
// is equals that:
float4 pos1 = float4(10, 10, 10, 2);
要正确缩放位置,您必须仅更改矢量位置的.xyz
值。
我通过每次修改参数后重建顶点缓冲区和流输出缓冲区解决了这个问题,但我仍然不知道究竟是什么原因导致了这个问题