ジオメトリ シェーダー (位置と色のみを読み込む) で作成されたいくつかの立方体を、それぞれ異なるアルファ値でレンダリングしています。問題は、アルファブレンディングを有効にした後、キューブを見る角度によってキューブの可視性が変化することです。アルファ値が 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();
他の面も同様に作成されます。