Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
snake32
1842 / 1154 / 203
Регистрация: 26.02.2009
Сообщений: 4,316
Записей в блоге: 5
1

Фоновая подгрузка данных

13.02.2013, 13:00. Просмотров 708. Ответов 4
Метки нет (Все метки)

Привет.

Написал код, отладил. Вроде работал. Потом чёрт дёрнул - захотелось реализовать фоновую подгрузку текстур.
Пол дня сидел синхронизировал - вроде удалось. Но вот завыпендривался сам OpenGL. А точнее его приславутые списки отображений. Дело в том что на однопоточной архитектуре они работали так как я и хотел. Но когда я запулил загрузку и иницализацию листа в отдельный поток рендер перестал отображать.
Избавился от списка - заработало. Но не всё. Мультитекстурирование тоже перестало работать. Накладыватся только последняя текстура. Хотя пошагово прогонял всё вроде верно и ID-шники текстур правильные.

Ничё не понимаю. Есть идеи?

Код отрисовки:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
procedure TLayersTileGL.Render;
  var i,lic:integer;
begin
    lic := FLayersTex.Count-1;
    for i:=0 to lic do
    begin
      glActiveTexture( GL_TEXTURE0_ARB+i );
      glEnable( GL_TEXTURE_2D );
      FLayersTex[i].tex.Bind;
      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
      if i<>0 then
      begin
        glTexEnvi ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
 
        // Func RGB: Arg0*Arg2+Arg1*(1-Arg2)
        glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE );
        // Arg0 RGB
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR );
        // Arg1 RGB
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR );
        // Arg2 RGB
        glTexEnvi ( GL_TEXTURE_ENV, GL_SOURCE2_RGB,  GL_TEXTURE );
        glTexEnvi ( GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA );
 
        // Func ALPHA: Arg0+Arg1
        glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD );
        // Arg0 ALPHA
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA );
        // Arg1 ALPHA
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA );
      end else
        glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
    end;
 
    glBegin( GL_QUADS );
      glColor4f( 1, 1, 1, 1 );
      for i:=0 to lic do glMultiTexCoord2f( GL_TEXTURE0_ARB+i, 0, 0 );
      glVertex2f( Bound.min.x, Bound.min.y );
      for i:=0 to lic do glMultiTexCoord2f( GL_TEXTURE0_ARB+i, 1, 0 );
      glVertex2f( Bound.max.x, Bound.min.y );
      for i:=0 to lic do glMultiTexCoord2f( GL_TEXTURE0_ARB+i, 1, 1 );
      glVertex2f( Bound.max.x, Bound.max.y );
      for i:=0 to lic do glMultiTexCoord2f( GL_TEXTURE0_ARB+i, 0, 1 );
      glVertex2f( Bound.min.x, Bound.max.y );
    glEnd();
 
    for i:=lic downto 0 do
    begin
      glActiveTexture( GL_TEXTURE0+i );
      glDisable( GL_TEXTURE_2D );
    end;
end;
Может я не правильно создаю контекст? Вроде ни одна ф-ия не матерится

Добавлено через 1 час 13 минут
Обязательно ли создавать фэйковое окно для второго контекста?

Добавлено через 14 часов 7 минут
Проблему пока не решил.

Нашёл некоторые тонкости wglShareLists
http://www.gamedev.ru/code/tip/wglShareList

Добавлено через 39 минут
У меня есть подозрения на расширения которые я загружаю через GetProcAddress. Они должны быть загружены для каждого GL-контекста? Или... что то я совсем запутался...
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2013, 13:00
Ответы с готовыми решениями:

Фоновая подгрузка в кэш
Приветствую уважаемые! Есть ли как-нить статьи или примеры по теме? Хочется посмотреть как люди...

Фоновая загрузка данных
Добрый день. Пишу небольшое оконное приложение. И так получается, что для работы приложению...

Подгрузка данных из базы mysql с последующей генерацией html и подстановкой извлеченных данных
на сайте есть форма подачи заявки. после подачи , на главной странице должно отображаться фото и...

Подгрузка данных из бд
Добрый день. Мне нужно, чтобы при нажатии на кнопку подгружалось еще 10 строк в таблицу Бьюсь...

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

4
vxg
Модератор
3292 / 2086 / 330
Регистрация: 13.01.2012
Сообщений: 8,118
13.02.2013, 14:57 2
Цитата Сообщение от snake32 Посмотреть сообщение
должны быть загружены для каждого GL-контекста
смысл? это точки входа в библиотеку. если к библиотеке подключаются несколько потоков/процессов точки входа не изменятся. могут потребовать инициализации какие-нибудь данные библиотеки... это я пальцем в небо.
1
snake32
1842 / 1154 / 203
Регистрация: 26.02.2009
Сообщений: 4,316
Записей в блоге: 5
13.02.2013, 15:29  [ТС] 3
Вроде бы да...просто у меня сложилось впечатление что примитивные ф-ий вроде работают (в частности обычное текстурирование), но мультитекстурирование которое добавлено было значительно позже базовой версии OpenGL наотрез отказывается контачить. Порывшись в интернете обнаружил следующий код:
http://virtual-treeview.googlecode.c.../OpenGL_SG.pas
там есть следующие строки
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{$ifdef FPC}
  var
{$else}
  {$ifdef MULTITHREADOPENGL}
    threadvar
  {$else}
    var
  {$endif}
{$endif}
  GL_VERSION_1_0,
  GL_VERSION_1_1,
  GL_VERSION_1_2,
  GL_VERSION_1_3,
  GL_VERSION_1_4,
  GL_VERSION_1_5,
  GL_VERSION_2_0,
  GLU_VERSION_1_1,
  GLU_VERSION_1_2,
  GLU_VERSION_1_3: Boolean;
То есть для каждого потока выделяется своя переменная если есть ключ MULTITHREADOPENGL
Поискал в моей версии dglOpenGL.pas - threadvar вообще нигде не нашёл.
Заменил, var на threadvar улучшений не заметил.
Копаю дальше...
0
vxg
Модератор
3292 / 2086 / 330
Регистрация: 13.01.2012
Сообщений: 8,118
13.02.2013, 15:50 4
вот тут какое-то "бу бу бу" про расшаривание списков и многопоточность http://www.opengl.org/wiki/OpenGL_and_multithreading
может читал уже. а по коду: так ты делаешь новый контекст? ставишь его текущим? текстуры расшариваешь?
0
snake32
1842 / 1154 / 203
Регистрация: 26.02.2009
Сообщений: 4,316
Записей в блоге: 5
13.02.2013, 17:20  [ТС] 5
Решено!
Проблема была именно в threadvar модуля dglOpenGL

Добавлено через 1 час 26 минут
Цитата Сообщение от vxg Посмотреть сообщение
а по коду: так ты делаешь новый контекст? ставишь его текущим? текстуры расшариваешь?
http://www.gamedev.ru/code/forum/?id=172828
1
13.02.2013, 17:20
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2013, 17:20

Подгрузка данных
Есть файл .php, в нём блок poems-list, в который должны грузиться данные из таблицы. &lt;div...

Подгрузка данных
Здравствуйте. Подскажите самый просто вариант для подгрузки данных, в моем случае 3х новостей. Вот...

Подгрузка данных в select
Добрый день!! Есть SELECT который формируется выборкой из БД, но этот селект содержит 50К+...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru