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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2012, 21:54   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Расширения OpenGL принцип работы.

Добрый вечер, на данный момент. Ситуация следующая. Решил разобраться с расширениями OpenGL, но не могу понять принцип их работы на низком уровне. То что они предназначены для расширения возможностей OpenGL, я знаю. Короче, я на asm'e пытаюсь использовать расширение, но, к сожалению, кроме черного экрана ничего не добиваюсь. Для начала использую multitexture.
Я инициализирую функции расширения таким вот образом
Код:
invoke  wglGetProcAddress,name
        mov     [address],eax
Переменная [address] имеет размер 4 байта. Вызываю функции макросом invoke address,values. Как только я в обработчике OnPaint пишу следующее
Код:
invoke  glActiveTextureARB,GL_TEXTURE0_ARB
         invoke  glEnable,GL_TEXTURE_2D
         invoke  glBindTexture,GL_TEXTURE_2D,[texture1]
что в C++ будет примерно так:
Код:
 glActiveTextureARB(GL_TEXTURE0_ARB)
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D,texture1)
Все исчезает, нет ни полигонов не текстур. Если нужно вот код рисования полигона
Код:
 invoke  glColor3f,0.0,1.0,0.0
         invoke  glBegin,GL_QUADS
         invoke  glMultiTexCoord2fARB,GL_TEXTURE0_ARB,0.0,0.0
         invoke  glMultiTexCoord2fARB,GL_TEXTURE1_ARB,0.0,0.0
         invoke  glVertex3f,0.5,0.5,0.5
         invoke  glMultiTexCoord2fARB,GL_TEXTURE0_ARB,1.0,0.0
         invoke  glMultiTexCoord2fARB,GL_TEXTURE1_ARB,1.0,0.0
         invoke  glVertex3f,-0.5,0.5,0.5
         invoke  glMultiTexCoord2fARB,GL_TEXTURE0_ARB,1.0,1.0
         invoke  glMultiTexCoord2fARB,GL_TEXTURE1_ARB,1.0,1.0
         invoke  glVertex3f,-0.5,-0.5,0.5
         invoke  glMultiTexCoord2fARB,GL_TEXTURE0_ARB,0.0,1.0
         invoke  glMultiTexCoord2fARB,GL_TEXTURE1_ARB,0.0,1.0
         invoke  glVertex3f,0.5,-0.5,0.5
         invoke  glEnd
Что меня не менее интересует, так это то, что во всех примерах, которые я находил в сети, используется glext.dll, а я ее не использую, точнее не знаю как. wglGetProcAddress мне и так возвращает какой-то адрес. Для чего нужна эта dll?
Вот так объявлены константы
Код:
GL_TEXTURE0_ARB        equ           084C0h ; пробывал и 0x84C0 дописывать,
GL_TEXTURE1_ARB        equ           084C1h ; но никаких результатов,
GL_TEXTURE2_ARB        equ           084C2h ; да и с чего бы они были...
GL_TEXTURE3_ARB        equ           0x84C3
Заранее благодарю и жду ответов.
P.S. попробую завтра написать аналог на с++.
--

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

Блог

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

Может она каким-то особым образом подключается? Неужели никто не знает? Мне хотя бы намек.
А может glew использовать? Но ради спортивного интереса нужно разобраться с glext. Хоть какие-нибудь предположения выскажите.

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

Блог

Последний раз редактировалось _PROGRAMM_; 26.09.2012 в 19:18.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 28.09.2012, 20:04   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

1. Перед использованием расширений необходимо получить строку со списком расширений и убедиться, что требуемое расширение поддерживается.
2. Необходимо проверять возвращаемые функциями значения (в частности, что указатель ненулевой), а также вообще интересоваться у OpenGL, не было ли ошибок.
s-andriano вне форума Ответить с цитированием
Старый 28.09.2012, 21:20   #4
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
1. Перед использованием расширений необходимо получить строку со списком расширений и убедиться, что требуемое расширение поддерживается.
2. Необходимо проверять возвращаемые функциями значения (в частности, что указатель ненулевой), а также вообще интересоваться у OpenGL, не было ли ошибок.
Проблема была очень грустная. Короче, я glTranslatef закомментировал и поэтому полигон рисовался как бы "перед" монитором Сам недавно разобрался,сейчас хотел отписаться.

Теперь, для достижения цели, задам еще вопрос.
Я имею следующий код
Код:
         glActiveTextureARB(GL_TEXTURE0_ARB);
         glEnable(GL_TEXTURE_2D);
         glBindTexture(GL_TEXTURE_2D,texture1);

         glActiveTextureARB(GL_TEXTURE1_ARB);
         glEnable(GL_TEXTURE_2D);
         glBindTexture(GL_TEXTURE_2D,texture2);

         glTranslatef(0.0,0.0,-3.5);

         glBegin(GL_QUADS);
         glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0,1.0);
         glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0,1.0);
         glVertex3f(0.5,0.5,0.5);
         glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0,1.0);
         glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0,1.0);
         glVertex3f(-0.5,0.5,0.5);
         glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0,0.0);
         glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0,0.0);
         glVertex3f(-0.5,-0.5,0.5);
         glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0,0.0);
         glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0,0.0);
         glVertex3f(0.5,-0.5,0.5);
         glEnd();
В данном случает текстуры натягиваются на полигон и смешиваются(почему?). Я хочу натянуть по текстуре на половину полигона. Делаю это так:
Код:
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0,1.0);
         glMultiTexCoord2fARB(GL_TEXTURE1_ARB,2.0,1.0);
         glVertex3f(0.5,0.5,0.5);
         glMultiTexCoord2fARB(GL_TEXTURE0_ARB,-1.0,1.0);
         glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0,1.0);
         glVertex3f(-0.5,0.5,0.5);
         glMultiTexCoord2fARB(GL_TEXTURE0_ARB,-1.0,0.0);
         glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0,0.0);
         glVertex3f(-0.5,-0.5,0.5);
         glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0,0.0);
         glMultiTexCoord2fARB(GL_TEXTURE1_ARB,2.0,0.0);
         glVertex3f(0.5,-0.5,0.5);
В результате полигон пропадает. А вот если использовать по одной текстуре, то она корректно располагается на полигоне. Т.е. закомментировав одну из троек(см ниже) текстура отображается(та, которая не закомментирована).
Код:
         glActiveTextureARB(GL_TEXTURE0_ARB);//
         glEnable(GL_TEXTURE_2D);               // Заккоментировать эту тройку
         glBindTexture(GL_TEXTURE_2D,texture1);//

         glActiveTextureARB(GL_TEXTURE1_ARB);//
         glEnable(GL_TEXTURE_2D);                 //или эту
         glBindTexture(GL_TEXTURE_2D,texture2);//
Как правильно используется мультитекстурирование? У Борескова написано, что для наложения теней(хоть и старо, но интересно), но каким образом это работает, если довольно проблематично задать конкретное положение текстуре?

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

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 28.09.2012, 22:18   #5
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Урок 22. Наложение микрорельефа методом тиснения, мультитекстурирование и использование расширений OpenGL. http://pmg.org.ru/nehe/nehe22.htm
Kostia вне форума Ответить с цитированием
Старый 29.09.2012, 07:25   #6
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо, я что-то забыл про hehe. Тогда такой вопрос, относящийся к принципам работы расширений. Для чего нужен файл glext.dll, если без него у меня все нормально функционирует?

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

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 29.09.2012, 11:29   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Ответ очевиден - он нужен только в тех случаях, когда без него не работает.

Вы посмотрите, какие именно процедуры там лежат. Очевидно, ни одну из них Вы не используете.
s-andriano вне форума Ответить с цитированием
Старый 30.09.2012, 15:02   #8
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Я почему-то так и думал.

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

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
принцип работы SaveDialog Form_13 Общие вопросы Delphi 1 20.02.2012 00:24
принцип работы ссылки sbcd Свободное общение 0 03.06.2011 21:50
принцип работы программы sasha14486 Общие вопросы C/C++ 1 22.05.2011 12:36
Принцип работы WH_KEYBOARD_LL wwe2012 Общие вопросы C/C++ 5 01.04.2011 15:46
Принцип работы NS-серверов Ivan_32 Свободное общение 1 31.10.2010 03:38