游戏开发论坛

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

一个粒子系统的问题,

[复制链接]

36

主题

107

帖子

107

积分

注册会员

Rank: 2

积分
107
发表于 2007-11-8 19:53:00 | 显示全部楼层 |阅读模式
高手指导一下吧,由于代码量的关系没有粘贴所有代码,希望我说清楚这个问题了,就是我的粒子颜色设置后,结果没有显示我所设置颜色,显示是的是白色
我首先创建一个纹理       
hr = m_pID3D9Device->CreateTexture(m_sEditRes.ulWidth, m_sEditRes.ulHeight/2, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &ms_pITexture, NULL);
                                       
然后又创建一个粒子纹理

hr = device->CreateVertexBuffer(
                _vbSize * sizeof(Particle),
                D3DUSAGE_DYNAMIC | D3DUSAGE_POINTS | D3DUSAGE_WRITEONLY,
                Particle::FVF,
                D3DPOOL_DEFAULT, // D3DPOOL_MANAGED can't be used with D3DUSAGE_DYNAMIC
                &_vb,
                0);
       
       
hr = D3DXCreateTextureFromFile(
                device,
                texFileName,
                &_tex);

但是每次渲染之前加入下面几句话后,我的粒子效果的颜色就显示不了了,要是不加的话,我的第一次创建的纹理也就显示不出来啊。
        hr = m_pID3D9Device->SetTexture( 0, ms_pITexture[m_nInputSurfaceCount - nTimesID - 1] );
        hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 );
        hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);       
        hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );       
        hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );       
        hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
               

36

主题

107

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2007-11-9 08:43:00 | 显示全部楼层

Re:一个粒子系统的问题,

各位哥哥指导一下吧

0

主题

228

帖子

285

积分

中级会员

Rank: 3Rank: 3

积分
285
发表于 2007-11-12 10:25:00 | 显示全部楼层

Re:一个粒子系统的问题,

hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
改成这样试试,你的效果应该是用rgb值相乘,而不是alpha相乘吧

36

主题

107

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2007-11-12 14:23:00 | 显示全部楼层

Re:一个粒子系统的问题,

quanyy:谢谢你的指导,你的方法我试过了还是不行,修改之后出现了我把上面几句去掉后相同的现象,虽然粒子的颜色好了,但是我第一次创建的纹理不见了。

我想我这个问题还是没有说的很清楚,耽误了大家的宝贵的时间,现在我重新叙述一下。

我首先创建一个纹理:
hr = m_pID3D9Device->CreateTexture(m_sEditRes.ulWidth, m_sEditRes.ulHeight/2, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &ms_pITexture, NULL);
然后创建第二个纹理(粒子纹理):
hr = device->CreateVertexBuffer(
_vbSize * sizeof(Particle),
D3DUSAGE_DYNAMIC | D3DUSAGE_POINTS | D3DUSAGE_WRITEONLY,
Particle::FVF,
D3DPOOL_DEFAULT, // D3DPOOL_MANAGED can't be used with D3DUSAGE_DYNAMIC
&_vb,
0);
然后设置渲染状态:
hr = m_pID3D9Device->SetTexture( 0, ms_pITexture[m_nInputSurfaceCount - nTimesID - 1] );
hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 );
hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
hr = m_pID3D9Device->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
hr = m_pID3D9Device->SetTexture( 1, NULL );
然后选后DrawPrimitive 第一个纹理所在的画面。

(为了DrawPrimitive粒子系统) 设置参数。
_device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
_device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);

_device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
// read, but don't write particles to z-buffer
_device->SetRenderState(D3DRS_ZWRITEENABLE, false);

然后DrawPrimitive粒子系统

最后present

但是最后的画面并有呈现我所设置的粒子颜色。当我在粒子系统的设置中加上_device->SetTextureStageState(0, D3DTSS_COLOROP,D3DTOP_DISABLE );的时候,我粒子有了颜色,但是所用的素材是我第一次创建的素材,并不是我粒子的素材,请问各位大哥,这是怎么回事啊?






0

主题

228

帖子

285

积分

中级会员

Rank: 3Rank: 3

积分
285
发表于 2007-11-13 10:48:00 | 显示全部楼层

Re:一个粒子系统的问题,

hr = m_pID3D9Device->SetTexture( 0, ms_pITexture[m_nInputSurfaceCount - nTimesID - 1] );
你就简单的画一个三角形看会不会显示你的纹理,如果也没有,也许是你纹理加载的地方有问题
还有你用点精灵来绘制粒子系统是不是设置了相应的渲染状态呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-19 03:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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