3

ジオメトリ シェーダー (位置と色のみを読み込む) で作成されたいくつかの立方体を、それぞれ異なるアルファ値でレンダリングしています。問題は、アルファブレンディングを有効にした後、キューブを見る角度によってキューブの可視性が変化することです。アルファ値が 0.5 を超えるオブジェクトは、かなりしっかりしているように見えますが、少し回転させるとほとんど見えなくなります。

赤い立方体のアルファ値は 255 ですが、その下にあるものを見ることができます。ステンシル バッファの有効化と無効化を試みましたが、何も変更されないため、シェーダまたは間違ったフラグ値のような単純なものであると推測します。

http://tinypic.com/r/10e589v/8

アルファ ブレンディング

            var depthDisabledStencilDesc = new DepthStencilStateDescription()
        {
            IsDepthEnabled = false,
            DepthWriteMask = DepthWriteMask.All,
            DepthComparison = Comparison.Less,
            IsStencilEnabled = true,
            StencilReadMask = 0xFF,
            StencilWriteMask = 0xFF,
            // Stencil operation if pixel front-facing.
            FrontFace = new DepthStencilOperationDescription()
            {
                FailOperation = StencilOperation.Keep,
                DepthFailOperation = StencilOperation.Increment,
                PassOperation = StencilOperation.Keep,
                Comparison = Comparison.Always
            },
            // Stencil operation if pixel is back-facing.
            BackFace = new DepthStencilOperationDescription()
            {
                FailOperation = StencilOperation.Keep,
                DepthFailOperation = StencilOperation.Decrement,
                PassOperation = StencilOperation.Keep,
                Comparison = Comparison.Always
            }
        };

        // Create the depth stencil state.
        DepthDisabledStencilState = new DepthStencilState(Device, depthDisabledStencilDesc);
        //turn z-buffer off
        Device.ImmediateContext.OutputMerger.SetDepthStencilState(DepthDisabledStencilState, 1);

        #region Initialize Blending
        BlendStateDescription blendDesc = new BlendStateDescription();

        blendDesc.RenderTarget[0].IsBlendEnabled = true;
        blendDesc.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha;
        blendDesc.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha;
        blendDesc.RenderTarget[0].BlendOperation = BlendOperation.Add;
        blendDesc.RenderTarget[0].SourceAlphaBlend = BlendOption.One;
        blendDesc.RenderTarget[0].DestinationAlphaBlend = BlendOption.InverseSourceAlpha;
        blendDesc.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add;
        blendDesc.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;

        AlphaEnableBlendingState = new BlendState(Device, blendDesc);

        // Setup the blend factor.
        var blendFactor = new Color4(0, 0, 0, 0);

        Device.ImmediateContext.OutputMerger.SetBlendState(AlphaEnableBlendingState, blendFactor, -1);

ジオメトリ シェーダー

    float4 v1 = input[0].Pos/2 + float4(-scale * cube_size, -scale * cube_size, -scale * cube_size, 0) + offset;
float4 v2 = input[0].Pos/2 + float4(-scale * cube_size, scale * cube_size, -scale * cube_size, 0) + offset;
float4 v3 = input[0].Pos/2 + float4(scale * cube_size, scale * cube_size, -scale * cube_size, 0) + offset;
float4 v4 = input[0].Pos/2 + float4(scale * cube_size, -scale * cube_size, -scale * cube_size, 0) + offset;

float4 v5 = input[0].Pos/2 + float4(-scale * cube_size, -scale * cube_size, scale * cube_size, 0) + offset;
float4 v6 = input[0].Pos/2 + float4(-scale * cube_size, scale * cube_size, scale * cube_size, 0) + offset;
float4 v7 = input[0].Pos/2 + float4(scale * cube_size, scale * cube_size, scale * cube_size, 0) + offset;
float4 v8 = input[0].Pos/2 + float4(scale * cube_size, -scale * cube_size, scale * cube_size, 0) + offset;

v1 = mul(v1, World);
v1 = mul(v1, View);
v1 = mul(v1, Projection);

v2 = mul(v2, World);
v2 = mul(v2, View);
v2 = mul(v2, Projection);

v3 = mul(v3, World);
v3 = mul(v3, View);
v3 = mul(v3, Projection);

//front
float4 edge1 = v3-v2;
float4 edge2 = v1-v3;
output.Normal = cross(edge1, edge2);

output.Pos = v3;    
OutputStream.Append(output);            
output.Pos = v2;
OutputStream.Append(output);            
output.Pos = v1;
OutputStream.Append(output);

output.Pos = v3;
OutputStream.Append(output);        
output.Pos = v4;
OutputStream.Append(output);        
output.Pos = v1;
OutputStream.Append(output);
OutputStream.RestartStrip();

他の面も同様に作成されます。

4

1 に答える 1

3

背景プリミティブとブレンドするには、同じ背景プリミティブを最初にレンダリングして、既存のピクセル カラーで目的のブレンド操作を実行する必要があります。

ブレンディング段階

順序が逆の場合、2 番目のプリミティブは最初のプリミティブによって遮られ、最後のプリミティブのピクセル カラーのみになります。

目的に近づくための参考になれば幸いです。

乾杯

于 2014-03-19T11:11:57.653 に答える