游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2763|回复: 5

用d3d做lod的时候,如果要灌顶点和opengl不一样怎么解决?

[复制链接]

36

主题

135

帖子

135

积分

注册会员

Rank: 2

积分
135
发表于 2004-4-27 22:12:00 | 显示全部楼层 |阅读模式
opengl只需要用glVertex3i或者glVertex3f,在d3d里面我需要先填充IDirect3DVertexBuffer8结构,然后调用SetStreamSource()梆定顶点缓冲,调用DrawPrimitive绘制设定的那些顶点。关键是做四叉树lod的时候,用triangle-fan方式绘制顶点,因此渲染一个网格,定义中心点和四个角点,在opengl里面只需要:
        glBegin( GL_TRIANGLE_FAN );
        SetTextureCoord(x1,x2);
        glVertex3i(v1,v2,v3);
        //类似省略
        glEnd();
而在d3d中,就必须这么做(“填充结构、设定stream源、绘制顶点”全部完成):
        m_pVertexBuffer->Lock(0, sizeof(cvVertices), (BYTE**)&pVertices, 0);
        memcpy(pVertices, cvVertices, sizeof(cvVertices));                //假设cvVertices已经填充好顶点信息了
        m_pVertexBuffer->Unlock();

        m_pD3DDevice->SetStreamSource(0, m_pVertexBuffer, sizeof(CUSTOMVERTEX));
        m_pD3DDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
        m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLEFAN , fc , fd);

关键是调用DrawPrimitive的话,d3d就开始执行绘图了,这样在lod中要是递归调用DrawPrimitive很多次,肯定效率特别低。
注意:由于triangle-fan的中心是会变化的,因此如果想把所有的顶点都灌到一个IDirect3DVertexBuffer8结构中的话,又无法实现中心点会变化的triangle-fan。总不能够对应一个网格就做一个IDirect3DVertexBuffer8结构来存储吧?无论怎样,都特别消耗资源,不如opengl来的简单高效?

1

主题

51

帖子

51

积分

注册会员

Rank: 2

积分
51
发表于 2004-4-28 15:43:00 | 显示全部楼层

Re:用d3d做lod的时候,如果要灌顶点和opengl不一样怎么解决?

插嘴,因为我不懂D3D。
在OpenGL里面你要高效也不应该用这种方法阿?应该用glDrawElements。如果可能用vertex buffer object。

36

主题

135

帖子

135

积分

注册会员

Rank: 2

积分
135
 楼主| 发表于 2004-4-28 17:27:00 | 显示全部楼层

Re:用d3d做lod的时候,如果要灌顶点和opengl不一样怎么解决?

我看那些算法都是用的我说的那种方式,我现在想知道D3D该怎么做?

36

主题

135

帖子

135

积分

注册会员

Rank: 2

积分
135
 楼主| 发表于 2004-5-6 16:16:00 | 显示全部楼层

Re:用d3d做lod的时候,如果要灌顶点和opengl不一样怎么解决?

每次都要做一个六个元素的结构体数组来存放一个trianglefan,但是在d3d中创建一个vb要返回一个vb的指针,因此画下一个trianglefan的时候,前一个trianglefan的vb指针就会被更新,从而造成资源泄漏。在debug模式下结束程序,vc会报告资源泄漏,如何解决呢?毕竟我不知道到底这一帧我会绘制多少个trianglefan,除非递归完全结束,而且那也不是完全准确的(还有消除裂缝的插补三角形存在),所以一次调用CreateVertexBuffer()全部申请也不现实。
相比而言,opengl就没有这些问题。opengl做进去一个顶点,不会有vb之内的指针返回来,不存在管理问题。如何解决这个vb指针被覆盖的问题呢?

0

主题

130

帖子

130

积分

注册会员

Rank: 2

积分
130
发表于 2004-5-7 10:48:00 | 显示全部楼层

Re:用d3d做lod的时候,如果要灌顶点和opengl不一样怎么解决?

不要建立很多个vb,
应该一次建立一个足够大的VB和IB,将新生成的顶点填到VB,生成新的面表填到IB.
需要你能预先对顶点的数目有一个估计.

36

主题

135

帖子

135

积分

注册会员

Rank: 2

积分
135
 楼主| 发表于 2004-5-7 14:00:00 | 显示全部楼层

Re:用d3d做lod的时候,如果要灌顶点和opengl不一样怎么解决?

像递归那样的操作如何进行估计?变化很大的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-30 18:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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