На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Прозрачность без альфа-канала , OpenGL
    Как использовать две текстуры для достижения прозрачности (полупрозрачности).
    В старых играх часто в папках лежали два файла картинка и черно-белая маска.

    Как использовать такую технику рисования, где вторая картинка по сути альфа-канал?

    Есть рисунок 1
    Прикреплённая картинка
    Прикреплённая картинка

    Есть рисунок 2 (маска)
    Прикреплённая картинка
    Прикреплённая картинка

    ExpandedWrap disabled
          glEnable(GL_TEXTURE_2D);
          glEnable(GL_BLEND);
          glDisable(GL_DEPTH_TEST);
       
          glBlendFunc(GL_SRC_COLOR, GL_ZERO);
          glBindTexture(GL_TEXTURE_2D, e::texture[1]);
          FormPaintTextures(0, 0);
          glBlendFunc(GL_ONE, GL_DST_COLOR);
          glBindTexture(GL_TEXTURE_2D, e::texture[0]);
          FormPaintTextures(0, 0);

    Получился результат
    Прикреплённая картинка
    Прикреплённая картинка
      А как сделать вот так ?
      Прикреплённая картинка
      Прикреплённая картинка
        Не знаю, как это делается в OpenGL (всегда использовал Direct3D).
        Для Direct3D, если нужно, могу написать соответствующий шейдер. Только это в любом случае не оптимально, лучше на этапе загрузки сразу поместить данные первого изображения в RGB, а второго в A каналы одной текстуры.
          Цитата
          лучше на этапе загрузки сразу поместить данные первого изображения в RGB, а второго в A каналы одной текстуры


          Да, кстати, это отличная идея!, а как это делается ? Есть ли у Вас примерчик как это делается в Direct3D ?
          Под OpenGL я перепишу.

          PS Пишу игрушку платформер-головоломку )
            Цитата F0X @
            Есть ли у Вас примерчик как это делается в Direct3D ?


            Сделал небольшой примерчик на FFP:
            https://disk.yandex.ru/d/V7C-p_RMgNdi3A
            Сообщение отредактировано: Mikle -
              Спасибо, буду разбираться )
                ExpandedWrap disabled
                  void FormLoadTexturesGL()
                  {
                      int i, j;
                      FILE *file1;
                      FILE *file2;
                      BOOL flag;
                      file1 = NULL;
                      file2 = NULL;
                      flag = FALSE;
                      char str[][256] =
                      {
                          "Pic 001.bmp", "Pic 002.bmp"
                      };
                      glGenTextures(1, &e::texture[0]);
                      file1 = fopen(str[0], "r");
                      file2 = fopen(str[1], "r");
                      if ((file1) && (file2))
                      {
                          flag = TRUE;
                          fread(e::data1, 54, 1, file1);
                          fread(e::data1, 512 * 512 * 3, 1, file1);
                          fread(e::data2, 54, 1, file2);
                          fread(e::data2, 512 * 512 * 3, 1, file2);
                          for (j=0; j<512; j++)
                          {      
                              for (i=0; i<512; i++)
                              {
                                  e::data3[i][j][0] = e::data1[i][j][0];
                                  e::data3[i][j][1] = e::data1[i][j][1];
                                  e::data3[i][j][2] = e::data1[i][j][2];
                                  e::data3[i][j][3] = e::data2[i][j][1];
                              }
                          }
                          glBindTexture(GL_TEXTURE_2D, e::texture[0]);
                          glTexImage2D(GL_TEXTURE_2D, 0, 4, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, e::data3);
                          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
                          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
                          glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
                          fclose(file1);
                          fclose(file2);
                      }
                      if (!flag)
                      {
                          MessageBox(NULL, "Error : Textures load impossible", e::appname, MB_OK | MB_ICONERROR);
                          exit(0);
                      }
                  }


                Все работает
                  Цитата F0X @
                  Все работает

                  Поздравляю! :)
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0379 ]   [ 20 queries used ]   [ Generated: 29.03.24, 11:43 GMT ]