游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7127|回复: 14

在地形编辑中,大家是如何做纹理刷的??

[复制链接]

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
发表于 2008-10-19 07:34:00 | 显示全部楼层 |阅读模式
如图,效果很差,边上颜色处理不好
sf_2008101973339.jpg

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-10-19 10:38:00 | 显示全部楼层

Re:在地形编辑中,大家是如何做纹理刷的??

高度刷,纹理刷原理都差不多。
http://www.cppblog.com/tonykee/archive/2008/05/14/49816.html

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2008-10-19 14:49:00 | 显示全部楼层

Re:在地形编辑中,大家是如何做纹理刷的??

你是用不同的色通道做么?高度图用一个圆的半径不同顶点值很容易实现,纹理我用一张图不同颜色实现,颜色的浓淡难算.

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-10-19 16:06:00 | 显示全部楼层

Re:在地形编辑中,大家是如何做纹理刷的??

每个tile两层argb混合纹理,共8个通道,1层用来做光照(用刷子刷假阴影很棒)
另外6个通道用来做alpha混合,还剩下一个通道保留不用,这6个通道对应6张细节纹理,地表的表现力已经能做的非常非常丰富了。

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2008-10-19 17:14:00 | 显示全部楼层

Re:在地形编辑中,大家是如何做纹理刷的??

tonykee老兄:

想问您两问题:
1.8个通道都写入一个图象文件中么?
2.中间浓边淡的的算法大概如何?
我的如下:
vPickPos 为中心点
  for( dv=vPickPos.x-12; dv < vPickPos.x+12; ++dv )
    {
      
        for( u=vPickPos.z-12; u <vPickPos.z+12; ++u )
        {
                        int index = dv * srcRect.Pitch / 4 + u; //颜色索引
               c=imageData[index] ;//颜色值

                float distance2 = (u -vPickPos.z-6) * (u -vPickPos.z-6) +
          (dv - vPickPos.x-6) * (dv - vPickPos.x-6);//距离
           float r2 = 6 * 6*2;//半径
             float fp = pow((1- distance2 / r2),(2)) * 2;//                         int sum=c.r+c.g+c.b;  //RGB三颜色的和
           int diff;
            float val=255;
           if (terrain_state_t.mapid==2)
             {
                    val=c.r+255*fp; //选择其中一纹理红色通道

                        if (val > 255)
                     val = 255;
                     if (val < 0)
                      val = 0;
                       c.r=val;
                       if (sum == 0)
                    c.r=255;
                             
                           diff = sum - (255 - val);//其余蓝绿两色通道
                     int val1=c.g;
                        val1 -= floor(0.5 + diff * (float(val1) / sum));
                        c.g=val1;
                     val1=c.b;
                         val1 -= floor(0.5 + diff * (float(val1) / sum));
                         c.b=val1;
                   imageData[index] =c;}
  }

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-10-19 18:15:00 | 显示全部楼层

Re:在地形编辑中,大家是如何做纹理刷的??

//单个点受影响幅度
bool UpOrDownPoint(const D3DXVECTOR3& picketPoint, float& x, float& y, float& z,
                                                        float radius ,float strengthPower, float strengthArc)
{
        float distance2 = (x - picketPoint.x) * (x - picketPoint.x) +
                (z - picketPoint.z) * (z - picketPoint.z);
        float r2 = radius * radius;

        float fp = pow((1- distance2 / r2),(1- strengthArc)) * strengthPower;


        //单次循环,凹凸变化的步长,可以根据需要进行修改
        if(distance2 < r2)
        {
                if(gDInput->KeyDown(DIK_LCONTROL) == STATUS_KEYDOWN)
                {
                        y += fp;
                        return true;
                }
       
                if(gDInput->KeyDown(DIK_LALT) == STATUS_KEYDOWN)
                {
                        y -= fp;
                        return true;
                }

                if(gDInput->KeyDown(DIK_LSHIFT) == STATUS_KEYDOWN)
                {
                        if(y > 0)
                        {
              if(y <= fp)
                                  y = 0;
                          else
                                  y -= fp;
                        }
                        else
                        {
              if(-y <= fp)
                                  y = 0;
                          else
                                  y += fp;
                        }
                        return true;
                }
        }
        return false;
}



void adjvalue(float delta, DWORD &up1, DWORD& down2, DWORD& down3,DWORD& down4, DWORD& down5, DWORD& down6)
{
        if((int)up1 + (int) delta < 255)
                up1 = up1 +(int) delta;

        if((int)down2 -(int) delta > 0)
        {
                down2 = down2-(int)delta;
                if(down2 < delta)
                        down2 = 0;
        }

        if((int)down3 - (int) delta > 0)
        {
                down3 = down3 - (int)delta;
                if(down3 < delta)
                        down3 = 0;
        }

        if((int)down4 - (int) delta > 0)
        {
                down4 = down4 - (int)delta;
                if(down4 < delta)
                        down4 = 0;
        }

        if((int)down5 - (int) delta > 0)
        {
                down5 = down5 - (int)delta;
                if(down5 < delta)
                        down5 = 0;
        }

        if((int)down6 - (int) delta > 0)
        {
                down6 = down6 - (int)delta;
                if(down6 < delta)
                        down6 = 0;
        }

}

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2008-10-19 20:18:00 | 显示全部楼层

Re:在地形编辑中,大家是如何做纹理刷的??

非常感谢!!!!!!!!!

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2008-10-20 08:12:00 | 显示全部楼层

Re:在地形编辑中,大家是如何做纹理刷的??

tonykee:
  您是如何取得颜色通道的值?

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-10-20 10:49:00 | 显示全部楼层

Re:在地形编辑中,大家是如何做纹理刷的??

//编辑地形的纹理
bool Terrain::EditTerrainTex(const D3DXVECTOR3& picketPoint, float radius ,float strengthPower, float strengthArc,int alpha_NO)
{
        if(!gDInput->MouseButtonDown(0))
        {
                return false;
        }

       
    //已编辑标志,防止block边界双倍编辑
        bool *bEditedflag = new bool[mTerrainParam.tilesize * mTerrainParam.tilesize];

        mlock.lock();
        for(list<TerrainTile *>::iterator it = m_VisitedTiles.begin(); it!= m_VisitedTiles.end(); it++)
        {
                TerrainTile * tile = *it;
                if(tile && tile->m_bLoaded )
                {
                        IDirect3DTexture9 * alphaA = tile->GetAlphaTexA();
                        IDirect3DTexture9 * alphaB = tile->GetAlphaTexB();

                        D3DLOCKED_RECT d3dlrA, d3dlrB;
                        alphaA->LockRect( 0, &d3dlrA, 0, 0 );
                        alphaB->LockRect( 0, &d3dlrB, 0, 0 );


                        blockset::iterator itor;
                        ZeroMemory(bEditedflag, mTerrainParam.tilesize * mTerrainParam.tilesize * sizeof(bool));

                        for(itor= tile->DisplayBlockSet.begin(); itor!= tile->DisplayBlockSet.end(); itor++)
                        {
                                // 1:rA 2:gA 3:bA 4:aA
                                // 5:rB 6:gB 7:bB 8:aB

                                LodBlock *p = (*itor);

                                BYTE* lpSrcA = (BYTE*)d3dlrA.pBits;
                                BYTE* lpSrcB = (BYTE*)d3dlrB.pBits;

                                for(int i = 0;  i < mTerrainParam.blocksize; i ++)
                                {
                                        for(int j = 0; j < mTerrainParam.blocksize; j++)
                                        {
                                                float tx = tile->GetTopX();
                                                float tz = tile->GetTopZ();
                                               
                                                int row = p->GetNz() * (mTerrainParam.blocksize - 1)  + i;
                                                int col = p->GetNx() * (mTerrainParam.blocksize - 1)  + j;

                                                float x = tx +  col * mTerrainParam.ftCell_len;
                                                float z = tz -  row * mTerrainParam.ftCell_len;

                                                float delta = 0.0f;
                                                if(!bEditedflag[row * mTerrainParam.tilesize + col] && UpOrDownPoint(picketPoint, x, delta, z, radius, strengthPower, strengthArc))
                                                {
                                                        DWORD pixel = 0;
                                                        memcpy(&pixel, lpSrcA + (row * d3dlrA.Pitch + 4*col), 4);

                                                        DWORD rA = (pixel & 0xFF000000) >> 24;
                                                        DWORD gA = (pixel & 0x00FF0000) >> 16;
                                                        DWORD bA = (pixel & 0x0000FF00) >> 8;
                                                        DWORD aA = (pixel & 0x000000FF) >> 0;

                                                        memcpy(&pixel, lpSrcB + (row * d3dlrB.Pitch + 4*col), 4);
                                                        DWORD rB = (pixel & 0xFF000000) >> 24;
                                                        DWORD gB = (pixel & 0x00FF0000) >> 16;
                                                        DWORD bB = (pixel & 0x0000FF00) >> 8;
                                                        DWORD aB = (pixel & 0x000000FF) >> 0;


                                                        if(alpha_NO == 1)
                                                                adjvalue(delta, rA, gA, bA, rB, gB, bB);
                                                        else if(alpha_NO == 2)
                                                                adjvalue(delta, gA, rA, bA, rB, gB, bB);
                                                        else if(alpha_NO == 3)
                                                                adjvalue(delta, bA, rA, gA, rB, gB, bB);
                                                        else if(alpha_NO == 5)
                                                                adjvalue(delta, rB, rA, gA, bA, gB, bB);
                                                        else if(alpha_NO == 6)
                                                                adjvalue(delta, gB, rA, gA, bA, rB, bB);
                                                        else if(alpha_NO == 7)
                                                                adjvalue(delta, bB, rA, gA, bA, rB, gB);


                                                        pixel = 0x00000000 + (rA << 24) + (gA << 16) + (bA << 8) + (aA << 0);
                                                        memcpy(lpSrcA + (row * d3dlrA.Pitch + 4*col), &pixel, 4);

                                                        pixel = 0x00000000 + (rB << 24) + (gB << 16) + (bB << 8) + (aB << 0);
                                                        memcpy(lpSrcB + (row * d3dlrB.Pitch + 4*col), &pixel, 4);
                                                        tile->m_bTexEdited = true;
                                                        RegistEditTile(tile);
                                                        bEditedflag[row * mTerrainParam.tilesize + col] = 1; //已经编辑过了,防止block边界双倍编辑
                                                }
                                               
                                        }
                                }
                               
                        }
                        alphaA->UnlockRect(0);
                        alphaB->UnlockRect(0);
                }       
        }
        mlock.unlock();
        DEL(bEditedflag);
        return true;

}

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
 楼主| 发表于 2008-10-20 11:38:00 | 显示全部楼层

Re:在地形编辑中,大家是如何做纹理刷的??

very goood  thanks! 好好看看
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 11:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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