游戏开发论坛

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

一个关于TRAINGLE——LIST简单而又奇怪的问题

[复制链接]

18

主题

58

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2009-10-10 20:21:00 | 显示全部楼层 |阅读模式
我在写一个LOD + 四叉树的地形的时候发现我的渲染有问题,我是先把所有的顶点计算好,然后再用索引来指定要渲染的顶点(以前是一边采取点,一边渲染),但是在渲染的时候出现了问题,于是我把它给简化了下
我建立了 25 个顶点 如下

        m_pDevice->CreateVertexBuffer(
                        sizeof(Vertex) * m_width*m_height,
                        0,
                        FVF_VERTEX,
                        D3DPOOL_MANAGED,
                        &m_pVertexBuf,
                        0);

        for(int i = 0; i < m_height; i++)
        {
                for(int j = 0; j < m_width; j++)
                {
                        int  m = i * m_width + j;

                        vb[m]  =  Vertex(j * 10,
                                         height,
                                         i * 10,
                                         j * uCellSize,
                                         i * vCellSize);
                }
        }
然后用索引的方式来指定要渲染的顶点,渲染的代码如下

这个是其中的一个渲染,9个顶点,8个三角型组成的一个扇型,我创建了24个索引,其中当下面的X,Z为(3,1)时可以显示
图形,但是为(1,3)却不行
        m_pDevice->CreateIndexBuffer(24 * sizeof(WORD),
                                     0,
                                     D3DFMT_INDEX16,
                                     D3DPOOL_MANAGED,
                                     &m_pIndexBuf,
                                     0);

        m_pIndexBuf->Lock(0, 0, (void**)&ib, 0);

        // x, z是扇型的中心
        ib[0]  =  z * m_width + x;
        ib[1]  =  (z + 1) * m_width + x - 1;
        ib[2]  =  (z + 1) * m_width + x;

        ib[3]  =  z * m_width + x;
        ib[4]  =  (z + 1) * m_width + x;
        ib[5]  =  (z + 1) * m_width + x + 1;

        ib[6]  =  z * m_width + x;
        ib[7]  =  (z + 1) * m_width + x + 1;
        ib[8]  =  z * m_width + x + 1;

        ib[9]   =  z * m_width + x;
        ib[10]  =  z * m_width + x + 1;
        ib[11]  =  (z - 1) * m_width + x + 1;

        ib[12]  =  z * m_width + x;
        ib[13]  =  (z - 1) * m_width + x + 1;
        ib[14]  =  (z - 1) * m_width + x;

        ib[15]  =  z * m_width + x;
        ib[16]  =  (z - 1) * m_width + x;
        ib[17]  =  (z - 1) * m_width + x -1;

        ib[18]  =  z * m_width + x;
        ib[19]  =  (z - 1) * m_width + x - 1;
        ib[20]  =  z * m_width + x - 1;

        ib[21]  =  z * m_width + x;
        ib[22]  =  z * m_width + x - 1;
        ib[23]  =  (z + 1) * m_width + x - 1;

        m_pIndexBuf->Unlock();

        m_pDevice->SetTexture(0, m_dxTexture);
            m_pDevice->SetStreamSource(0, m_pVertexBuf, 0, sizeof(Vertex));
                m_pDevice->SetIndices(m_pIndexBuf);
            m_pDevice->SetFVF(FVF_VERTEX);

            m_pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 9, 0, 8);

但是看不到效果,然后我做了个测试,连这样的索引都没有用
       m_pIndexBuf->Lock(0, 0, (void**)&ib, 0);

        ib[0]  =  0;
        ib[1]  =  12;
        ib[2]  =  4;
        ib[3]  =  12;
        ib[4]  =  20;
        ib[5]  =  24;

        m_pIndexBuf->Unlock();

        m_pDevice->SetTexture(0, m_dxTexture);
            m_pDevice->SetStreamSource(0, m_pVertexBuf, 0, sizeof(Vertex));
        m_pDevice->SetIndices(m_pIndexBuf);
            m_pDevice->SetFVF(FVF_VERTEX);

            m_pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 5, 0, 2);

上面的渲染方式也看不到图形,真是不知道怎么的,谢谢各位帮忙

18

主题

58

帖子

132

积分

注册会员

Rank: 2

积分
132
 楼主| 发表于 2009-10-11 13:24:00 | 显示全部楼层

Re:一个关于TRAINGLE——LIST简单而又奇怪的问题

有人可以帮我看下吗

14

主题

127

帖子

133

积分

注册会员

Rank: 2

积分
133
发表于 2009-10-11 14:05:00 | 显示全部楼层

Re:一个关于TRAINGLE——LIST简单而又奇怪的问题

class TerrainFan
{
public:
        int                         fan_iNumIndex;                //索引个数
        int          fan_iNumVertex;        //顶点个数
        DWORD fan_index[10];                        //扇形索引
        DWORD fan_IndexArray[24];

        TerrainFan()
        {
                fan_iNumIndex        = 0;
                fan_iNumVertex=0;
        }
        ~TerrainFan(){}

        inline void Add(int ix,int iz);
        void Clear()
        {
                fan_iNumIndex = 0;
                fan_iNumVertex=0;
        }
};

inline void TerrainFan::Add(int ix,int iz)
{
        int index = iz * AQ_Terrain::m_iSize +ix;
        fan_index[fan_iNumVertex++] = index;
        if (fan_iNumVertex>=3)
        {
                fan_IndexArray[fan_iNumIndex++] = fan_index[0];
                fan_IndexArray[fan_iNumIndex++] = fan_index[fan_iNumVertex-2];
                fan_IndexArray[fan_iNumIndex++] = fan_index[fan_iNumVertex-1];
        }
}

前段时间我也写了个四叉树LOD地形,也是扇形索引,呵呵,在这里问的问题都没有一个人回答过。。。后来自己慢慢研究,慢慢就做出来了,加油吧,坚持不懈!

14

主题

127

帖子

133

积分

注册会员

Rank: 2

积分
133
发表于 2009-10-11 14:12:00 | 显示全部楼层

Re: 一个关于TRAINGLE——LIST简单而又奇怪的问题

我的方法在地形三角形多的时候渲染会很慢,四叉树LOD地形消耗比较多的CPU运算,我的没做优化,你可以试试边加载20个扇形边渲染,减少CPU计算的时候,GPU的等待时间。

18

主题

58

帖子

132

积分

注册会员

Rank: 2

积分
132
 楼主| 发表于 2009-10-11 14:18:00 | 显示全部楼层

Re:一个关于TRAINGLE——LIST简单而又奇怪的问题

我觉得渲染代码最好是不要用函数,函数调用浪费时间,内联和不用函数都是增大程序,不如就直接写,我上面的代码没有用,但是不知道为什么有的时候没有显示出来了,真是怪
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-20 04:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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