На главную Наши проекты:
Журнал   ·   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
  
> Работа с Frame Buffer object , Неправильные цвета в запекаемых текстурах (Delphi)
    Товарищи, помогите разобраться, пожалуйста в проблеме: при построении карты строится мозаика 3х3 из 9 текстур с использованием FBO, видна в начальный момент центральная (размеры текстуры больше размера окна), при движении по карте переходим в какую-либо соседнюю (сверху, снизу, справа, слева, справа сверху, справа снизу и т.д.). Но почему-то цвета соседних текстур портятся, хотя отрисовка для всех одинаковая. Получается вот такая фигня https://yadi.sk/d/32OJEVr23Fxw87 (из-за размера положил туда). Сам процесс вот такой:
    При создании формы
    ExpandedWrap disabled
      procedure InitFBO;
      var I: GLint;
      begin
        glEnable(GL_TEXTURE_2D);
        //создаем текстуру для рендера
        for I := 0 to 8 do
        begin
          glGenTextures(1,@TexId[I]);
          glBindTexture(GL_TEXTURE_2D, TexId[I]);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
          glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA,
          GL_UNSIGNED_BYTE, nil);
        end;
        glGenFramebuffersEXT(1, @FBO);      //создаем буфер кадра
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBO);   //связываем
        for I := 0 to 8 do
        begin                //указываем текстуру
         glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TexId[I], 0);
        end;
        CheckFBO;
        if glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) <> GL_FRAMEBUFFER_COMPLETE_EXT
        then       //если проверка готовности буфера не проходит
        begin      // завершение
          ShowMessage('FBO  не готов!');
          PostQuitMessage(0);
        end
        else
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
      end;


    затем загрузка данных карты и отрисовка в текстуру

    ExpandedWrap disabled
      procedure DrawMap;
      //.....................
          //собственно рисование
        //натягиваем текстуру
           glEnable(GL_TEXTURE_2D);
           CurrentPoint.Lon:= -cX;             //точка ВС
           CurrentPoint.Lat:= -cY;
           for I := 0 to 8 do
           begin
               glBindTexture(GL_TEXTURE_2D, TexId[I]);
               MFrame:= Frames[I];     //квадрат для текстуры из массива
       
               if (IamThere(CurrentPoint,MFrame.Limits)) or  //текущая точка в квадрате
                  (IamThere(TGuard, MFrame.Limits)) or       //верхний сторож (передний)
                  (IamThere(BGuard, MFrame.Limits)) or       //нижний (задний)
                  (IamThere(LGuard, MFrame.Limits)) or       //левый
                  (IamThere(RGuard, MFrame.Limits)) or       //правый
                  (IamThere(TL, MFrame.Limits)) or           //верхний левый
                  (IamThere(TR, MFrame.Limits)) or           //верхний правый
                  (IamThere(BL, MFrame.Limits)) or           //нижний левый
                  (IamThere(BR, MFrame.Limits))              //нижний правый
                   then //проверка на выход за переделы
                   begin
                   if MFrame.Rendered <> True then
                     RenderTexture(I);                //вот тут все и делается, насколько я понимаю
                     MFrame.Show(MFrame.Limits);
                   end
               else
           end;
          
      //...........................

    метод Show указывает текстурные координаты
    ExpandedWrap disabled
      procedure TMyFrame.Show(Limits: TLimits);
      begin
          glBegin(GL_QUADS);
            glColor3ub(255,255,255);
            glTexCoord2f(0,0); glVertex2f(Limits.SW.Lon,Limits.SW.Lat);
            glTexCoord2f(0,1); glVertex2f(Limits.SW.Lon,Limits.NE.Lat);
            glTexCoord2f(1,1); glVertex2f(Limits.NE.Lon,Limits.NE.Lat);
            glTexCoord2f(1,0); glVertex2f(Limits.NE.Lon,Limits.SW.Lat);
          glEnd;
      end;

    В RenderTexture(I), где I - номер текстуры происходит следующее:

    ExpandedWrap disabled
      procedure RenderTexture(Tex: GLint);
      //............Tex - номер текстуры.......................
      //рендерим в текстуру
          glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBO);   //связываем буфер кадра и его Id
          glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TexId[Tex], 0);
          glPushAttrib(GL_VIEWPORT_BIT or GL_COLOR_BUFFER_BIT);  //сохраняем атрибуты окна вывода и цвета
          glViewport(0, 0, TEX_WIDTH, TEX_HEIGHT);  //область вывода для тестуры квадратная
          glClearColor(1, 221/255, 187/255,1);                    //заливаем фоном - подложка для текстуры
          glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);   //чистим буфер цвета и глубины
          glPushMatrix;                                          //сохр. матрицу трансформаций
          glLoadIdentity;
          glScalef(1/(2*Scale),1/(2*Scale),1);     //масштабирование в соответствии с текущим масштабом
          Frame:= Frames[Tex];                     //берем заданный квадрат
          {рисование примитивов}
          //сдвигаем рисование в видимую область - это необходимо для генерации текстуры
          glTranslatef(-Frame.CentralPoint.Lon, -Frame.CentralPoint.Lat, 0);
      .........................проверка условий видимости объекта и вызов рисования объекта (если попадает в область видимости)
          DrawObject(MapObject);
      .........................
      //отрисовали и заканчиваем
          glPopMatrix;                 //восстанавливаем матрицу
          glPopAttrib;                 //и атрибуты
          glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);   //отключаем буфер кадра
          Frame.Rendered:= True;


    вызов DrawObject:

    ExpandedWrap disabled
        glEnable(GL_BLEND);
                  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
                  Color:= ColorToRGB(FilterObjects[I].Color);
                  glColor4f(Color[0],Color[1],Color[2], FilterObjects[I].Transparency);
                  glCallList(MapObject.Key); //списки готовятся при загрузке карты
                  glDisable(GL_BLEND);


    Но пока не выходишь на соседнюю текстуру, рисует в правильных цветах, а так - получается то, что получается (ссылка на картинки выше). Как ПРАВИЛЬНО делать несколько текстур в FBO?
    Сообщение отредактировано: mnj -
      А точно TEX_WIDTH и TEX_HEIGHT это степени двойки, а то мало ли бывает?..
        Не совсем, было 3072х3072, но при 2048х2048, картинка не меняется. Разве что погрубее.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0313 ]   [ 16 queries used ]   [ Generated: 29.03.24, 10:17 GMT ]