0

I' m trying to render two textures one for RGB and another on for the alpha channel, I blend them together with a shader. The alpha channel texture doesn't overlap properly to the RGB one. It seems to be stretched.

The alpha channel texture changes at every frame and I need to fill starting from an array of uint8_t by the following fuction:

D3DLOCKED_RECT locked_rect;

HRESULT hr = alpha_tex->LockRect(0, &locked_rect, nullptr, 0);

if (!FAILED(hr)) {
    ret_code = 0;
    BYTE *p_dst = (BYTE *)locked_rect.pBits;

    for (uint y = 0; y < height; y++) {
        memcpy(p_dst, alpha_array, width);
        alpha_array += width;
        p_dst += locked_rect.Pitch;
    }

    alpha_tex->UnlockRect(0);
}

where the alpha_array is a uint8_t array containing the alpha values. To render the texture i use the following function:

hwctx->d3d9device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffeeeeee, 1.0f, 0);
hwctx->d3d9device->BeginScene();

ctx->mFX->SetTechnique(ctx->mhTech);

ctx->texRGB->GetSurfaceLevel(0, &ctx->surfRGB);
hwctx->d3d9device->StretchRect((IDirect3DSurface9*)s->vdrFrame->data[3], NULL, ctx->surfRGB, NULL, D3DTEXF_LINEAR);

ctx->mFX->SetTexture(ctx->mhTexRGB, ctx->texRGB);
ctx->mFX->SetTexture(ctx->mhTexAlpha, ctx->texAlpha);

// Enable alpha blending.
hwctx->d3d9device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
hwctx->d3d9device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
hwctx->d3d9device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

UINT numPasses = 0;
ctx->mFX->Begin(&numPasses, 0);

for (UINT i = 0; i < numPasses; ++i){
    ctx->mFX->BeginPass(i);
    hwctx->d3d9device->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
    ctx->mFX->EndPass();
}

ctx->mFX->End();
hwctx->d3d9device->EndScene();
hwctx->d3d9device->Present(0, 0, 0, 0);

// Disable alpha blending.
hwctx->d3d9device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);

I combine the textures by vertex/pixel shader:

uniform extern texture  gTexRGB;
uniform extern texture  gTexAlpha;

sampler TexRGB = sampler_state{
    Texture = <gTexRGB>;
    AddressU  = WRAP;
    AddressV  = WRAP;
};

sampler TexAlpha = sampler_state{
    Texture = <gTexAlpha>;
    AddressU = WRAP;
    AddressV = WRAP;
};

struct OutputVS{
    float4 posH    : POSITION0;
    float2 tex0    : TEXCOORD0;
};

OutputVS TextureBlendingVS(float2 tex0: TEXCOORD0){
    // Zero out our output.
    OutputVS outVS = (OutputVS)0;

    // Pass on texture coordinates to be interpolated in rasterization.
    outVS.tex0 = tex0;

    // Done--return the output.
    return outVS;
}

float4 TextureBlendingPS(float2 tex0 : TEXCOORD0) : COLOR{
    float3  rgb = tex2D(TexRGB, tex0).rgb;
    float   alpha = tex2D(TexAlpha, tex0).a;
    return float4(rgb, alpha);
}

technique DirLightTexTech{
    pass P0 {
        // Specify the vertex and pixel shader associated with this pass.
        vertexShader = compile vs_2_0 TextureBlendingVS();
        pixelShader  = compile ps_2_0 TextureBlendingPS();

    }
}

The size of the textures is the same but during the rendering something goes wrong.

Please help me. :)

Gabriele
  • 11
  • 2
  • And what exactly does go wrong? Can you show a sample output? – Nico Schertler Apr 13 '17 at 16:17
  • Tha alpha texture and the RGB one are misaligned. The size of the textures are 356x200, if I use a pow of two size the textures overlap properly and there is not misalignment. – Gabriele Apr 14 '17 at 07:41

0 Answers0