本节内容开始对之前构建的建筑贴上纹理。使用的规则是在上一节的基础上进行修改。作者也是在学习中,内容中如有不对的地方,欢迎大家指正。
1. 开始贴纹理之前,先在规则的最前面对要使用的纹理进行定义。
// textures
frontdoor_tex = "facade/shopdoor.tif"
wall_tex = "facade/brickwall2.tif"
dirt_tex = "facade/dirtmap.15.tif"
roof_tex = "roof/roof.tif"
由于要使用的窗户的纹理有9种不同的纹理,这些纹理存放在assets/façade文件夹中。在使用的时候,我们这里定义随机获取其中一个窗户纹理,这样窗户的纹理就是随机的了。
randomWindowTexture = fileRandom("*facades/textures/window.*.tif")
2. 为建筑物的正面和侧面定义纹理
Frontfacade -->
setupProjection(0, scope.xy 1.5, 1, 1)
setupProjection(2, scope.xy, scope.sx, scope.sy)
split(y){ groundfloor_height : Groundfloor | { ~floor_height: Floor }* }
Sidefacade -->
setupProjection(0, scope.xy, 1.5, 1, 1)
setupProjection(2, scope.xy, scope.sx, scope.sy)
split(y){ groundfloor_height: Floor | { ~floor_height: Floor }* }
添加红色部分的代码,setupProjection()定义面在scope的xy平面使用color和dirt图片(由通道0和通道2代表)。在使用color map时,纹理图片将以1.5m×1m进行重复贴模。而使用dirt map时,将会在scope的x、y方向平铺。
其中setupProjection()命令有以下几种:
setupProjection(uvSet, axesSelector, texWidth, texHeight)
setupProjection(uvSet, axesSelector, texWidth, texHeight, widthOrigin, heightOrigin)
setupProjection(uvSet, axesSelector, texWidth, texHeight, widthOrigin, heightOrigin, uwFactor)
(1)uvset代表的是不同的纹理图层:
uv-set |
Texture Layer |
0 |
colormap |
1 |
bumpmap |
2 |
dirtmap |
3 |
specularmap |
4 |
opacitymap |
5 |
normalmap |
(2)axesSelector定义哪个轴分别代表u和v轴,可选的参数有:
scope.xy, scope.xz, scope.yx, scope.yz, scope.zx, scope.zy 以scope的轴定义
world.xy, world.xz, world.yx, world.yz, world.zx, world.zy 以world的轴定义
(3)texWidth和texHeight分别代表纹理的宽度和长度。如果值小于0,则认为可以对纹理做镜像显示,~符号表示值大小可以浮动,‘符号表示相对值。
(4)widthOrigin和heightOrigin分别代表距离u方向和v方向的偏移
(5)uwFactor设置w轴值相对于u轴的系数,默认为0
3. 添加Roof规则
Roof -->
setupProjection(0, scope.xy, scope.sx, scope.sy)
texture(roof_tex)
projectUV(0)
其中projectUV()命令含义如下:
命令:projectUV(uvSet)
指定纹理应用于哪个uvset。
4. 为窗户和门指定纹理:
Window -->
s('1,'1,0.4)
t(0,0,-0.25)
texture(randomWindowTexture)
i(window_asset)
Door -->
s('1,'1,0.1)
t(0,0,-0.5)
texture(frontdoor_tex)
i("builtin:cube")
5. 定义Wall和SolidWall的纹理
Wall -->
color(wallColor)
texture(wall_tex)
set(material.dirtmap, dirt_tex)
projectUV(0) projectUV(2)
SolidWall -->
color(wallColor)
s('1,'1,0.4)
t(0,0,-0.4)
texture(wall_tex)
set(material.dirtmap, dirt_tex)
i("builtin:cube:notex")
projectUV(0) projectUV(2)
为Wall和SolidWall定义使用的纹理,使用set()命令定义在material.dirtmap属性,使用dirt_tex纹理。然后定义了将纹理贴在color和dirt通道。
set(attribute, bool value)
set(attribute, float value)
set(attribute, string value)
set命令将一个值指定给当前shape的一个属性。属性分为两类,一种是builtin属性,就是内置属性,例如material的属性。另一种是在规则文件中生命的属性。
最终结果如下图: