(1.0 - smoothstep(vec2(0.0). fuzz, checkPos)):
color = mix(Colorl, Color2. p.x * p.у + (1.0 - p.x) * (1.0 - p.y)):
// Постепенное изменение цвета к среднему при приближении к краю color = mix(color. AvgColor, smoothstep(0.125. 0.5, FuzzMax));
}
el se {
// В противном случае используется только средний цвет color = AvgColor:
}
gl_F ragColor = vec4(color, 1.0):
}
14.6. Итоги
Больше свободы - больше ответственности. Язык шейдеров OpenGL позволяет вычислять любые процедурные текстуры. Можно легко написать шейдер, который будет рисовать изображение с уродливыми неровностями и дефектами изображения (обычно в нем используются только условные выражения и функция step), но избавиться от этих проблем будет куда труднее. После общего описания нескольких проблем в этой главе были рассмотрены методы сглаживания процедурных текстур. Некоторые возможности языка помогают выполнять сглаживание, например встроенные функции для гладкой интерполяции (smoothstep), для производных (dFdx, dFdy) и для вычисления ширины фильтра (fwidth). Эти функции широко используются в шейдерах, выполняющих сглаживание с помощью фильтрации, адаптивной фильтрации, интегрирования и отбрасывания частот.
4.7. Ссылки
В большинстве книг по обработке сигналов и изображений обсуждаются принципы семплинга, преобразований и дефектов изображения. Книги [10, 12 и 16] могут служить дополнительными справочниками по этой теме. Технические записи Альви Рэя Смита[13-15] описывают проблему дефектов изображения непосредственно для компьютерной графики.
Книга [2] содержит главу, описывающую сглаживание в шейдерах в понятиях языка шейдеров RenderMan, но большинство методов могут применяться и в языке шейдеров OpenGL. Дарвин Пичи тоже пишет о методах сглаживания в книге [7].
Берт Фрейденберг разработал шейдер на языке шейдеров OpenGL для выполнения адаптивного сглаживания и представил эту работу на выставке SIGGRAPH-2002 в Сан-Антонио, штат Техас. В этой главе я просто воспроизвел его примеры, но Берт заслуживает особой похвалы за иллюстрации к некоторым темам этой книги.
1. 3Dlabs. Веб-сайт для разработчиков (http://www.3dlabs.com/support/devetoper).
2. Apodaca A. A., Gritz L. Advanced RenderMan: Creating CGI for Motion Pictures. San Francisco: Morgan Kaufmann Publishers, 1999 (http://www.bmrt.org/arman/ materials, html).
3. Cook R. L. Stochastic Sampling in Computer Graphics//ACM Transactions on Graphics. 1986. Vol. 5, № 1. P. 51-72.
4. Crow F. C. The Aliasing Problem in Computer-Generated Shaded Images//Comm. of the ACM. 1977. № 20 (11). P. 799-805.
5. Crow F. C. Summed-Area Tables for Texture Mapping//Computer Graphics (Proc. SIGGRAPH-84). 1984. July. P. 207-212.
6. Dippft M. A. Z., Wold E. H. Antialiasing Through Stochastic Sampling//Computer Graphics (Proc. SIGGRAPH-85). 1985. July. P. 69-78.
7. Texturing and Modeling: A Procedural Approach. 3rd ed.//D. S. Ebert, J. Hart, B. Mark, at al. San Francisco: Morgan Kaufmann Publishers, 2002 (http:// www.texturingandmodeling.com).