纹理空间映射

这些着色器负责选择、创建和重新映射纹理空间,计算基础向量和其他在可以应用颜色或置换之前必须执行的任务。其中某些函数具有 select 参数,它具有下列值之一:

0..63 选择一个纹理向量。如果超出了定义的纹理空间数,默认设置为 -1(空间中的点)。
−1 直接选择空间中的 3D 点,并且可能应用空间点变换。
−2 选择法线向量,并且可能应用空间向量变换。
−3 选择运动向量,并且可能应用空间向量变换。
−4 选择光线方向,并且可能应用空间向量变换。
−5..−9 选择曲面导数向量,并且可能应用空间向量变换。这些值包括P⁄∂U、∂P⁄∂V、∂²P⁄∂U²、∂²P⁄∂V² 和 ∂²P⁄(∂UV)。必须将对象定义为包含导数。
−10 选择 2D 背景图版,屏幕左下角的坐标为 (0, 0, 0),刚好位于屏幕右上角之外的坐标为 (1, 1, 0)。 selspace 在该模式下不起作用。变换类似于 mib_lookup_background 中的变换。
−11 在 state 中选择纹理坐标,它通常由材质着色器在对类型纹理的参数求值时放置,以供纹理着色器使用。

空间变换允许变换向对象坐标、世界坐标或摄影机坐标投影所基于的向量。 selspace 可能具有以下值:

0不应用变换,使用内部空间。
1将向量转化为对象空间。
2将向量转化为世界空间。
3将向量转化为摄影机空间。
4[0,0... 1,1) 间隔返回当前屏幕空间坐标。

通过设定 project 参数可以将附加投影应用于生成的向量:

0禁用投影。
1选择 UV 投影(如果可用)。
2选择正交 XY 投影。
3选择正交 XZ 投影。
4选择正交 YZ 投影。
5选择球形投影。
6选择圆柱形投影。U=0 位于 +X,V=0 位于 +Y。Y 也是圆柱体轴。
7选择棒棒糖形投影,它将纹理的中心(纹理向量规格化之后)置于 X=0.5 Z=1 处,将角点置于参数角点处。在球体上,纹理中心位于北极,纹理角点位于南极,就像一个棒棒糖包裹器。

纹理顶点生成器

返回源于空间三维点(XY、XZ、YZ)的正交投影以及非正交投影(球形或圆柱形)的纹理向量;或返回纹理向量列表中带编号的纹理向量。该着色器也可以基于对象空间、摄影机空间、世界空间或屏幕空间进行计算。

mib_texture_vector
vector "mib_texture_vector" (
    integer         "select",
    integer         "selspace",
    integer         "vertex",
    integer         "project")
select
指定要查找的值,如上所述。
selspace
允许选择投影的源空间,如上所述。空间转化在由 select 参数指定的投影之前完成。如果 selspace 是 4(屏幕空间),将忽略 select、vertex 和 project。
vertex
指定顶点的位置:0 是相交点,1、2 和 3 是相交三角形的顶点。如果 select 是 -10,则该参数不起作用。
project
指定投影,该投影在选择和空间转化之后执行。如果 select 是 -10,则该参数不起作用。

纹理顶点重新映射

接受纹理顶点和比例,并且旋转、平移、裁剪和连接纹理。运算顺序是先变换,然后重复、交替、螺绕,最后是最小化/最大化裁剪。将返回结果(并存储在 state→tex 中,其他着色器可以从中拾取该结果)。

mib_texture_remap
vector "mib_texture_remap" (
    vector          "input",
    transform       "transform",
    vector          "repeat",
    boolean         "alt_x",
    boolean         "alt_y",
    boolean         "alt_z",
    boolean         "torus_x",
    boolean         "torus_y",
    boolean         "torus_z",
    vector          "min",
    vector          "max",
    vector	        "offset")
input
来自生成器(例如返回纹理向量的 mib_texture_vector)的纹理向量。当使用 mi_call_shader_x 中的非零 arg 参数调用此着色器时,input将被覆盖。这有助于在所有纹理坐标的重新映射参数都相同时重新映射多个纹理坐标。
transform
在应用其余参数之前应用到纹理向量的常规变换。如果 transform[3][3] 是 0.0,将忽略矩阵(通常 transform[3][3] 为 1.0)。
repeat
在 X、Y 和 Z 中包含重复因子,纹理向量将与之相乘。例如,值为 2 会收缩纹理,使其适合 [0, 1) 间隔的两倍。重复在此间隔外不起作用。与重复因子相乘后,将移除整数部分。此算法允许在由 transform 参数确定的间隔内有限重复。重复值 0 会关闭相应分量的重复,好像值是 1 一样。
alt_*
指定重复的每个其他副本是否反转,以便来回交替遍历纹理的后续副本。交替标志仅在相应的重复分量大于 1 时才起作用,也只能在 [0, 1) 间隔有效。
torus_*
将纹理空间映射到范围 [0, 1),以便小于 0 和等于或大于 1 的值将通过截断整数部分而位于该范围内。
min
max
通过指定要考虑的纹理范围,实现图像或体积裁剪。超出该范围的纹理部分会被修剪掉。如果使用重复,一个副本的 max 点将接合下一个副本的 min 点(除非启用交替)。包括 min 值,不包括 max 值。如果 min 分量等于对应的 max 分量,两者都被忽略。
offset
在纹理查找之前与纹理向量相加的向量。

曲面方向的旋转

使用角度围绕曲面法线旋转曲面方向。返回正交向量对;该向量对与其正交的法线一起定义旋转方向。这对各向异性反射尤为适用(请参见下文)。

mib_texture_rotate
struct {
    vector          "u",
    vector          "v"
} "mib_texture_rotate" (
    vector          "input",
    scalar          "angle",
    scalar          "min",
    scalar          "max")
u
v
返回的正交向量。
input
要旋转的纹理向量。应位于内部空间。
angle
解释为旋转的标量。等于 min 的值指定不旋转,等于 max 的值指定 360 度旋转。例如,该角度可以是来自纹理查找的强度。
min
max
指定不旋转和完全旋转对应的值限制。α 角度值首先映射到 α∗(max−min)+min。如果 min 和 max 都为 0,则默认设置为 0 和 0.25,对应于 0 度和 90 度逆时针旋转。

凹凸基础生成器

给定相交点,基于投影方法(如上所述:UV、XY、XZ、YZ、球形或圆柱形)计算一对凹凸基础向量。

mib_bump_basis
struct {
    vector          "u",
    vector          "v"
} "mib_bump_basis" (
    integer         "project",
    integer         "ntex")
project
指定要执行的投影,如上所述。在转化为对象空间后,所有投影都基于空间中的 3D 点。此参数用于确定凹凸基础方向。
ntex
要使用的纹理空间,范围为 0... 63。只有投影为 UV (5) 或禁用(0 或负数)时才可使用。否则,ntex 将被忽略。

凹凸贴图

将纹理应用于法线向量,方法是对多点的纹理求值以计算出 U 和 V 渐变,以便与基础向量相乘,与原始法线组合,规格化,然后被写回。也返回法线。state→tex 保留为未定义。

mib_bump_map
vector "mib_bump_map" (
    vector          "u",
    vector          "v",
    vector          "coord",
    vector          "step",
    scalar          "factor",
    boolean         "torus_u",
    boolean         "torus_v",
    boolean         "alpha",
    color texture   "tex",
    boolean         "clamp")
u
v
凹凸基础向量。它们可以从另一个基础着色器(例如 mib_bump_basis)生成。
coord
应为其计算凹凸的纹理坐标。
step
coord 的偏移。着色器采样三次:(coord_x, coord_v)(coord_x + step_x, coord_v)(coord_x, coord_v + step_v) 位置。生成的 U 和 V 渐变分别乘以 u 和 v 基础向量,然后乘以 factor,最后与法线相加,之后重新规格化。如果 step 分量是 0,则默认设置为 0.01。
factor
控制效果的强度。如果为 0,则默认设置为 1。
torus_u
torus_v
指定 step 与 coord 相加时,结果(X、Y 和 Z)应折回间隔 [0... 1)
alpha
如果为 true,指定应使用 alpha 分量,而不是颜色纹理的强度。
tex
要查找三次的颜色纹理或着色器。(如果指定的着色器返回着色器,则仅通过“=”表示法使用着色器指定。)
clamp
如果为 true,则将凹凸贴图区域限制到 [0, 1] 纹理坐标范围。

以下着色器与上一个着色器相同(包括参数),但它返回颜色而不是向量。此颜色不会被修改。这允许在材质着色器列表中使用该着色器,只需将该着色器添加到实际材质着色器的前面。此配置中,该着色器会首先调用,并在材质着色器使用法线向量计算照明之前先修改 state 中法线向量。同时,它不会以任何方式影响计算的结果颜色。

mib_passthrough_bump_map
vector "mib_passthrough_bump_map" (
    vector          "u",
    vector          "v",
    vector          "coord",
    vector          "step",
    scalar          "factor",
    boolean         "torus_u",
    boolean         "torus_v",
    boolean         "alpha",
    color texture   "tex",
    boolean         "clamp")

有关参数的描述,请参见上文。


这是凹凸贴图着色器的另一种方法,其与前面的方法不同,该方法修改 state→normal,然后计算连接到 color 输入的任何着色图形。这样,扰动的法线将对连接的着色器或树可见。通常,照明着色器(如 Phong)应连接到 color 参数。

凹凸贴图将查看纹理中的 3 个纹理采样,并使用纹理空间 0。3 个返回值的差异指示法线的弯曲。法线将在 bump_vectors(如果存在)的方向弯曲,否则在导数的方向弯曲。在调用 color 的求值之前,修改的法线保存在 state 中。之后,附加到 color 的所有着色器将使用此修改的法线。结束时法线设定回其原始值。

mib_bump_map2
color "mib_bump_map2" (
	scalar          "factor",
	scalar          "scale",
	color texture   "tex",
	color           "color")
factor
确定凹凸的强度。
scale
确定使用第一个纹理坐标重复凹凸贴图的次数。
tex
指定要查找法线扰动的纹理。
color
照明着色器(例如 Phong)所附加到的颜色。

Copyright © 1986, 2015 NVIDIA ARC GmbH. All rights reserved.