如何在D3D11中设置MSAA?

问题描述

编辑:现在,我已经更改了代码,所有内容都已渲染到MSAA渲染目标中,并在Present调用之前调用ResolveSubresource。如果我直接绘制到MSAA渲染目标,这似乎可行,但是将其绘制到另一个渲染目标中首先会破坏抗锯齿效果。 Visual Studio的图形分析器显示,确实,抗锯齿效果应用于第一个渲染目标(可纹理绑定的渲染目标),而不应用于第二个渲染目标(MSAA渲染目标)。

我目前正在尝试从渲染中去除锯齿,但是对于如何实际设置它有些困惑。目前,现在,我将TEXTURE2DMS用作所有要素的尺寸,并且现在将“样品数”任意设置为2,将“质量”设置为0。

DirectX设置:

Swapchain.SampleDesc.Count = 2;
Swapchain.SampleDesc.Quality = 0;
DepthStencil.SampleDesc.Count = 2; 
DepthStencil.SampleDesc.Quality = 0;
DepthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;

RenderTarget(Texture)设置:

TextureDesc.SampleDesc.Count = 2;
RenderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;
DepthDesc.SampleDesc.Count = 2;
DepthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;
ShaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMS;

我还有2个像素着色器:

struct Pin
{
    float4 Pos : SV_POSITION;
    float4 Col : COLOR0;
    float2 Tex : TEXCOORD0;
    float2 Texel : TEXCOORD1;
};

//High pass filter
Texture2D txBlank : register( t0 );
SamplerState samLinear : register( s0 );

float RGB2RelativeLuminance(float4 c)
{
    return (c.x * 0.2126) + (c.y * 0.7152) + (c.z * 0.0722);
}

float4 PS(Pin input) : SV_TARGET
{
    float4 color = float4(0,1);
    float treshhold = 0.3f;

    float4 temp = txBlank.Sample(samLinear,input.Tex) * input.Col;
    if(RGB2RelativeLuminance(temp) > treshhold)
        color = temp;

    return color;
}

//Basic
Texture2DMS<float4> txImage : register( t0 );
SamplerState samLinear : register( s0 );

float4 PS(Pin input) : SV_TARGET
{
    return txImage.Load(input.Pos,1) * input.Col;
}

光栅化器:

rasterDesc.AntialiasedLineEnable = true;
rasterDesc.CullMode = D3D11_CULL_BACK;
rasterDesc.DepthBias = 0;
rasterDesc.DepthBiasClamp = 0.0f;
rasterDesc.DepthClipEnable = true;
rasterDesc.FillMode = D3D11_FILL_SOLID;
rasterDesc.FrontCounterClockwise = false;
rasterDesc.MultisampleEnable = true;
rasterDesc.ScissorEnable = false;
rasterDesc.SlopeScaledDepthBias = 0.0f;

现在,我的程序如下:

  1. (Init)初始化D3D设备,交换链,上下文,栅格化器,渲染目标,深度模具,视口
  2. (初始化)创建渲染目标(纹理),我将其称为“ ViewTex”
  3. (绘制)将ViewTex设置为渲染目标
  4. (绘制)将空白纹理设置为插槽0
  5. (绘制)将“高通滤镜”设置为着色器
  6. (绘制)绘制对象
  7. (绘制)将“渲染目标”设置为“窗口”
  8. (绘制)将ViewTex设置为插槽0纹理
  9. (绘制)将“基本”设置为着色器
  10. (绘制)绘制一个覆盖整个“渲染目标”的矩形
  11. (绘制)取消设置插槽0纹理

当前,此代码不起作用,我不确定为什么,这是渲染屏幕截图的特写: link

我误会了吗?设置多重采样不等于MSAA吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)