Изменение текстуры средствами GL перед наложением.

Тема в разделе "WASM.OpenGL", создана пользователем AlexBond, 17 мар 2008.

  1. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Есть ли способы в GL произвести, какие либо операции над текстурой, к примеру, наложение на нее другой по маске, фильтрация, с сохранением изменений?

    К примеру:
    - загружаем текстуру
    - обрабатываем, налаживаем фильтр
    - сохраняем результат
    - вызываем текстуру для объекта

    В итоге текстура должна измениться. Мультитекстурирование и функции типа glTexEnvi обрабатывают текстуру во время отрисовки, а мне нужно, чтобы она была статической (уже измененной). Рендер в текстуру отпадает, т.к. размер текстуры больше рабочей области (окно маленькое). Также желательно не применять FOB и p-Bufer.

    Кончено, проще это сделать до загрузки, над Bitmap'ом, но может, есть варианты через GL?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    AlexBond
    Сам GL такого функционала не предоставляет. Пользуй Devil. Он умеет накладывать фильтры, и сохранять текстуры.
     
  3. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Дело в том что меня простое мультитекстурирование устраивает, но теряется освещение...

    Вопрос тогда другой, можно ли мультитекстурирование производить перед освещением? Т.к. когда я делаю текстурирование по маски, то оно производится после освещения, и в результате затирает его...

    Первая текстура нормально налаживается с режимом glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_MODULATE );
    маска же и вторая текстура использует режим glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB); подругому неработает или у меня не получилось...

    И еще можно ли к точке треугольника применить альфа цвет через glColor4f, тем самым сделать маску?
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    AlexBond
    Я всегда почему-то считал что освещение расчитывается после расчёта цвета пикселя.
    В шейдере можно сделать по всякому, до и после сложения текстур.
    Объясни подробнее, что нужно.
     
  5. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Нужно наложить Две текстуры на поверхность ландшафта по маске, притом освещение динамическое. Первая текстура налаживается к примеру с т.коорд (-200,-200,200,200) как и вторая, а вот маска имеет т.коорд (0,0,1,1). Нужно чтобы отображалось освещение после наложения текстур.

    Также если учесть тот факт что мы имеем плоскость (ландшафт) размером 100x100 и маска текстуры имеет размер 100x100, может стоит сделать наложение через glColor4f.
    Тогда имеем следующее:
    Код (Text):
    1.    glActiveTextureARB(GL_TEXTURE0_ARB    );
    2.    glEnable          (GL_TEXTURE_2D      );
    3.    glBindTexture     (GL_TEXTURE_2D,tex1);
    4.    glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB    );
    5.    glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB  ,GL_REPLACE        );
    6.    glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_ALPHA_ARB,GL_MODULATE       );
    7.  
    8.    glActiveTextureARB(GL_TEXTURE1_ARB    );
    9.    glEnable          (GL_TEXTURE_2D      );
    10.    glBindTexture     (GL_TEXTURE_2D, tex2);
    11.    glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB    );
    12.    glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB  ,GL_INTERPOLATE_ARB);
    13.    glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_ALPHA_ARB,GL_REPLACE        );
    14.  
    15.    glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE0_RGB_ARB   ,GL_PREVIOUS_ARB);
    16.    glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND0_RGB_ARB  ,GL_SRC_COLOR   );
    17.    glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE1_RGB_ARB   ,GL_TEXTURE     );
    18.    glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND1_RGB_ARB  ,GL_SRC_COLOR   );
    19.    glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE1_ALPHA_ARB ,GL_TEXTURE     );
    20.    glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND1_ALPHA_ARB,GL_SRC_ALPHA   );
    21.    glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE2_RGB_ARB   ,GL_PREVIOUS_ARB);
    22.    glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND2_RGB_ARB  ,GL_ONE_MINUS_SRC_ALPHA   );
    В этом случае эфект правильный, но освещение пропадает... может как-то освещение наложить в виде текстуры?
     
  6. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Немного изменил в итоге получилось
    Код (Text):
    1. C=Сt1*Cf*Af+Ct2(1-Af), A=Af
    Освещение работает лишь для первой текстуры, но не для второй ((

    Код (Text):
    1.   glActiveTextureARB(GL_TEXTURE0_ARB    );
    2.    glEnable          (GL_TEXTURE_2D      );
    3.    glBindTexture     (GL_TEXTURE_2D, T1);
    4.    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    5.  
    6.    glActiveTextureARB(GL_TEXTURE1_ARB    );
    7.    glEnable          (GL_TEXTURE_2D      );
    8.    glBindTexture     (GL_TEXTURE_2D, T2);
    9.    glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB    );
    10.    glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB  ,GL_INTERPOLATE_ARB);
    11.  
    12.     glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,  GL_TEXTURE      );
    13.     glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR    );
    14.  
    15.     glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,  GL_PREVIOUS_ARB);
    16.     glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );
    17.  
    18.     glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB,  GL_PRIMARY_COLOR_ARB);
    19.     glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA    );
    Мне же необходимо C=(Сt1*Af+Ct2(1-Af))*Cf, A=Af , как это сделать? Использовать еще один текстурный блок?
     
  7. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Как всегда сам нахожу ответы на свои вопросы =) , но если кому пригодится, вот решение этой задачи для формулы
    Код (Text):
    1. C=(Сt1*Af+Ct2(1-Af))*Cf
    Описание такое:
    Код (Text):
    1.  glActiveTextureARB(GL_TEXTURE1_ARB    );
    2.    glEnable          (GL_TEXTURE_2D      );
    3.    glBindTexture     (GL_TEXTURE_2D, T1);
    4.    glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB    );
    5.    glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB  ,GL_REPLACE        );
    6.  
    7.    glActiveTextureARB(GL_TEXTURE0_ARB    );
    8.    glEnable          (GL_TEXTURE_2D      );
    9.    glBindTexture     (GL_TEXTURE_2D, T2);
    10.    glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB    );
    11.    glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB  ,GL_INTERPOLATE_ARB);
    12.  
    13.     glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,  GL_TEXTURE      );
    14.     glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR    );
    15.  
    16.     glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,  GL_TEXTURE1);
    17.     glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );
    18.  
    19.     glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB,  GL_PRIMARY_COLOR_ARB);
    20.     glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA    );
    21.  
    22.    glActiveTextureARB(GL_TEXTURE1_ARB    );
    23.    glEnable          (GL_TEXTURE_2D      );
    24.  
    25.    glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB    );
    26.    glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB  ,GL_MODULATE        );
    27.  
    28.     glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,  GL_PREVIOUS_ARB      );
    29.     glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR    );
    30.  
    31.     glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,   GL_PRIMARY_COLOR_ARB);
    32.     glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );
    Тема закрыта!