Есть ли способы в GL произвести, какие либо операции над текстурой, к примеру, наложение на нее другой по маске, фильтрация, с сохранением изменений? К примеру: - загружаем текстуру - обрабатываем, налаживаем фильтр - сохраняем результат - вызываем текстуру для объекта В итоге текстура должна измениться. Мультитекстурирование и функции типа glTexEnvi обрабатывают текстуру во время отрисовки, а мне нужно, чтобы она была статической (уже измененной). Рендер в текстуру отпадает, т.к. размер текстуры больше рабочей области (окно маленькое). Также желательно не применять FOB и p-Bufer. Кончено, проще это сделать до загрузки, над Bitmap'ом, но может, есть варианты через GL?
AlexBond Сам GL такого функционала не предоставляет. Пользуй Devil. Он умеет накладывать фильтры, и сохранять текстуры.
Дело в том что меня простое мультитекстурирование устраивает, но теряется освещение... Вопрос тогда другой, можно ли мультитекстурирование производить перед освещением? Т.к. когда я делаю текстурирование по маски, то оно производится после освещения, и в результате затирает его... Первая текстура нормально налаживается с режимом glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_MODULATE ); маска же и вторая текстура использует режим glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB); подругому неработает или у меня не получилось... И еще можно ли к точке треугольника применить альфа цвет через glColor4f, тем самым сделать маску?
AlexBond Я всегда почему-то считал что освещение расчитывается после расчёта цвета пикселя. В шейдере можно сделать по всякому, до и после сложения текстур. Объясни подробнее, что нужно.
Нужно наложить Две текстуры на поверхность ландшафта по маске, притом освещение динамическое. Первая текстура налаживается к примеру с т.коорд (-200,-200,200,200) как и вторая, а вот маска имеет т.коорд (0,0,1,1). Нужно чтобы отображалось освещение после наложения текстур. Также если учесть тот факт что мы имеем плоскость (ландшафт) размером 100x100 и маска текстуры имеет размер 100x100, может стоит сделать наложение через glColor4f. Тогда имеем следующее: Код (Text): glActiveTextureARB(GL_TEXTURE0_ARB ); glEnable (GL_TEXTURE_2D ); glBindTexture (GL_TEXTURE_2D,tex1); glTexEnvi (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB ); glTexEnvi (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB ,GL_REPLACE ); glTexEnvi (GL_TEXTURE_ENV,GL_COMBINE_ALPHA_ARB,GL_MODULATE ); glActiveTextureARB(GL_TEXTURE1_ARB ); glEnable (GL_TEXTURE_2D ); glBindTexture (GL_TEXTURE_2D, tex2); glTexEnvi (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB ); glTexEnvi (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB ,GL_INTERPOLATE_ARB); glTexEnvi (GL_TEXTURE_ENV,GL_COMBINE_ALPHA_ARB,GL_REPLACE ); glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE0_RGB_ARB ,GL_PREVIOUS_ARB); glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND0_RGB_ARB ,GL_SRC_COLOR ); glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE1_RGB_ARB ,GL_TEXTURE ); glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND1_RGB_ARB ,GL_SRC_COLOR ); glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE1_ALPHA_ARB ,GL_TEXTURE ); glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND1_ALPHA_ARB,GL_SRC_ALPHA ); glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE2_RGB_ARB ,GL_PREVIOUS_ARB); glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND2_RGB_ARB ,GL_ONE_MINUS_SRC_ALPHA ); В этом случае эфект правильный, но освещение пропадает... может как-то освещение наложить в виде текстуры?
Немного изменил в итоге получилось Код (Text): C=Сt1*Cf*Af+Ct2(1-Af), A=Af Освещение работает лишь для первой текстуры, но не для второй (( Код (Text): glActiveTextureARB(GL_TEXTURE0_ARB ); glEnable (GL_TEXTURE_2D ); glBindTexture (GL_TEXTURE_2D, T1); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glActiveTextureARB(GL_TEXTURE1_ARB ); glEnable (GL_TEXTURE_2D ); glBindTexture (GL_TEXTURE_2D, T2); glTexEnvi (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB ); glTexEnvi (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB ,GL_INTERPOLATE_ARB); glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE ); glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR ); glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB); glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR ); glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB); glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA ); Мне же необходимо C=(Сt1*Af+Ct2(1-Af))*Cf, A=Af , как это сделать? Использовать еще один текстурный блок?
Как всегда сам нахожу ответы на свои вопросы =) , но если кому пригодится, вот решение этой задачи для формулы Код (Text): C=(Сt1*Af+Ct2(1-Af))*Cf Описание такое: Код (Text): glActiveTextureARB(GL_TEXTURE1_ARB ); glEnable (GL_TEXTURE_2D ); glBindTexture (GL_TEXTURE_2D, T1); glTexEnvi (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB ); glTexEnvi (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB ,GL_REPLACE ); glActiveTextureARB(GL_TEXTURE0_ARB ); glEnable (GL_TEXTURE_2D ); glBindTexture (GL_TEXTURE_2D, T2); glTexEnvi (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB ); glTexEnvi (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB ,GL_INTERPOLATE_ARB); glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE ); glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR ); glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE1); glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR ); glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB); glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA ); glActiveTextureARB(GL_TEXTURE1_ARB ); glEnable (GL_TEXTURE_2D ); glTexEnvi (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB ); glTexEnvi (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB ,GL_MODULATE ); glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB ); glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR ); glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PRIMARY_COLOR_ARB); glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR ); Тема закрыта!