Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2012, 19:48   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Загрузка текстур OpenGL asm

Приветствия всем форумчанам. Была уже созданная мной тема по OpenGL, но мне кажется, что для поиска лучше создать отдельную, тем более, тематики немного различаются. В этой теме я хочу разобрать загрузку текстур. Будем пользоваться GLAUX библиотекой. Итак начнем. Имеем структуру
Код:
typedef struct _AUX_RGBImageRec {
   GLint sizeX, sizeY;
   unsigned char *data;
} AUX_RGBImageRec;
Правильно ли я понимаю, что unsigned char *data указатель на массив пикселей?
Обратим внимание на функцию
Код:
invoke  auxDIBImageLoad,texture1
Вопрос. Почему имя файла img.bmp приходится объявлять таким образом:
Код:
texture1          db 'i',0,'m',0,'g',0,'.',0,'b',0,'m',0,'p',0
Что это за кодировка?
Теперь главный вопрос. Мы объявили структуру _AUX_RGBImageRec, переменную такого же типа, и указатель на нее. Каким образом
Код:
image = auxDIBImageLoad("photo.bmp");
auxDIBImageLoad не получая указателя сохраняет данные в структуре? Как это реализовывается на низком уровне? В частности, как реализовать строку
Код:
image = auxDIBImageLoad("photo.bmp");
на asm?
Заранее благодарю.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 08.09.2012 в 19:51.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 09.09.2012, 00:09   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Что это за кодировка?
wchar, 16битная

Цитата:
Мы объявили структуру _AUX_RGBImageRec, переменную такого же типа, и указатель на нее.
Выделенное лишнее.

Цитата:
auxDIBImageLoad не получая указателя сохраняет данные в структуре? Как это реализовывается на низком уровне? В частности, как реализовать строку
Как обычно. ОНА вам ВОЗВРАЩАЕТ указатель, а вы его уже используте.
p51x вне форума Ответить с цитированием
Старый 09.09.2012, 09:35   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Как обычно. ОНА вам ВОЗВРАЩАЕТ указатель, а вы его уже используте.
Зачем тогда создавать структуру, о которой функция не знает?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 09.09.2012, 10:45   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Прочитайте в моем посте не только последнюю строку. Функция "знает" о структуре и возвращает указатель на структуру вам.
p51x вне форума Ответить с цитированием
Старый 09.09.2012, 20:05   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Функция "знает" о структуре и возвращает указатель на структуру вам.
Как? Откуда? Структура ведь не имеет названия в исполняемом файле или она ее по указателю на уровне компиляции находит? А если я ее не опишу все равно работает.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 09.09.2012, 22:17   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Вы путаете. Наведите порядок в голове.
1. О конкретном вашем экземпляре функция ничего не знает и ей это не нужно.
2. Функция загружает файл и создает экземпляр структуры в памяти.
3. Функция возвращает вам указатель, а вы его используете, как вам надо.

Цитата:
А если я ее не опишу все равно работает.
Да прочитайте же мой пост. Я вам уже писал, что ваша конкретная переменная не нужна и функции на нее наплевать.
p51x вне форума Ответить с цитированием
Старый 09.09.2012, 22:17   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Вы путаете. Наведите порядок в голове.
1. О конкретном вашем экземпляре функция ничего не знает и ей это не нужно.
2. Функция загружает файл и создает экземпляр структуры в памяти.
3. Функция возвращает вам указатель, а вы его используете, как вам надо.

Цитата:
А если я ее не опишу все равно работает.
Да прочитайте же мой пост. Я вам уже писал, что ваша конкретная переменная не нужна и функции на нее наплевать.
p51x вне форума Ответить с цитированием
Старый 10.09.2012, 15:30   #8
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо большое за объяснение, и за то, что уделили на меня время.
Цитата:
Вы путаете. Наведите порядок в голове.
Этот беспорядок создал некоторый с++ код, теперь все ясно. Еще раз спасибо.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 10.09.2012, 20:21   #9
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Хорошо. Теория закончилась приступаем к практике. Как я не крутил, этот код отображает белый квадрат без текстуры.
Код:
  ;invoke  glPixelStorei,GL_UNPACK_ALIGNMENT,1
         invoke  auxDIBImageLoad,texture1
         mov     [image],eax
         ;invoke  glRasterPos2d,-4.5,-3
         ;invoke  glPixelZoom,1,1
         ;mov     eax,image
         ;add     eax,4
         ;mov     ebx,image
         ;add     ebx,8
        ; invoke  glDrawPixels,image,eax,GL_RGB,GL_UNSIGNED_BYTE,ebx
         invoke  glGenTextures,1,texture
         invoke  glBindTexture,GL_TEXTURE_2D,[texture]
         invoke  glTexParameteri,GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR
         invoke  glTexParameteri,GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR
         mov     eax,image
         add     eax,4
         mov     ebx,image
         add     ebx,8
         invoke  glTexImage2D,GL_TEXTURE_2D,0,3 image,eax,0,GL_RGB,GL_UNSIGNED_BYTE,ebx
         invoke  glTexEnvi,GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE
        ; invoke  glTexEnvi,GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL
расположен в onCreate.
В OnPaint:
Код:
invoke  glEnable,GL_TEXTURE_2D
         invoke  glBindTexture,GL_TEXTURE_2D,[texture]
         invoke  glBegin,GL_QUADS

         invoke  glTexCoord2f,1,1
         invoke  glVertex2f,0.5,0.5
         invoke  glTexCoord2f,1,0
         invoke  glVertex2f,-0.5,0.5
         invoke  glTexCoord2f,0,0
         invoke  glVertex2f,-0.5,-0.5
         invoke  glTexCoord2f,0,1
         invoke  glVertex2f,0.5,-0.5

         invoke  glEnd
         invoke  glDisable,GL_TEXTURE_2D

         invoke  SwapBuffers,[hdc]
Может я что-то с указателями перепутал. Не получается в своем коде ошибку найти.
--

После модернизации кода, эффекта так и не добился. В результате получается белый полигон без текстуры. Изменил glTexImage2D. Теперь она принимает правильные значения.
Код:
 invoke  auxDIBImageLoad,texture1
         mov     [image],eax
         invoke  glGenTextures,1,texture
         invoke  glBindTexture,GL_TEXTURE_2D,[texture]

         invoke  glTexParameteri,GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR
         invoke  glTexParameteri,GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR
         mov     eax,[image]
         mov     ebx,[image]
         add     ebx,4
         mov     edx,[image]
         add     edx,8
         invoke  glTexImage2D,GL_TEXTURE_2D,0,3 DWORD[eax],DWORD[ebx],0,GL_RGB,GL_UNSIGNED_BYTE,DWORD[edx]

         mov     eax,[image]
         mov     ebx,[image]
         add     ebx,4
         mov     edx,[image]
         add     edx,8
         cinvoke wsprintf,buf,'%d %d %d',DWORD[eax],DWORD[ebx],DWORD[edx]
         invoke  MessageBox,0,buf,0,0
         invoke  glEnable,GL_TEXTURE_2D
Рисование
Код:
 invoke  glViewPort,0,0,500,500
         invoke  glClear,GL_COLOR_BUFFER_BIT or GL_COLOR_BUFFER_BIT
         invoke  glClearColor,0.0,0.0,0.0

         invoke  glBindTexture,GL_TEXTURE_2D,[texture]
         invoke  glBegin,GL_QUADS

         invoke  glTexCoord2f,1.0,1.0
         invoke  glVertex2f,0.5,0.5
         invoke  glTexCoord2f,1.0,0.0
         invoke  glVertex2f,-0.5,0.5
         invoke  glTexCoord2f,0.0,0.0
         invoke  glVertex2f,-0.5,-0.5
         invoke  glTexCoord2f,0.0,1.0
         invoke  glVertex2f,0.5,-0.5

         invoke  glEnd
         invoke  SwapBuffers,[hdc]
Для желающих - полный исполняемый и исходный файлы
Вложения
Тип файла: zip OpenGL.zip (125.8 Кб, 10 просмотров)

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 11.09.2012 в 20:17.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 11.09.2012, 20:48   #10
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Прошу прощения за третий пост, ну неужели даже предположения нет? gluBuild2DMitmap тоже не помогает. Сравниваю с рабочим с++ кодом и не нахожу различий. Если кто-то все-таки решит помочь прошу обратить внимание на
Код:
mov     eax,[image]
         mov     ebx,[image]
         add     ebx,4
         mov     edx,[image]
         add     edx,8
         invoke  glTexImage2D,GL_TEXTURE_2D,0,3 DWORD[eax],DWORD[ebx],0,GL_RGB,GL_UNSIGNED_BYTE,DWORD[edx]
уж больно я в ней сомневаюсь.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGl Загрузка текстур в массив impulsgraw Мультимедиа в Delphi 9 21.05.2014 00:01
Загрузка множества текстур. OpenGL Asker13 Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 17.04.2011 13:10
Загрузка текстур alexprey Мультимедиа в Delphi 0 21.03.2011 22:14
OpenGL - наложение текстур. Nater Общие вопросы Delphi 0 21.02.2011 20:14
наложение текстур в OpenGL FJFray Мультимедиа в Delphi 1 23.10.2010 12:40