void main(void) {
vec3 noisevec = vec3 (texture3D(Noise. MCposition * NoiseScale) *
Noisiness): vec3 location = MCposition + noisevec:
float dist = sqrttlocation.x * location.x + location.z * location.z): dist *= RingFreq:
float r = fracttdist + noisevec[0] + noisevec[l] + noisevec[2]) * 2.0:
if (r > 1.0) r = 2.0 - r:
vec3 color - mixtLightWood. DarkWood. r):
r - fractCCMCposition.x + MCposition.z) * GrainScale + 0.5):
noisevec[2] *= r:
if (r < GrainThreshold)
color += LightWood * LightGrains * noisevec[2]: else
color -= LightWood * DarkGrains * noisevec[2]:
color *= Lightlntensity: gl_FragColor = vec4 (color. 1.0):
}
Как видно из листинга, несколько параметров, заданных с помощью uniform-переменных, помогают манипулировать видом поверхности из приложения. Как и в большинстве процедурных шейдеров, здесь для наложения текстуры используются координаты объекта. В данном случае координаты объекта умножаются на NoiseScale (переменная типа vec3, с помощью которой можно масштабировать изображение отдельно в направлениях х,уи z), а результат становится индексом в заданной трехмерной текстуре шума. Значения шума, полученные из текстуры, масштабируются по значению Noisiness, что позволяет увеличить или уменьшить влияние шума на изображение.
12.7. Дерево Здесь дерево будет считаться последовательностью чередующихся темных и светлых концентрических колец. Чтобы поверхность выглядела более реалистично, нужно добавить к координатам объекта вектор шума. Первая (низкочастотная) октава добавляется к х-координате, третья октава добавляется к 2-коор-динате (а г/-координата вообще не используется). В результате получатся кольца, которые будут несколько отличаться по ширине и расстоянию от центра дерева.
Для вычисления текущих координат относительно центра дерева компоненты х и z возводятся в квадрат, а из полученных значений извлекается квадратный корень. Так вычисляется расстояние от центра дерева до текущего кольца. Затем оно умножается на RingFreq - коэффициент масштабирования, посредством которого можно задавать количество (большее или меньшее) колец на поверхности материала.