Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.195.206] |
|
Сообщ.
#1
,
|
|
|
Товарищи, помогите разобраться, пожалуйста в проблеме: при построении карты строится мозаика 3х3 из 9 текстур с использованием FBO, видна в начальный момент центральная (размеры текстуры больше размера окна), при движении по карте переходим в какую-либо соседнюю (сверху, снизу, справа, слева, справа сверху, справа снизу и т.д.). Но почему-то цвета соседних текстур портятся, хотя отрисовка для всех одинаковая. Получается вот такая фигня https://yadi.sk/d/32OJEVr23Fxw87 (из-за размера положил туда). Сам процесс вот такой:
При создании формы 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; затем загрузка данных карты и отрисовка в текстуру 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 указывает текстурные координаты 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 - номер текстуры происходит следующее: 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: 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? |
Сообщ.
#2
,
|
|
|
А точно TEX_WIDTH и TEX_HEIGHT это степени двойки, а то мало ли бывает?..
|