游戏开发论坛

 找回密码
 立即注册
搜索
楼主: wyxsz

关于多重纹理混合的问题

[复制链接]

2

主题

132

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2008-7-5 13:16:00 | 显示全部楼层

Re: 关于多重纹理混合的问题

不想渲染多次。。不知道还有什么办法了。。就如ricohcanon所说的,换显卡吧,嘿嘿
开发游戏的用GF4的显卡好像有些寒酸了。。  [em10]

但是你的那个显卡,似乎换显卡还要换主板……
GF4好像是PCI的接口,不知道PCI16x的是不是向下兼容。。。
PCIe2.0的倒是可以兼容PCI16x的

2

主题

132

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2008-7-5 13:42:00 | 显示全部楼层

Re:关于多重纹理混合的问题

好像还是有问题...应该MaxTextureBlendStages才是支持的最大纹理混合层数吧?

0

主题

37

帖子

41

积分

注册会员

Rank: 2

积分
41
发表于 2008-7-5 18:15:00 | 显示全部楼层

Re:关于多重纹理混合的问题

向大家学习ing

7

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2008-7-5 20:18:00 | 显示全部楼层

Re: 关于多重纹理混合的问题

    谢谢各位的解答,我还想请问一下,就是我的显卡虽然不支持像素着色器,但是可以用REF模式来观看运行结果,那么请问使用像素着色器最多可以混合几层纹理呢?
    还有一个问题就是,使用固定管线进行多遍渲染,但是我想尽可能减少绘制次数,能不能通过下面的途径,就是先创建一个透明纹理,然后将两个纹理混合之后,使用RendertoTexture方法将混合之后的纹理渲染到创建好的透明纹理上面,最后再将这个纹理贴上去,有没有可能通过循环语句将更多的纹理进行混合然后贴上去,从而减少绘制顶点的次数呢?我将核心代码贴出来,并将完整代码上传,麻烦各位帮我看看好吗?拜托了!
LPDIRECT3DSURFACE9 pRenderTarget;
g_pd3dDevice->GetRenderTarget(0 , &pRenderTarget);
g_pd3dDevice->SetRenderTarget(0 , g_pRenderSurface);
g_pd3dDevice->Clear(0 , 0 , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER ,D3DCOLOR_ARGB(0, 255 , 0,  0) , 1 , 0);
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{  g_pd3dDevice->SetRenderState(D3DRS_LIGHTING , FALSE);
   g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
   g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
   g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
   g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
}
g_pd3dDevice->SetRenderTarget(0 , pRenderTarget);
g_pd3dDevice->Clear(0 , 0 , D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER ,3DCOLOR_XRGB(255 , 255 , 255) , 1 , 0);
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{  D3DXMATRIX matWorld;
   g_pd3dDevice->SetTransform(D3DTS_WORLD , &matWorld);
   SetTransform();
   g_pd3dDevice->SetTexture(0 , g_pRenderTexture);
   g_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
   g_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);

   g_pd3dDevice->SetSamplerState(0 , D3DSAMP_ADDRESSU , D3DTADDRESS_MIRROR);
   g_pd3dDevice->SetSamplerState(0 , D3DSAMP_ADDRESSV , D3DTADDRESS_MIRROR);
   g_pd3dDevice->SetRenderState(D3DRS_LIGHTING , FALSE);
   g_pd3dDevice->SetStreamSource(0 , g_pVB , 0 , sizeof(CUSTOMVERTEX));
   g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
   g_pd3dDevice->SetTexture(0 , g_pTexture);
   g_pd3dDevice->SetTexture(1 , g_pTexture1);
   g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
   g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
   g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT );
   g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
   g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
   g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD);//MODULATE2X );
   g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT   );
   g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP , 0 , 2);
   g_pd3dDevice->EndScene();
  }
   g_pd3dDevice-&gtresent(0 , 0 , 0 , 0);
       

2

主题

132

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2008-7-6 11:14:00 | 显示全部楼层

Re:关于多重纹理混合的问题

是可以用REF观看结果的,就是那个速度也太慢了。

如果使用 RendertoTexture 渲染的开销就更大了,呵呵。。。还不如就渲染几次那个模型,但是用RendertoTexture的效果可能好得多,这样也这样随便你混合几层纹理。

使用像素着色器混合要看pixel shader的版本,1.x的版本的理论上最多4层纹理,因为只能包含4个纹理指令,8个算数指令。1.4的有6个纹理指令+8个算数指令。 2.0的32个纹理指令+64算数指令。2.x是至少96个任意指令。3.0是至少512个任意指令。指令越多,混合的层数就越多。

还有混合的层数还和具体的混合算法有关系,不同的混合方式要使用不同的指令代码,要占用指令槽的。

然后 Geforce 3 Ti 是支持vs/ps 1.x
Geforce 4 不支持 shader
GF 5 有 2.0,有些可能是2.x,不怎么清楚
GF 6/7 是 3.0
GF 8/9, GTX 260/280 是支持 4.0

AMD(ATI) 的
RADEON 7000到RADEON 9200 是 1.1,但是RADEON 7200是0.0(不支持shader)
RADEON 9600/X300开始的支持2.0
到X1000多系列就是支持3.0
HD2/HD3/HD4 系列是4.0

4.0的指令数是无限的,理论上就是可以混合任意层数的纹理。

还有 4.1 的版本,不知道 9800 GTX 支不支持,没有试过,好久试一下。。。GTX260/280就不知道了,没有那种显卡。AMD的ATi HD4850这些也不知道是不是支持4.1

7

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2008-7-6 11:22:00 | 显示全部楼层

Re: 关于多重纹理混合的问题

     谢谢!刚才说到RenderToTexture可以随便混合几层纹理,是真的吗?为什么这种方法可以不首显卡限制呢?难道不需要使用SetTextureStagaState函数吗?那我要想混合尽可能多的纹理具体该怎样做呢?麻烦你再帮我指点一下好吗?

2

主题

132

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2008-7-6 11:29:00 | 显示全部楼层

Re:关于多重纹理混合的问题

嗯,不需要,哦,需要,只需要一两层就好了。。。那个东西实际上就是把需要混合的纹理一层一层设置好透明度之后画上去就行了。。。你说具体该怎么做是要什么?过程还是代码?嘿嘿

7

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2008-7-6 15:43:00 | 显示全部楼层

Re: 关于多重纹理混合的问题

    请问是不是要先创建一个透明的纹理表面,然后再把我需要的纹理一层一层叠加上去呢?你说只要设置好透明度就可以混合很多层纹理,那请问用哪个函数设置透明度?如果可以的话拜托你大致帮我示范一下混合三层的代码好吗?

2

主题

132

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2008-7-6 23:12:00 | 显示全部楼层

Re:关于多重纹理混合的问题

我就把代码片断写在这里还是给你一个完整可以运行的代码?

7

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2008-7-7 09:08:00 | 显示全部楼层

Re: 关于多重纹理混合的问题

     我主要是对这种方法的机制不是很清楚,所以我不知道该怎样加载任意多层纹理,我想麻烦你帮我在这里示范一下代码的片断,完整的代码我自己来写。拜托了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 23:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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