1

アルファブレンドされたスプライトをいくつか描いています。D3D と OpenGL を使用して Win32 でレンダリングする同じアセットがあり、頂点の色が 0xFFFFFF で背景の色が 0xC0D0E0 の場合、正しい結果は次のようになります。

キャップ1

Win32/OpenGL では、次のようにブレンドを有効にします。

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

Win32/D3D では次のようになります。

CD3D11_BLEND_DESC blendDesc(D3D11_DEFAULT);
D3D11_RENDER_TARGET_BLEND_DESC rtBlendDesc;
rtBlendDesc.BlendEnable = true;
rtBlendDesc.BlendOp = D3D11_BLEND_OP_ADD;
rtBlendDesc.BlendOpAlpha = D3D11_BLEND_OP_ADD;
rtBlendDesc.DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
rtBlendDesc.DestBlendAlpha = D3D11_BLEND_ZERO;
rtBlendDesc.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
rtBlendDesc.SrcBlend = D3D11_BLEND_SRC_ALPHA;
rtBlendDesc.SrcBlendAlpha = D3D11_BLEND_ZERO;
blendDesc.RenderTarget[0] = rtBlendDesc;
gDevice->CreateBlendState(&blendDesc, &mBlendState);

次に、レンダリング時に:

gContext->OMSetBlendState(mBlendState, NULL, 0xffffffff);

Win32/OpenGL では固定関数パイプラインを使用し、DX11 では非常に単純な頂点/ピクセル シェーダーを使用します。

float4 SpritePixelShader(PS_INPUT input) : SV_Target
{
    return (txDiffuse.Sample(samLinear, input.Tex)) * input.Col;
}

PS_INPUT SpriteVertexShader(VS_INPUT input)
{
    PS_INPUT output = (PS_INPUT)0;
    output.Pos = mul(float4(input.Pos.x, input.Pos.y, 0.5, 1.0), projection);
    output.Tex = input.Tex;
    output.Col = input.Col;
    return output;
}

すべて順調です。OpenGL と D3D で同じ結果が得られます。

iPhone シミュレーターの OpenGL ES 2.0 の場合 (これがシミュレーターかどうかはわかりませんが、まだデバイスでテストすることはできません):

同様にブレンドを有効にします。

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

私のフラグメント/頂点シェーダーは似ています:

// fragment shader
void main()
{
    gl_FragColor = color * texture2D(s_texture, texCoord);
}

// vertex shader
void main()
{
    color = vertexColor;
    texCoord = vertexTexCoord;
    gl_Position = matrix * vec4(vertexPosition, 0, 1);
}

しかし、私はこれを取得します:

Cap2

加法的ではなく変調を使用しているようです。私は電話してみました:

glBlendEquation(GL_FUNC_ADD);

しかし、それは何もしないようです

glBlendEquationOES(GL_FUNC_ADD_OES);

私が使用する場合:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

それは正しく見えますが、頂点の色のアルファ コンポーネントは無視されます (使用する必要があります)。

誰にもアイデアはありますか?

ありがとう!チャーリー。

4

0 に答える 0