游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2610|回复: 6

关与D3D中纹理混合的问题

[复制链接]

5

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2009-3-16 18:31:00 | 显示全部楼层 |阅读模式
我用mesh编写了一个平面地形,假设我要在相邻的两个平面上各贴一层纹理,贴上以后要让两个面之间有个过渡,而不是特别明显的看着是贴了两个纹理图片上去,这样的话我应该怎么设置呢?请懂的回答下我实在是没办法了
abc

0

主题

56

帖子

62

积分

注册会员

Rank: 2

积分
62
发表于 2009-3-16 21:04:00 | 显示全部楼层

Re:关与D3D中纹理混合的问题

在交界的地方加一段Triangle strip,要有一定宽度。利用这段Strip做纹理之间的过渡。

9

主题

249

帖子

260

积分

中级会员

Rank: 3Rank: 3

积分
260
发表于 2009-3-17 12:23:00 | 显示全部楼层

Re:关与D3D中纹理混合的问题

用多层纹理混合不行吗

0

主题

56

帖子

62

积分

注册会员

Rank: 2

积分
62
发表于 2009-3-17 12:57:00 | 显示全部楼层

Re: Re:关与D3D中纹理混合的问题

bskk: Re:关与D3D中纹理混合的问题

用多层纹理混合不行吗

可以,但是这样会把整个地形的绘制搞复杂(增加shader长度),效率不高。而加Strip将复杂度的增加局限于了一小部分的像素上。而且这样整个绘制的逻辑会跟清晰。

5

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2009-3-17 13:17:00 | 显示全部楼层

Re:关与D3D中纹理混合的问题

2楼的大哥的意思是在两个面之间再增加一个面来进行纹理的过渡吗,

5

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2009-3-17 13:19:00 | 显示全部楼层

Re:关与D3D中纹理混合的问题

HRESULT CTerrain::InitTerrain(DWORD _cols)
{
        g_pCols = _cols;
        g_pNumFace = g_pCols * g_pCols * 2;
        g_pNumVertex = (g_pCols + 1) * (g_pCols + 1);
        g_pHeight = new BYTE[g_pNumVertex];
        DWORD numRow  = g_pCols + 1;//每行的顶点数
        for (DWORD row = 0; row < g_pCols + 1; ++row)
        {
                for (DWORD col = 0; col < g_pCols + 1;++col)
                {
                        DWORD index = row * numRow + col;
                        g_pHeight[index] = 0;
                }
        }
        g_pAttri = new BYTE[g_pNumFace];
        for(DWORD num = 0; num < g_pNumFace;++num)
        {
                g_pAttri[num] = 0;
        }
        LPDIRECT3DTEXTURE9 pTempTex;
        D3DXCreateTextureFromFile(g_pd3dDevice,L"草1.bmp",&pTempTex);
        g_pTexture.push_back(pTempTex);
        D3DXCreateTextureFromFile(g_pd3dDevice,L"草2.bmp",&pTempTex);
        g_pTexture.push_back(pTempTex);
        D3DXCreateTextureFromFile(g_pd3dDevice,L"草3.bmp",&pTempTex);
        g_pTexture.push_back(pTempTex);
        D3DXCreateTextureFromFile(g_pd3dDevice,L"地1.bmp",&pTempTex);
        g_pTexture.push_back(pTempTex);
        D3DXCreateTextureFromFile(g_pd3dDevice,L"地2.bmp",&pTempTex);
        g_pTexture.push_back(pTempTex);
        D3DXCreateTextureFromFile(g_pd3dDevice,L"地3.bmp",&pTempTex);
        g_pTexture.push_back(pTempTex);
        D3DXCreateTextureFromFile(g_pd3dDevice,L"石路1.bmp",&pTempTex);
        g_pTexture.push_back(pTempTex);
        D3DXCreateTextureFromFile(g_pd3dDevice,L"石路2.bmp",&pTempTex);
        g_pTexture.push_back(pTempTex);

        HRESULT hr;
        hr = D3DXCreateMeshFVF(g_pNumFace,g_pNumVertex,D3DXMESH_MANAGED,VERTEX::FVF,g_pd3dDevice,&g_pMesh);
        InitVB(g_pCols);
        InitIB(g_pCols);
        InitAB();
        return S_OK;
}

//顶点缓冲
void CTerrain::InitVB(
                                          DWORD _cols)
{
        g_pCols = _cols;
        float lengthX = g_pCols * g_pTileSize;//X方向上总长度
        float lengthZ = g_pCols * g_pTileSize;//Z方向上总长度
        DWORD numRow  = g_pCols + 1;//每行的顶点数

        VERTEX* v = NULL;
        g_pMesh->LockVertexBuffer(0,(void**)&v);
        for (DWORD row = 0; row < g_pCols + 1; ++row)
        {
                for (DWORD col = 0; col < g_pCols + 1;++col)
                {
                        DWORD index = row * numRow + col;
                        //设置顶点坐标
                        v[index].x = -lengthX * 0.5f + g_pTileSize * col;
                        v[index].y = (float)g_pHeight[index];
                        v[index].z = lengthZ * 0.5f - g_pTileSize * row;

                        //设置顶点UV
                        if ((row % 2) == 0)
                        {
                                if ((col % 2) == 0)
                                {
                                        v[index].tu = 0.0f;
                                        v[index].tv = 0.0f;
                                }
                                else
                                {
                                        v[index].tu = 1.0f;
                                        v[index].tv = 0.0f;
                                }
                        }
                        else
                        {
                                if ((col % 2) == 0)
                                {
                                        v[index].tu = 0.0f;
                                        v[index].tv = 1.0f;
                                }
                                else
                                {
                                        v[index].tu = 1.0f;
                                        v[index].tv = 1.0f;
                                }
                        }
                }
        }
        g_pMesh->UnlockVertexBuffer();

}
//索引缓冲
void CTerrain::InitIB(DWORD _cols)
{
        g_pCols = _cols;
        DWORD numRow  = g_pCols + 1;//每行的顶点数

        WORD* i = NULL;
        g_pMesh->LockIndexBuffer(0,(void**)&i);
        for (DWORD row = 0; row < g_pCols; ++row)
        {
                for (DWORD col = 0; col < g_pCols;++col )
                {
                        DWORD index = row * g_pCols + col;//每个格子的索引
                        i[index * 6 + 0] = (WORD)(row * numRow + col);
                        i[index * 6 + 1] = (WORD)(row * numRow + col + numRow + 1);
                        i[index * 6 + 2] = (WORD)(row * numRow + col + numRow);
                        i[index * 6 + 3] = (WORD)(row * numRow + col);
                        i[index * 6 + 4] = (WORD)(row * numRow + col + 1);
                        i[index * 6 + 5] = (WORD)(row * numRow + col + numRow + 1);
                }
        }
        g_pMesh->UnlockIndexBuffer();

}
//属性缓冲
void CTerrain::InitAB()
{
        DWORD * attribute = NULL;
        g_pMesh->LockAttributeBuffer(0,&attribute);
        for (DWORD num = 0; num < g_pNumFace;++num)
        {
                attribute[num] = g_pAttri[num];
        }
        g_pMesh->UnlockAttributeBuffer();

}

void CTerrain:: Render()
{
        //g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
       
        for (DWORD i = 0;i< g_pNumSubset;++i)
        {
                g_pd3dDevice->SetTexture(0,g_pTexture);
                g_pMesh->DrawSubset(i);
        }

}
这是我的mesh地形,我鼠标点到哪哪个面就改变它的纹理,等于是相邻的两个面上都只有一层纹理,我就是想这两个面之间的纹理进行一下混合过度,如果在他们之间添加了一个新面那整个地形不就改变了吗
具体的实现方法能不能给出来啊

0

主题

56

帖子

62

积分

注册会员

Rank: 2

积分
62
发表于 2009-3-17 15:54:00 | 显示全部楼层

Re:关与D3D中纹理混合的问题

前面没完全理解你的要求,你这样的情况加过渡Mesh不是太好了。

你是要做地形刷子是吗?你好像没用Shader啊。如果用Shader就很方便了,你为每个顶点存一个Blend系数,然后在Shader里对两个纹理进行采样,再根据这个系数进行Blend计算。如果你支持多个纹理层,就需要多套系数。
另外如果你觉得每个顶点给一个系数不够精细,那么可能就需要一张灰度纹理来存Blend数据了。我推荐这种方法,因为操作起来其实更方便。更新这样Blend纹理就像拿毛笔在上面写字那样。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 02:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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