游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5078|回复: 7

由CS子弹坑痕迹想到的。

[复制链接]

6

主题

29

帖子

37

积分

注册会员

Rank: 2

积分
37
QQ
发表于 2006-3-15 13:23:00 | 显示全部楼层 |阅读模式
玩过CS的人都知道,子弹击中墙壁后会留下弹坑痕迹。我对此很感兴趣,一开始我觉得这个实现起来应该比较简单:将墙壁上相应的位置重新贴上子弹坑的贴图,采用Alpha混合绘制就可以了。可是后来我发现,其实并非那么简单。

    原因是:
     1 采用Alpha绘制子弹坑贴图时,必须用到深度测试(否则被挡住看不见的墙也会出现子弹坑),而深度测试会导致不精确的测试结果。画出来的贴图会与墙出现颜色‘抖动’。
2 由于墙壁通常是多个矩形拼接而成,在处理矩形相接的地方时,如果互相拼接的矩形不在同一个平面,那么子弹坑贴图就会在另一个矩形上翘起来。这个可以通过强绘制限制在每个矩形内部解决,但算法就复杂多了。

由此我想到了另外一种方案:
直接在纹理上‘画图’。也就是在绘制每个含有子弹坑的墙壁矩形时,先准备好一个‘干净’的墙壁纹理,然后在纹理相应的位置处绘制子弹坑的图案。这样能保证子弹纹理肯定被限制在墙壁纹理内部。由于是在纹理内部直接绘制图案,所以不会出现深度测试导致的问题。当然也不会出现子弹坑在非同一个平面上翘起来的现象。
这种方案还可以用在好多场合:比如汽车刹车痕迹,它是一个1 D贴图,在车轮滑过的路径上均匀的贴上一条这样的贴图就可以了。采用它,还可以动态的实现被雨雪、落叶、沙石……等覆盖的地表。

但是这种方案也是要代价的,那就是每次绘制一个多边形前,必须先复制一个原始的‘干净’的纹理。如果原始纹理比较小如64×64,问题还不算大,但是过大的纹理必然会导致性能的降低。另外,频繁的采用这种方式也会导致性能的下降。

我不知道CS中到底时如何实现子弹坑的效果的。如果有同仁了解的话,

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2006-3-15 13:54:00 | 显示全部楼层

Re:由CS子弹坑痕迹想到的。

是通过绘制一个带有弹痕贴图的多边形小块实现的。也就是把这块Mesh加入场景

38

主题

1581

帖子

1614

积分

金牌会员

Rank: 6Rank: 6

积分
1614
QQ
发表于 2006-3-15 15:02:00 | 显示全部楼层

Re: Re:由CS子弹坑痕迹想到的。

nocture: Re:由CS子弹坑痕迹想到的。

是通过绘制一个带有弹痕贴图的多边形小块实现的。也就是把这块Mesh加入场景

你说的这个和LZ第一个方法是一样的吧,使用一片MESH的透明贴图...

14

主题

283

帖子

293

积分

中级会员

Rank: 3Rank: 3

积分
293
QQ
发表于 2006-3-16 13:59:00 | 显示全部楼层

Re:由CS子弹坑痕迹想到的。

楼主的墙壁,地面难道整个是一张纹理?

14

主题

283

帖子

293

积分

中级会员

Rank: 3Rank: 3

积分
293
QQ
发表于 2006-3-16 14:08:00 | 显示全部楼层

Re:由CS子弹坑痕迹想到的。

楼主的墙壁,地面难道整个是一张纹理?
比如汽车刹车痕迹,它是一个1 D贴图,在车轮滑过的路径上均匀的贴上一条这样的贴图就可以了。
1D贴图能做出刹车痕迹?那这个痕迹未免太假了吧?
还有,怎么在路径上贴这个贴图啊?路径又是何物啊?路径是单独的几何体,那么不是又和楼主想的第一个方法一样了?

说的云里雾里的,呵呵.这个方法非常错误...,不说效率问题,这是根本无法实现的啊.
你怎么确定弹坑在纹理的位置?
一堵墙,也不是就整个一张纹理的,而是用同张文理重复的贴的,你总不至于让整个墙面都重复的出现弹坑吧?
地面也是一样.

6

主题

29

帖子

37

积分

注册会员

Rank: 2

积分
37
QQ
 楼主| 发表于 2006-3-17 13:45:00 | 显示全部楼层

Re:由CS子弹坑痕迹想到的。

感谢‘郑群’朋友的质问。

1 其实我说的1D贴图它是类似PHOTOSHOP中的刷子工具。下面我举个例子来解释一下吧:

  1D贴图 byte 1DMap[64]={.....}; 你可以将它想象成用毛笔画的一根直线。
  下面是一个四边形带(QUADS),我只画了3个四边形:
   b______c___________
     |         |          |          |    ------->  车轮刹车印方向
   a|_____|d_____|_____ | ......

     现在,假设第一个四边形的四个点分别是abcd,在绘制这四个点时,分别制定纹理坐标为:    a   glTexCoord1f(0);
          b   glTexCoord1f(1);
          c   glTexCoord1f(1);
          d   glTexCoord1f(0);

    大家可以自己动手编写一个代码试一试。看看我说的是不是真的。

2 ’路径‘其实就是另一种’车轮印‘而已。

3 至于一堵墙,不管有多少种纹理贴图,其实并不影响。你可能没有看懂我说的意思。
  不过,你提出的子弹坑在纹理中的位置如何确定,这的确是不好处理,而且如果墙壁纹理的尺寸被缩放了,那么画在其中的子弹坑也同样会被缩放。这个问题比较令我头痛。

6

主题

29

帖子

37

积分

注册会员

Rank: 2

积分
37
QQ
 楼主| 发表于 2006-3-17 13:49:00 | 显示全部楼层

Re:由CS子弹坑痕迹想到的。

过几天,我将上面的测试代码贴上来。希望能有更多的朋友指正啊。

14

主题

283

帖子

293

积分

中级会员

Rank: 3Rank: 3

积分
293
QQ
发表于 2006-3-17 23:30:00 | 显示全部楼层

Re:由CS子弹坑痕迹想到的。

一堵墙,是用一张上下左右都能连接的纹理重复贴的,这样一张小纹理就能贴出很大的墙面,而不会出现大颗粒,如果你整堵墙只用一张纹理,如果墙很大,那么你的纹理要么就非常大,要么就是墙面非常粗糙,马赛克一样。
所以一般的墙面,如果你在纹理上加个点,那么墙面上会出现N个点。

2 ’路径‘其实就是另一种’车轮印‘而已。那你说的在路径上贴纹理,就是在车轮印上贴纹理?那这个车轮印又是什么东西啊?

我都不知道怎么说你了~~~
还有落叶,雪什么的,更加不可能了~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 22:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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