FASM OpenGL Tutorial

Тема в разделе "WASM.OpenGL", создана пользователем tylerdurden, 30 дек 2004.

  1. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    Пытаюсь сейчас осваивать OpenGL.В частности читаю эту статью.
    Возникли непонятки с использованием готовой 3D-модели.А именно процесс преобразования того,что мы получаем из 3DS Max,в бинарный файл,который можно будет потом положить в ресурсы.
    Например,моделируем в 3DStudio обычный куб,переводим его в редактируемый mesh,затем экспортируем этот mesh,используя формат ASC(как описывалось в статье).Полученный файл открываем в блокноте и видим,что там нет и слова о координатах вершин.Там скорее находится описание фреймов анимации.
    Есть ещё некий формат ASE,сохранив в который,мы получим файл,в котором уже реально можно будет найти координаты вершин.Сложность однако возникает с нормалями,т.к. они там следуют в каком-то непонятном порядке...

    В общем,хотелось бы прояснить ситуацию с этими моделями.Как же их всё-таки преобразовывать к массиву координат вершин и нормалей?
     
  2. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    В общем,получив хорошую долю инспирации от "активности" данного подфорума,я всё же нашёл выход по отображению моделек в OpenGL.Надеюсь моя информация окажется кому-то полезной.
    Как оказалось,рулят тут вовсе не функции glInterleavedArrays,а связка функций следующего типа:
    Код (Text):
    1. invoke glVertexPointer, 03, GL_FLOAT, ebx, g_pV3FData ; массив вершин
    2. invoke glNormalPointer, GL_FLOAT, ebx, g_pN3FData ; массив нормалей
    3. invoke glEnableClientState, GL_VERTEX_ARRAY
    4. invoke glEnableClientState, GL_NORMAL_ARRAY
    5. invoke glDrawElements, GL_TRIANGLES, dwCount, GL_UNSIGNED_INT, g_pFacesData
    В функции glDrawElements мы используем массив индексов вершин граней,т.к. именно тогда наши примитивы(треугольники) будут правильно сведены в единое правильное целое.

    Теперь возникает вопрос,как же получить эти массивы?
    Лично я использовал для этого программку X3DS от товарища Varun Singh,которая конвертирует формат 3DS в простой и открытый формат B3D(Believe3D).Далее я написал свою программку,которая считывала нужные данные из полученного B3D-файла и сохраняла координаты вершин,нормалей,а также индексы вершин граней в отдельные файлы.После этого эти файлы можно прикрепить к ресурсам.На масме это будет выглядеть следующим образом,например:
    Код (Text):
    1. nameV3F BINARY "nameV3F.bin"
    2. ...
    Ну,и затем всё тривиально.В программе получаем указатели на ресурсы:
    Код (Text):
    1. invoke FindResource, ebx, addr szModelV3F, addr szBinary
    2. test   eax, eax
    3. jz     @@failure
    4.  
    5. invoke LoadResource, ebx, eax  
    6. test   eax, eax
    7. jz     @@failure
    8.                
    9. invoke LockResource, eax
    10. test   eax, eax
    11. jz     @@failure
    12. mov    g_pV3FData, eax
    13. ...
    Вот ссылки на обе программки:
    http://tools.guru.lbyte.ru/ups/files/X3ds.zip
    http://tools.guru.lbyte.ru/ups/files/B3DToBIN.rar
     
  3. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    DillerInc
    3DS легко читается с помощью
    3dsco
    3dsrdr
    искать в инете. Маленькие и понятные фри сорцы.

    А как текстурировать картинкой по UV это дело?
     
  4. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    ...а что значит "по UV"?
     
  5. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Координаты текстуры на сетке. Те каждая вершина сетки имеет еще и координаты U(x) и V(y) текстурной картинки.
     
  6. DillerInc

    DillerInc New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2006
    Сообщения:
    41
    ...а,понятно,спасибо.
    Я пока только накладывал текстуру на модельку,как описывал Tyler Durden в своей статье.Т.е. сама текстура создавалась из байт программы,а потом использовалась автоматическая генерация координат:
    Код (Text):
    1. ; /* Установим типы генерируемых текстур в направлениях "S" и "T" */
    2.  
    3. invoke glTexGeni, GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP
    4. invoke glTexGeni, GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP
    5.  
    6. ; /* Включим автоматическую генерацию текстурных координат */
    7.  
    8. invoke glEnable, GL_TEXTURE_GEN_S
    9. invoke glEnable, GL_TEXTURE_GEN_T
    10.  
    11. invoke glEnable, GL_TEXTURE_2D
    Кстати,а что значит: "в направлениях "S" и "T"" ??