После вычисления значений для текстуры шума их следует занести в текстурный модуль с помощью кода, приведенного в листинге 12.2. Текстурный модуль сначала выбирается, а потом связывается с ранее созданной ЗБ-текстурой. Для параметров края задан плавный переход во всех трех измерениях, и поэтому функция шума всегда будет возвращать правильные значения вне зависимости от переданного входного параметра. Однако следует заботиться о том, чтобы повторения фрагментов текстуры не были заметны. Следующие две строчки устанавливают для текстуры линейный режим фильтрования, так как по умолчанию текстура является и множественной, и линейной, а множественность здесь не нужна. (Использование множественной текстуры в некоторых случаях оправдано, но здесь масштабирование будет выполняться внутри шейдера шума, и простой текстуры будет достаточно.) После установки всех параметров текстуру можно загружать в текстурный модуль функцией glTexImage3D.

истин г 12.2. Функция для создания трехмерной текстуры шума

void init3DNoiseTexture()

{

glGenTexturesd. &noise3DTexName):

glActiveTexture(GL_TEXTURE6): glBindTexture(GL_TEXTURE_3D. noise3DTexNaine): glTexParameterf(GL_TEXTURE_3D. GL_TEXTURE_WRAP_S, GL_REPEAT): glTexParameterf(GL_TEXTURE_3D. GL_TEXTURE_WRAP_T. GL_REPEAT); g1TexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R. GL_REPEAT); glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR): gl TexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTFR, GL_LINEAR):

glTexImage3D(GL_TEXTURE_3D. 0. GL_RGBA, noise3DTexSize.

noise3DTexSize, noise3DTexSize. 0, GL_RGBA, GL_UNSIGNED_BYTE. noise3DTexPtr):

}

.3. Выбор метода создания шума

□ Эта функция не периодическая и не повторяющаяся, особенно для двухмерного и трехмерного шума (но это зависит от реализации).

□ Шейдеры, использующие встроенную функцию noi se, не зависят от приложения (как это было бы в случае использования текстурного метода). Преимущества метода текстурных карт таковы:

□ Так как функция шума вычисляется приложением, то разработчик приложения может самостоятельно контролировать ее и быть уверенным, что эта функция одинаково реализуется на любом графическом аппаратном обеспечении.

□ В каждой текстуре можно хранить до четырех значений шума (по одному для каждого канала текстуры R, G, В и А). Таким образом, можно вычислять четыре октавы шума и получать все четыре значения за одно обращение к текстуре.

□ Обращение к текстуре происходит быстрее, чем выполнение встроенной функции noise.

Возможность определять свои функции шума тоже необходима - используя их, можно получить совсем другое изображение, чем в результате использования встроенной функции noise. Зато определенная разработчиком функция шума потенциально может работать по-разному на разных графических ускорителях и платформах, в то время как встроенная функция шума работает везде одинаково (по крайней мере, пока все производители аппаратного обеспечения будут реализовывать ее одинаково). Встроенную функцию noi se можно оптимизировать для каждого графического ускорителя, возможно, даже сделав полную аппаратную реализацию, так что, скорее всего, встроенная функция noi se будет работать быстрее функции, определенной разработчиком шейдера.


⇐ вернуться назад | | далее ⇒