void main (void) {
vec4 noisevec = texture3D(Noise. MCposition * NoiseScale):
float intensity = abs(noisevec[0] - 0.25) + abs(noisevec[l] - 0.125) + abs(noisevec[2] - 0.0625) + abs(noisevec[3] - 0.03125):
intensity = clamp(intensity * 6.0. 0.0. 1.0):
vec3 color = mixCColorl. Color2. intensity) * Lightlntensity:
gl_FragColor = vec4 (color. 1.0):
}

Шум

12.5.2. Мрамор

Еще одна разновидность функции шума - часть периодической функции, например синуса. Добавив значение шума к аргументу функции синуса, получим функцию колебаний с шумом. Получается нечто вроде прожилок на некоторых видах мрамора. В листинге 12.6 приведен фрагментный шейдер для создания этого эффекта. Вершинный шейдер остается все тем же, а результаты работы шейдеров показаны на цветном рис. 20.

Листинг 12.6. Фрагментный шейдер для создания эффекта мрамора

varying float Lightlntensity: varying vec3 MCposition:
uniform sampler3D Noise; uniform vec3 MarbleColor; uniform vec3 VeinColor:
void main (void) {
vec4 noisevec = texture3D(Noise. MCposition):
float intensity = abs(noisevec[0] - 0.25) + abs(noisevec[l] - 0.125) + abs(noisevec[2] - 0.0625) + abs(noisevec[3] - 0.03125):
float sineval = sin(MCposition.y * 6.0 + intensity * 12.0) * 0.5 + 0.5: vec3 color = mix(VeinColor. MarbleColor, sineval) * Lightlntensity: gl_FragColor = vec4 (color. 1.0):
}

12.6. Гранит

С помощью шума легко имитировать практически любой материал. В данном примере сымитирован серый каменистый материал с небольшими черными вкраплениями. Чтобы создать относительно высокочастотную текстуру шума, используется только четвертый компонент (с наивысшей частотой). Он масштабируется с определенным коэффициентом, чтобы получить определенный уровень интенсивности, а затем это значение подставляется для всех остальных компонентов (красного, зеленого и синего). Результат приведен в листинге 12.7 - так создается поверхность, похожая на гранит (см. цветной рис. 20).

Листинг 12.7. Фрагментный шейдер гранитной поверхности

varying float Lightlntensity: varying vec3 MCposition:

⇐ Предыдущая| |Следующая ⇒