<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410510&amp;view=findpost&amp;p=3711477</guid>
        <pubDate>Thu, 16 Mar 2017 16:29:53 +0000</pubDate>
        <title>Работа с Frame Buffer object</title>
        <link>https://forum.sources.ru/index.php?showtopic=410510&amp;view=findpost&amp;p=3711477</link>
        <description><![CDATA[mnj: Не совсем, было 3072х3072, но при 2048х2048, <a class='tag-url' href='https://yadi.sk/i/OfNDqoyE3FzWP9' target='_blank'>картинка</a> не меняется. Разве что погрубее.]]></description>
        <author>mnj</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410510&amp;view=findpost&amp;p=3711464</guid>
        <pubDate>Thu, 16 Mar 2017 15:14:59 +0000</pubDate>
        <title>Работа с Frame Buffer object</title>
        <link>https://forum.sources.ru/index.php?showtopic=410510&amp;view=findpost&amp;p=3711464</link>
        <description><![CDATA[Славян: А точно TEX_WIDTH и TEX_HEIGHT это степени двойки, а то мало ли бывает?..]]></description>
        <author>Славян</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410510&amp;view=findpost&amp;p=3711423</guid>
        <pubDate>Thu, 16 Mar 2017 12:48:05 +0000</pubDate>
        <title>Работа с Frame Buffer object</title>
        <link>https://forum.sources.ru/index.php?showtopic=410510&amp;view=findpost&amp;p=3711423</link>
        <description><![CDATA[mnj: Товарищи, помогите разобраться, пожалуйста в проблеме: при построении карты строится мозаика 3х3 из 9 текстур с использованием FBO, видна в начальный момент центральная (размеры текстуры больше размера окна), при движении по карте переходим в какую-либо соседнюю (сверху, снизу, справа, слева, справа сверху, справа снизу и т.д.). Но почему-то цвета соседних текстур портятся, хотя отрисовка для всех одинаковая. Получается вот такая фигня <a class='tag-url' href='https://yadi.sk/d/32OJEVr23Fxw87' target='_blank'>https://yadi.sk/d/32OJEVr23Fxw87</a> (из-за размера положил туда). Сам процесс вот такой:<br>
При создании формы<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure InitFBO;</div><div class="code_line">var I: GLint;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;glEnable(GL_TEXTURE_2D);</div><div class="code_line">&nbsp;&nbsp;//создаем текстуру для рендера</div><div class="code_line">&nbsp;&nbsp;for I := 0 to 8 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;glGenTextures(1,@TexId[I]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;glBindTexture(GL_TEXTURE_2D, TexId[I]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);</div><div class="code_line">&nbsp;&nbsp; &nbsp;glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);</div><div class="code_line">&nbsp;&nbsp; &nbsp;glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);</div><div class="code_line">&nbsp;&nbsp; &nbsp;glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);</div><div class="code_line">&nbsp;&nbsp; &nbsp;glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA,</div><div class="code_line">&nbsp;&nbsp; &nbsp;GL_UNSIGNED_BYTE, nil);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;glGenFramebuffersEXT(1, @FBO); &nbsp; &nbsp; &nbsp;//создаем буфер кадра</div><div class="code_line">&nbsp;&nbsp;glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBO); &nbsp; //связываем</div><div class="code_line">&nbsp;&nbsp;for I := 0 to 8 do</div><div class="code_line">&nbsp;&nbsp;begin &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//указываем текстуру</div><div class="code_line">&nbsp;&nbsp; glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TexId[I], 0);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;CheckFBO;</div><div class="code_line">&nbsp;&nbsp;if glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) &#60;&#62; GL_FRAMEBUFFER_COMPLETE_EXT</div><div class="code_line">&nbsp;&nbsp;then &nbsp; &nbsp; &nbsp; //если проверка готовности буфера не проходит</div><div class="code_line">&nbsp;&nbsp;begin &nbsp; &nbsp; &nbsp;// завершение</div><div class="code_line">&nbsp;&nbsp; &nbsp;ShowMessage(&#39;FBO &nbsp;не готов!&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;PostQuitMessage(0);</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
затем загрузка данных карты и отрисовка в текстуру<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure DrawMap;</div><div class="code_line">//.....................</div><div class="code_line">&nbsp;&nbsp; &nbsp;//собственно рисование</div><div class="code_line">&nbsp;&nbsp;//натягиваем текстуру</div><div class="code_line">&nbsp;&nbsp; &nbsp; glEnable(GL_TEXTURE_2D);</div><div class="code_line">&nbsp;&nbsp; &nbsp; CurrentPoint.Lon:= -cX; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //точка ВС</div><div class="code_line">&nbsp;&nbsp; &nbsp; CurrentPoint.Lat:= -cY;</div><div class="code_line">&nbsp;&nbsp; &nbsp; for I := 0 to 8 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; glBindTexture(GL_TEXTURE_2D, TexId[I]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; MFrame:= Frames[I]; &nbsp; &nbsp; //квадрат для текстуры из массива</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if (IamThere(CurrentPoint,MFrame.Limits)) or &nbsp;//текущая точка в квадрате</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(IamThere(TGuard, MFrame.Limits)) or &nbsp; &nbsp; &nbsp; //верхний сторож (передний)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(IamThere(BGuard, MFrame.Limits)) or &nbsp; &nbsp; &nbsp; //нижний (задний)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(IamThere(LGuard, MFrame.Limits)) or &nbsp; &nbsp; &nbsp; //левый</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(IamThere(RGuard, MFrame.Limits)) or &nbsp; &nbsp; &nbsp; //правый</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(IamThere(TL, MFrame.Limits)) or &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //верхний левый</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(IamThere(TR, MFrame.Limits)) or &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //верхний правый</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(IamThere(BL, MFrame.Limits)) or &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //нижний левый</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(IamThere(BR, MFrame.Limits)) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//нижний правый</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; then //проверка на выход за переделы</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if MFrame.Rendered &#60;&#62; True then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RenderTexture(I); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//вот тут все и делается, насколько я понимаю</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MFrame.Show(MFrame.Limits);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; </div><div class="code_line">//...........................</div></ol></div></div></div></div><br>
метод Show указывает текстурные координаты<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TMyFrame.Show(Limits: TLimits);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;glBegin(GL_QUADS);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;glColor3ub(255,255,255);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;glTexCoord2f(0,0); glVertex2f(Limits.SW.Lon,Limits.SW.Lat);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;glTexCoord2f(0,1); glVertex2f(Limits.SW.Lon,Limits.NE.Lat);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;glTexCoord2f(1,1); glVertex2f(Limits.NE.Lon,Limits.NE.Lat);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;glTexCoord2f(1,0); glVertex2f(Limits.NE.Lon,Limits.SW.Lat);</div><div class="code_line">&nbsp;&nbsp; &nbsp;glEnd;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
 В RenderTexture(I), где I - номер текстуры происходит следующее:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure RenderTexture(Tex: GLint);</div><div class="code_line">//............Tex - номер текстуры.......................</div><div class="code_line">//рендерим в текстуру</div><div class="code_line">&nbsp;&nbsp; &nbsp;glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBO); &nbsp; //связываем буфер кадра и его Id</div><div class="code_line">&nbsp;&nbsp; &nbsp;glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TexId[Tex], 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;glPushAttrib(GL_VIEWPORT_BIT or GL_COLOR_BUFFER_BIT); &nbsp;//сохраняем атрибуты окна вывода и цвета</div><div class="code_line">&nbsp;&nbsp; &nbsp;glViewport(0, 0, TEX_WIDTH, TEX_HEIGHT); &nbsp;//область вывода для тестуры квадратная</div><div class="code_line">&nbsp;&nbsp; &nbsp;glClearColor(1, 221/255, 187/255,1); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//заливаем фоном - подложка для текстуры</div><div class="code_line">&nbsp;&nbsp; &nbsp;glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); &nbsp; //чистим буфер цвета и глубины</div><div class="code_line">&nbsp;&nbsp; &nbsp;glPushMatrix; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//сохр. матрицу трансформаций</div><div class="code_line">&nbsp;&nbsp; &nbsp;glLoadIdentity;</div><div class="code_line">&nbsp;&nbsp; &nbsp;glScalef(1/(2*Scale),1/(2*Scale),1); &nbsp; &nbsp; //масштабирование в соответствии с текущим масштабом</div><div class="code_line">&nbsp;&nbsp; &nbsp;Frame:= Frames[Tex]; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //берем заданный квадрат</div><div class="code_line">&nbsp;&nbsp; &nbsp;{рисование примитивов}</div><div class="code_line">&nbsp;&nbsp; &nbsp;//сдвигаем рисование в видимую область - это необходимо для генерации текстуры</div><div class="code_line">&nbsp;&nbsp; &nbsp;glTranslatef(-Frame.CentralPoint.Lon, -Frame.CentralPoint.Lat, 0);</div><div class="code_line">.........................проверка условий видимости объекта и вызов рисования объекта (если попадает в область видимости)</div><div class="code_line">&nbsp;&nbsp; &nbsp;DrawObject(MapObject);</div><div class="code_line">.........................</div><div class="code_line">//отрисовали и заканчиваем</div><div class="code_line">&nbsp;&nbsp; &nbsp;glPopMatrix; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //восстанавливаем матрицу</div><div class="code_line">&nbsp;&nbsp; &nbsp;glPopAttrib; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //и атрибуты</div><div class="code_line">&nbsp;&nbsp; &nbsp;glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); &nbsp; //отключаем буфер кадра</div><div class="code_line">&nbsp;&nbsp; &nbsp;Frame.Rendered:= True;</div></ol></div></div></div></div><br>
<br>
 вызов DrawObject:<br>
 <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;glEnable(GL_BLEND);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Color:= ColorToRGB(FilterObjects[I].Color);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;glColor4f(Color[0],Color[1],Color[2], FilterObjects[I].Transparency);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;glCallList(MapObject.Key); //списки готовятся при загрузке карты</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;glDisable(GL_BLEND);</div></ol></div></div></div></div><br>
<br>
Но пока не выходишь на соседнюю текстуру, рисует в правильных цветах, а так - получается то, что получается (ссылка на картинки выше). Как ПРАВИЛЬНО делать несколько текстур в FBO?]]></description>
        <author>mnj</author>
        <category>Программирование графики</category>
      </item>
	
      </channel>
      </rss>
	