游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3232|回复: 4

透明纹理渲染失败(试了许多方法)

[复制链接]

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2008-3-5 15:50:00 | 显示全部楼层 |阅读模式
新手求助:透明纹理渲染失败(试了许多方法)

问题描述:

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通道。


部分渲染代码如下:

  1.         VERTEX verts1[] = {
  2.                 { ltx,  lty,    0.0f, 0.0f, /*0xff0000ff,*/ 0.0f, 0.0f },
  3.                 { rtx,  rty,    0.0f, 0.0f, /*0xffff0000,*/ 1.0f, 0.0f },
  4.                 { rbx,  rby,    0.0f, 0.0f, /*0xff00ff00,*/ 1.0f, 1.0f },
  5.                 { ltx,  lty,    0.0f, 0.0f, /*0xff0000ff,*/ 0.0f, 0.0f },
  6.                 { rbx,  rby,    0.0f, 0.0f, /*0xff00ff00,*/ 1.0f, 1.0f },
  7.                 { lbx,  lby,    0.0f, 0.0f, /*0xff000000,*/ 0.0f, 1.0f }
  8.         };
  9.        
  10.         VERTEX verts2[] = {
  11.                 { ltx + 100, lty,    0.0f, 0.0f, /*0xff0000ff,*/ 0.0f, 0.0f },
  12.                 { rtx,       rty,    0.0f, 0.0f, /*0xffff0000,*/ 1.0f, 0.0f },
  13.                 { rbx,       rby,    0.0f, 0.0f, /*0xff00ff00,*/ 1.0f, 1.0f },
  14.                 { ltx + 100, lty,    0.0f, 0.0f, /*0xff0000ff,*/ 0.0f, 0.0f },
  15.                 { rbx,       rby,    0.0f, 0.0f, /*0xff00ff00,*/ 1.0f, 1.0f },
  16.                 { lbx + 100, lby,    0.0f, 0.0f, /*0xff000000,*/ 0.0f, 1.0f }
  17.         };
  18.         g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0, 0);
  19.         g_pD3DDevice->BeginScene();       

  20.         // 绘制背景
  21.         g_pD3DDevice->SetTexture(0, g_pDDrawBkgSurface);
  22.         g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, VERTEX_FVF, verts1, 6, D3DDP_WAIT);
  23.         g_pD3DDevice->SetTexture(0, NULL);

  24.         // 渲染透明纹理
  25.         g_pD3DDevice->SetTexture(0, g_pDDrawTexSurface);

  26.         // 开启alpha混合,
  27.         g_pD3DDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
  28.         g_pD3DDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA);
  29.         g_pD3DDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);

  30.         g_pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
  31.         g_pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  32.         g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
  33.         g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);   

  34.         g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, VERTEX_FVF, verts2, 6, D3DDP_WAIT);
  35.         g_pD3DDevice->SetTexture(0, NULL);
  36.         g_pD3DDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
  37.         g_pD3DDevice->EndScene();
复制代码


附件为完整简单工程代码,vc6,设置下dx sdk即可。

sf_200835154941.rar

216.08 KB, 下载次数:

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2008-3-5 16:46:00 | 显示全部楼层

Re:透明纹理渲染失败(试了许多方法)

顶点格式如下:

typedef struct
{
float x, y, z;  // 2D coordinates
float rhw;      // rhw
float u, v;     // texture coordinates
} VERTEX;

#define VERTEX_FVF   (D3DFVF_XYZRHW  ¦ D3DFVF_TEX1)

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2008-3-5 19:50:00 | 显示全部楼层

Re:透明纹理渲染失败(试了许多方法)

Miu.c ????

4

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2008-3-5 21:57:00 | 显示全部楼层

Re:透明纹理渲染失败(试了许多方法)

我把
g_pD3DDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
改成
g_pD3DDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE);
能看到alpha混合效果,而且整个页面混合比较平均,没有渐变效果.是不是楼主创建的alpha页面有问题,我看不懂你的页面怎么填充的

14

主题

245

帖子

256

积分

中级会员

Rank: 3Rank: 3

积分
256
QQ
发表于 2008-3-7 10:30:00 | 显示全部楼层

Re:透明纹理渲染失败(试了许多方法)

你是要透明混合还是要透明。

如果你要透明的话,把alphablend关掉,打开zwrite,需要注意渲染顺序。
如果你要透明混合的话,把alphablend打开,关掉zwrite。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 09:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表