游戏开发论坛

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

如何用一个LPDIRECT3DVERTEXBUFFER9来实现多个图形的绘制?

[复制链接]

24

主题

77

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2006-8-9 11:02:00 | 显示全部楼层

Re:如何用一个LPDIRECT3DVERTEXBUFFER9来实现多个图形的绘制?

呵呵,多谢各位来回答
我来简化一下问题,就使用 sdk 中的最简单的绘制三角形的例子

我在标准的绘制三角形的部分,添加了一些绘制另一个三角形的标准代码 [代码见后面]

这样就会导致每次绘制,只有是我后面添加的那个三角形显示了出来,而原来的三角形没有显示出来 [这个例子够简单了,不太可能是相机呀,视角的问题了。。]

我就是想知道,这种 LOCK memcpy UNLock 的模式是不是不能连续使用呢?
[我的意思是,一个 LPDIRECT3DVERTEXBUFFER9 连续用于不同的图形]

其实我对这种模式不是很了解,一直就是用而已,想借这个机会学习一下 ^_^

[奇怪的是,我原来的一个程序就是这么连续用的,也能用 @_@]

指点一下吧,谢谢!

以下是代码:
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {      
        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

        // test
        // 尝试使用同一个顶点缓存绘制多个三角形
        CUSTOMVERTEX vertices[] =
        {
                { 75.0f,  25.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
                { 125.0f, 125.0f, 0.5f, 1.0f, 0xff00ff00, },
                {  25.0f, 125.0f, 0.5f, 1.0f, 0xff00ffff, },
        };

        if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
                                        0, D3DFVF_CUSTOMVERTEX,
                                        D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
        {
                return ;
        }

        VOID* pVertices;
        if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
                return ;
        memcpy( pVertices, vertices, sizeof(vertices) );
        g_pVB->Unlock();

        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
        // test end

        g_pd3dDevice->EndScene();
    }

    g_pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2006-8-9 11:15:00 | 显示全部楼层

Re:如何用一个LPDIRECT3DVERTEXBUFFER9来实现多个图形的绘制?

哎,没看到有变换设置,怎么会有多个三角形呢?SetTransform(D3DTS_WORLD,matrix)呢?没有平移所有的三角形都在同一个位置,默认的z-buffer是LEQUAL,所以后面的三角形永远覆前面的三角形。
楼主这样做..效率极低....
楼上有人说了instancing...可以看看DX的DEMO,但现在instancing还是有很多问题,使得无法对instance体做灵活的操作。

24

主题

77

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2006-8-9 13:22:00 | 显示全部楼层

Re:如何用一个LPDIRECT3DVERTEXBUFFER9来实现多个图形的绘制?

呵呵,非常感谢 whb9633 兄顽强的回答我的问题。

上面的那部分程序,只要把我 test 到 test end 的部分注释掉,就能够看到第一个三角形,两个三角形的位置时不重合的

而且,如果我使用两个 LPDIRECT3DVERTEXBUFFER9  来绘制这两个三角形
那么两个三角形就能同时出现

所以我才有 LPDIRECT3DVERTEXBUFFER9 能不能连续使用的疑惑,谢谢!

24

主题

77

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2006-8-10 10:07:00 | 显示全部楼层

Re:如何用一个LPDIRECT3DVERTEXBUFFER9来实现多个图形的绘制?

继续继续,这个问题应该很多人都碰到过吧?
为什么呢?

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-8-10 10:32:00 | 显示全部楼层

Re:如何用一个LPDIRECT3DVERTEXBUFFER9来实现多个图形的绘制?

to whb9633:
Instancing的实现有很多种,并不仅局限于sm3.0,而且已经被大量使用
不知你所说的问题是什么
愿闻其详

http://www.cnblogs.com/oiramario/archive/2005/12/14/296845.html

24

主题

77

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2006-8-10 12:56:00 | 显示全部楼层

Re:如何用一个LPDIRECT3DVERTEXBUFFER9来实现多个图形的绘制?

Instancing 作为一种技术肯定是有局限的
我只用vs实现过最简单的一种 Instancing (大量实体的位移)

记得说,黑与白2 里面的大型战斗场面使用的是 Instancing,细节就不知道了。。

牛人要是知道我的问题,指点一下吧 ^_^

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2006-8-10 21:11:00 | 显示全部楼层

Re: 如何用一个LPDIRECT3DVERTEXBUFFER9来实现多个图形的绘制?

楼主:DEMO里对一个VB里调用 了两次DP,你代码没贴全,YY不出你的问题在哪。自己看代码吧。

TO 千里马肝:
在你的BLOG里简单的回了两句,目前来说instancing分四种,你写那种大概可以归属于static 批次,可以看看GPU gems 2的第三章,对每种的局限性都有说明:)

sf_2006810211059.rar

187.29 KB, 下载次数:

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2006-8-10 21:13:00 | 显示全部楼层

Re:如何用一个LPDIRECT3DVERTEXBUFFER9来实现多个图形的绘制?

因为这两天心情非常糟糕,所以从公司请假去了关内(深圳,这个城市怪怪的,分关内关外,完全不是一个天地)。

24

主题

77

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2006-8-11 20:32:00 | 显示全部楼层

Re:如何用一个LPDIRECT3DVERTEXBUFFER9来实现多个图形的绘制?

呵呵,这个例子就是最基本的绘制一个三角形的教程,按说其他的地方都非常标准了呀
好吧,周一到公司在贴全部的代码

to whb9633:呵呵,好好放松吧 ^_^

0

主题

29

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2006-8-11 21:04:00 | 显示全部楼层

Re: 如何用一个LPDIRECT3DVERTEXBUFFER9来实现多个图形的绘制?

用TRIANGLELIST加索引应该可以办到吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 03:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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