|
|
新手求助:透明纹理渲染失败(试了许多方法)
问题描述:
1:创建设备,长和宽分别为w和h
2:创建背景纹理(从位图创建,alpha通道全为0)
3:创建带透明度纹理 (alpha值按照y坐标从上往下渐变)
4:用背景纹理渲染矩形1(渲染参数为默认)
5:用透明纹理渲染矩形2(开启了blender的alpha混合功能,且texture stage只设置colorop alphaop,都设置为ARG1,且ARG1都设置为TEXTURE)
6:结果,将设备页面绘制到主页面,无任何透明效果。(ORZ..)
ps:如果单独将透明纹理blt主页面是可以的。因为忽略了alpha通道。
部分渲染代码如下:
- VERTEX verts1[] = {
- { ltx, lty, 0.0f, 0.0f, /*0xff0000ff,*/ 0.0f, 0.0f },
- { rtx, rty, 0.0f, 0.0f, /*0xffff0000,*/ 1.0f, 0.0f },
- { rbx, rby, 0.0f, 0.0f, /*0xff00ff00,*/ 1.0f, 1.0f },
- { ltx, lty, 0.0f, 0.0f, /*0xff0000ff,*/ 0.0f, 0.0f },
- { rbx, rby, 0.0f, 0.0f, /*0xff00ff00,*/ 1.0f, 1.0f },
- { lbx, lby, 0.0f, 0.0f, /*0xff000000,*/ 0.0f, 1.0f }
- };
-
- VERTEX verts2[] = {
- { ltx + 100, lty, 0.0f, 0.0f, /*0xff0000ff,*/ 0.0f, 0.0f },
- { rtx, rty, 0.0f, 0.0f, /*0xffff0000,*/ 1.0f, 0.0f },
- { rbx, rby, 0.0f, 0.0f, /*0xff00ff00,*/ 1.0f, 1.0f },
- { ltx + 100, lty, 0.0f, 0.0f, /*0xff0000ff,*/ 0.0f, 0.0f },
- { rbx, rby, 0.0f, 0.0f, /*0xff00ff00,*/ 1.0f, 1.0f },
- { lbx + 100, lby, 0.0f, 0.0f, /*0xff000000,*/ 0.0f, 1.0f }
- };
- g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0, 0);
- g_pD3DDevice->BeginScene();
- // 绘制背景
- g_pD3DDevice->SetTexture(0, g_pDDrawBkgSurface);
- g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, VERTEX_FVF, verts1, 6, D3DDP_WAIT);
- g_pD3DDevice->SetTexture(0, NULL);
- // 渲染透明纹理
- g_pD3DDevice->SetTexture(0, g_pDDrawTexSurface);
- // 开启alpha混合,
- g_pD3DDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
- g_pD3DDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA);
- g_pD3DDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
- g_pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
- g_pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
- g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, VERTEX_FVF, verts2, 6, D3DDP_WAIT);
- g_pD3DDevice->SetTexture(0, NULL);
- g_pD3DDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
- g_pD3DDevice->EndScene();
复制代码
附件为完整简单工程代码,vc6,设置下dx sdk即可。 |
|