Q96:PT(1):方格纹理(Checker)(2)——2D Checker

198 篇文章 12 订阅
195 篇文章 27 订阅

标题中的“PT”表示:Procedural Texture(过程纹理)。表示该章节属于“过程纹理”的内容。
当前章节在“过程纹理”内容中的位置:
过程纹理(0)——概述
过程纹理(1)——方格纹理(1)——3D方格纹理
过程纹理(1)——方格纹理(2)——2D方格纹理(1)——平面2D方格纹理

1,引入

前面,我们已经知道:
3D方格纹理具有通用性,一个纹理算法可以用到不同的图形上。但是3D方格纹理在曲面上表现得不太规则,或者说有点乱。
2D方格纹理则不存在这个“乱”的问题。我们先直接看看2D方格纹理的效果吧:
这里写图片描述 这里写图片描述 这里写图片描述

从这些图形来看,在平面上的表现,2D方格纹理和3D方格纹理效果差不多;在曲面上的表现,2D方格纹理则要比3D方格纹理的效果好得多。

但是,我们前面也有提到,2D方格纹理是不具有“通用性”的,一个算法只能用在一个图形上。如上Sphere、Plane、Solid Cylinder分别对应着不同的算法。

接下来,我们来看看Plane的2D方格纹理是怎么一个算法。

2,平面的2D方格纹理(Plane 2D Checker)

2.1 理论分析

在方格之间加上条纹,则得到的是如下图形:
这里写图片描述

抽取其中四个方格,示意图如下:
这里写图片描述

设单个方格的边长(含白色条纹)为s,白色条纹的宽度为w(则对于单个方格,上下左右的条纹都是w/2)。
从图形中,我们可以看到,图中包含三种颜色:两种方格颜色,一种条纹颜色。
为了准确地设置这三种颜色,我们分两步走:

1,先不考虑条纹,确定撞击点在哪一种颜色的方格内。

这个我们可以参考3D方格纹理的做法:三个坐标分别除以方格边长;然后,分别求取floor();然后,将三个结果相加;然后,将相加的结果对2取余。只不过,3D方格纹理中用的是三个坐标值,现在2D方格当然只用其中两个坐标值啦。用哪两个呢?默认的平面是和xoz平面平行的,所以我们用x、z两个坐标。即:
这里写图片描述

2,确定撞击点在方格的内部还是在条纹上。

设计这么一个方程:
这里写图片描述

接下来,我们看撞击点p所在的方格:
这里写图片描述

2.2 C++代码实现

定义对应的类PlaneChecker。该类和Checker3D相似,如下差异部分的代码截图:

这里写图片描述

这里写图片描述

2.3 测试代码

这里写图片描述
这里写图片描述

2.4 输出图形

这里写图片描述

将条纹宽度设为0时,输出图形如下:
这里写图片描述

2.5 其他说明

完整代码下载路径:http://download.csdn.net/detail/libing_zeng/9793905

Referrance:
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K PetersLtd, 2007.

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值