Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 管道中缺少DirectX11像素着色器_C++_Directx 11_Pixel Shader_Raster Graphics - Fatal编程技术网

C++ 管道中缺少DirectX11像素着色器

C++ 管道中缺少DirectX11像素着色器,c++,directx-11,pixel-shader,raster-graphics,C++,Directx 11,Pixel Shader,Raster Graphics,我正在编写一个使用DirectX显示MS3D模型的程序,不幸的是,结果在屏幕上没有显示任何内容。 当我使用Visual Studio 13中的图形调试器时,我注意到管道中缺少像素着色器,如下图所示 这是我的像素着色器源代码: cbuffer SkinningTransforms { matrix WorldMatrix; matrix ViewProjMatrix; }; //----------------------------------------------

我正在编写一个使用DirectX显示MS3D模型的程序,不幸的是,结果在屏幕上没有显示任何内容。 当我使用Visual Studio 13中的图形调试器时,我注意到管道中缺少像素着色器,如下图所示

这是我的像素着色器源代码:

 cbuffer SkinningTransforms
 {
    matrix WorldMatrix; 
    matrix ViewProjMatrix;
 };
//--------------------------------------------------------------------------------
// Inter-stage structures
//--------------------------------------------------------------------------------
struct VS_INPUT
{
    float3  position        : POSITION;
    int4    bone            : BONEID;
    float4  weights         : BONEWEIGHT;
    float3  normal          : NORMAL;
    float3  tangent         : TANGENT;
    float2  tex             : TEXCOORD;
};
//--------------------------------------------------------------------------------
struct VS_OUTPUT
{
    float4 position         : SV_Position;
    float3 normal           : NORMAL;
    float3 light            : LIGHT;
    float2 tex              : TEXCOORDS;
};

Texture2D       ColorTexture : register( t0 );           
SamplerState    LinearSampler : register( s0 );

//--------------------------------------------------------------------------------
VS_OUTPUT VSMAIN( in VS_INPUT input )
{
    VS_OUTPUT output;
    //Transform vertex and pass them to the pixel shader
    return output;
}

//--------------------------------------------------------------------------------
float4 PSMAIN( in VS_OUTPUT input ) : SV_Target
{
    // Calculate the lighting
    float3 n = normalize( input.normal );
    float3 l = normalize( input.light );


    float4 texColor = ColorTexture.Sample( LinearSampler, input.tex );

    float4 color = texColor * (max(dot(n,l),0) + 0.05f );
    return( color );
}
正如我在图形调试器中所知道的,所有图形事件都是正确的。我在下面列出了可能与像素着色器有关的重要事件:

106:(obj:4) ID3D11Device::CreateDepthStencilView(obj:24,NULL,obj:25)*
108:(obj:5) ID3D11DeviceContext::OMSetRenderTargets(8,{obj:1,NULL,NULL,NULL,NULL,NULL,NULL,NULL},obj:25)*
109:(obj:5) ID3D11DeviceContext::ClearRenderTargetView(obj:1,addr:21)*
111:(obj:5) ID3D11DeviceContext::ClearDepthStencilView(obj:25,1,1.000f,0)*
119:(obj:4) ID3D11Device::CreateSamplerState(addr:24,obj:27)*
134:(obj:4) ID3D11Device::CreatePixelShader(addr:27,21056,NULL,obj:30)*
135:CreateObject(D3D11 Pixel Shader,obj:30)
136:(obj:5) ID3D11DeviceContext::PSSetShader(obj:30,NULL,0)*
137:(obj:5) ID3D11DeviceContext::PSSetSamplers(0,1,{obj:27})*
139:(obj:4) ID3D11Device::CreateTexture2D(addr:28,addr:5,obj:31)*
140:CreateObject(D3D11 Texture2D,obj:31)
142:(obj:4) ID3D11Device::CreateShaderResourceView(obj:31,NULL,obj:32)*
143:CreateObject(D3D11 Shader Resource View,obj:32)
144:(obj:5) ID3D11DeviceContext::PSSetShaderResources(0,1,{obj:32})*
146:(obj:4) ID3D11Device::CreateRasterizerState(addr:29,obj:33)*
147:CreateObject(D3D11 Rasterizer State,obj:33)
152:(obj:5) ID3D11DeviceContext::RSSetState(obj:33)*
154:(obj:5) ID3D11DeviceContext::RSSetViewports(1,addr:30)*
156:(obj:4) ID3D11Device::CreateBlendState(addr:11,obj:34)*
157:CreateObject(D3D11 Blend State,obj:34)
159:(obj:5) ID3D11DeviceContext::OMSetBlendState(obj:34,addr:31,-1)*
162:(obj:4) ID3D11Device::CreateDepthStencilState(addr:32,obj:35)*
163:CreateObject(D3D11 Depth-Stencil State,obj:35)
165:(obj:5) ID3D11DeviceContext::OMSetDepthStencilState(obj:35,0)*
我调试了上面列表中的所有函数,所有函数都返回OK。没问题。
我的问题是pipleline中缺少pixex着色器的原因是什么,这反过来可能会导致出现空屏幕。

正如我在评论中所写,我也遇到了类似的问题

在我的例子中,像素着色器已正确绑定,请参见。此外,我通过调试顶点着色器确保转换的结果应该是可见的,因此应该生成可见片段

在这种情况下,它似乎与您描述的相同,请确保您的光栅器状态是正确的。您可能需要检查它是否确实是使用即时上下文的图形对象视图设置的,并且它是否允许几何体通过。出于调试目的,我发现禁用背面消隐非常有用。我用

D3D11_RASTERIZER_DESC rasterDesc;
ZeroMemory(&rasterDesc, sizeof(rasterDesc));
rasterDesc.CullMode = D3D11_CULL_MODE::D3D11_CULL_NONE;
rasterDesc.FillMode = D3D11_FILL_MODE::D3D11_FILL_SOLID;

正如我在评论中所写,我也有类似的问题

在我的例子中,像素着色器已正确绑定,请参见。此外,我通过调试顶点着色器确保转换的结果应该是可见的,因此应该生成可见片段

在这种情况下,它似乎与您描述的相同,请确保您的光栅器状态是正确的。您可能需要检查它是否确实是使用即时上下文的图形对象视图设置的,并且它是否允许几何体通过。出于调试目的,我发现禁用背面消隐非常有用。我用

D3D11_RASTERIZER_DESC rasterDesc;
ZeroMemory(&rasterDesc, sizeof(rasterDesc));
rasterDesc.CullMode = D3D11_CULL_MODE::D3D11_CULL_NONE;
rasterDesc.FillMode = D3D11_FILL_MODE::D3D11_FILL_SOLID;

除其他答案外,恒定缓冲区组织可能是导致此问题的原因。在我的例子中,管道中缺少像素着色器,但顶点着色器也没有正确变换顶点。经检查,发现world矩阵的值不正确,因为常量缓冲区顶部的布尔值导致数据不对齐。HLSL将数据打包成16字节的边界,这些边界称为向量,有4个分量。布尔值是4个字节,与浮点值相同

cbuffer cbPerObject : register( b1 )
{
    bool gUseTexture ;

    row_major float4x4 gWorld ;
    row_major float4x4 gWorldInvTranspose ;
    row_major float4x4 gWorldViewProj ;
    row_major float4x4 gTexTransform ;
    Material gMaterial ;
} ;
因此,在上面的常量缓冲区中,布尔值+世界矩阵第一行的前3个分量被映射到第一个向量,这会导致所有内容被3个分量移位,使世界矩阵和后面的其他矩阵以及可能的其他数据不对齐

两种可能的解决办法:

将布尔值移动到结构的末尾。我这样做了,它成功了。 在世界矩阵和布尔值之间添加一个三分量大小的填充变量。 我尝试了在C++结构中添加XMFLAT3和HLSL中的FLUAT3。这也奏效了。 长话短说,注意HLSL包装

编辑:当时我认为这些方法有效,因为除布尔值外的所有变量都有正确的值。我当时没有用这个工具,所以我认为也可以。结果不是

HLSL波尔和C++布尔的大小不同。HLSL BOOLS是4字节,而C++ BOOLS是在我的机器上实现的1字节。无论如何,它们很可能是不同的,这会导致问题

使用Windows布尔类型或其他大小适当的值,如int或uint

看一看

第二篇到最后一篇文章也清楚地解释了这种情况,上面的gamedev链接中的答案也提到了这个链接


但要小心,因为包装仍然是一个问题。即使您使用BOOL或uint或其他任何东西,如果您像以前一样将其放在上述结构的开头,您将在常量缓冲区中获得不正确的值。因此,在使用常量缓冲区时,请同时考虑数据对齐和布尔值问题。

除了其他答案之外,常量缓冲区组织可能是导致此问题的原因。在我的例子中,管道中缺少像素着色器,但顶点着色器也没有正确变换顶点。经检查,发现world矩阵的值不正确,因为常量缓冲区顶部的布尔值导致数据不对齐。HLSL将数据打包成16字节的边界,这些边界称为向量,有4个分量。布尔值是4个字节,与浮点值相同

cbuffer cbPerObject : register( b1 )
{
    bool gUseTexture ;

    row_major float4x4 gWorld ;
    row_major float4x4 gWorldInvTranspose ;
    row_major float4x4 gWorldViewProj ;
    row_major float4x4 gTexTransform ;
    Material gMaterial ;
} ;
因此,在上面的常量缓冲区中,布尔值+世界矩阵第一行的前3个分量被映射到第一个向量,这会导致所有内容被3个分量移位,使世界矩阵和后面的其他矩阵以及可能的其他数据不对齐 a

两种可能的解决办法:

将布尔值移动到结构的末尾。我这样做了,它成功了。 在世界矩阵和布尔值之间添加一个三分量大小的填充变量。 我尝试了在C++结构中添加XMFLAT3和HLSL中的FLUAT3。这也奏效了。 长话短说,注意HLSL包装

编辑:当时我认为这些方法有效,因为除布尔值外的所有变量都有正确的值。我当时没有用这个工具,所以我认为也可以。结果不是

HLSL波尔和C++布尔的大小不同。HLSL BOOLS是4字节,而C++ BOOLS是在我的机器上实现的1字节。无论如何,它们很可能是不同的,这会导致问题

使用Windows布尔类型或其他大小适当的值,如int或uint

看一看

第二篇到最后一篇文章也清楚地解释了这种情况,上面的gamedev链接中的答案也提到了这个链接


但要小心,因为包装仍然是一个问题。即使您使用BOOL或uint或其他任何东西,如果您像以前一样将其放在上述结构的开头,您将在常量缓冲区中获得不正确的值。因此,在使用常量缓冲区时,要同时考虑数据对齐和布尔问题。

您最终解决了这个问题吗?我有同样的问题,PS在管道阶段缺失,但在直接上下文的对象视图中处于活动状态,因此它不是中描述的问题。当然,图像是黑色的…同样的问题,已验证的RS状态和VS的输出。我注意到,尽管调用了RSSetViewports,但draw调用中的视口未设置。我还在研究这个问题。对我来说,这是因为我乐观地给了视口100.0f的最大深度,而它最多应该是1.0f。即使我在光栅化器中禁用了深度剪裁,这也会阻止RSSetViewports设置视口的深度,并且不会引发任何错误。在图形调试器中检查是否实际设置了设备上下文上的视口。您最终解决了问题吗?我有同样的问题,PS在管道阶段缺失,但在直接上下文的对象视图中处于活动状态,因此它不是中描述的问题。当然,图像是黑色的…同样的问题,已验证的RS状态和VS的输出。我注意到,尽管调用了RSSetViewports,但draw调用中的视口未设置。我还在研究这个问题。对我来说,这是因为我乐观地给了视口100.0f的最大深度,而它最多应该是1.0f。即使我在光栅化器中禁用了深度剪裁,这也会阻止RSSetViewports设置视口的深度,并且不会引发任何错误。在图形调试器中检查是否实际设置了设备上下文上的视口。