在iPhone / Pad上的alpha混合看错了/不同

时间:2012-11-23 17:04:56

标签: iphone ios xcode ipad opengl-es-2.0

我正在绘制一些alpha混合精灵。我使用D3D和OpenGL在Win32上渲染相同的资源,当顶点颜色为0xFFFFFF且背景颜色为0xC0D0E0

时,正确的结果如下所示

Cap1

在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);

然后它看起来正确但顶点颜色的alpha分量被忽略(我需要它被使用)。

有没有人有任何想法?

谢谢! 查理。

0 个答案:

没有答案