游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: flyue

实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色器?

[复制链接]

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2009-5-19 17:47:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

很显然类似HGE那样频繁的锁定VB会降低速度.

每调用一次_render_batch()或者换一个纹理就要解锁并Draw一次, 而游戏里换纹理是很频繁的操作.

所以我觉得还是为每个矩形(4个顶点)创建一个VB比较好, 虽然D3D管理起来比较麻烦, 但至少在画的时候很快.
这样的好处是可以很灵活的使用着色器来制造出2D特效.

改变绘图位置不用锁定VB, 而是用矩阵来改变, 矩阵变换应该比锁定顶点更快吧?

至于纹理坐标的变换, 只能通过锁定来修改了, 但是纹理坐标一般是不会修改的.
原来打算使用纹理坐标变换矩阵, 后来觉得实在是太慢了, 就不打算用

把一个顶点的xy坐标和 uv纹理坐标 分成2个流, 这样应该比较好改动和便于拓展.

13

主题

113

帖子

113

积分

注册会员

Rank: 2

积分
113
发表于 2009-5-20 09:56:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

HGE并不像你想象那样,画一个图都要锁一次,它是在_begin_draw的时候锁,render的时候,其实是把顶点放进VB里,_end_draw的时候解锁,然后画出来.

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2009-5-20 12:25:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

void HGE_Impl::_render_batch(bool bEndScene)
{
    if(VertArray)
    {
        pVB->Unlock();
        
        if(nPrim)
        {
            switch(CurPrimType)
            {
                case HGEPRIM_QUADS:
                    pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, nPrim<<2, 0, nPrim<<1);
                    break;

                case HGEPRIM_TRIPLES:
                    pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, nPrim);
                    break;

                case HGEPRIM_LINES:
                    pD3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, nPrim);
                    break;
            }

            nPrim=0;
        }

        if(bEndScene) VertArray = 0;
        else pVB->Lock( 0, 0, (BYTE**)&VertArray, 0 );
    }
}

void CALL HGE_Impl::Gfx_RenderQuad(const hgeQuad *quad)
{
    if(VertArray)
    {
        if(CurPrimType!=HGEPRIM_QUADS || nPrim>=VERTEX_BUFFER_SIZE/HGEPRIM_QUADS || CurTexture!=quad->tex || CurBlendMode!=quad->blend)
        {
            _render_batch();

            CurPrimType=HGEPRIM_QUADS;
            if(CurBlendMode != quad->blend) _SetBlendMode(quad->blend);
            if(quad->tex != CurTexture)
            {
                pD3DDevice->SetTexture( 0, (LPDIRECT3DTEXTURE8)quad->tex );
                CurTexture = quad->tex;
            }
        }

        memcpy(&VertArray[nPrim*HGEPRIM_QUADS], quad->v, sizeof(hgeVertex)*HGEPRIM_QUADS);
        nPrim++;
    }
}

纹理不同, 改变渲染模式, 改变渲染的图元形状, 以及超出VB内存 都会导致 _render_batch 的调用.

而_render_batch 是会 解锁/绘制/锁定 的.

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-5-20 12:45:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

切记一点:

DX9里所有切换渲染状态的主要开销,都是延迟到调用DrawPrimitive时发生,显卡驱动上传状态改变是批量传送的,调用DP的次数严重影响性能。同时切换VB是个比较昂贵的状态改变。

13

主题

113

帖子

113

积分

注册会员

Rank: 2

积分
113
发表于 2009-5-20 12:54:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

学习了

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2009-5-20 17:34:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

感觉很难找到一个最好的平衡点 来处理2D图形的输出.

总之, 根据需求来设计吧.

25

主题

77

帖子

77

积分

注册会员

Rank: 2

积分
77
发表于 2010-3-23 22:11:00 | 显示全部楼层

Re:实际开发时,是使用ID3DXEffect还是直接管理顶点/像素着色

我还是觉得直接用Shader好啊,用Effect感觉灵活性降低了很多。。

(别怪我挖坟,我也在想这个问题。。)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-13 19:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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