Программирование шейдеров на асме

Тема в разделе "WASM.PROJECTS", создана пользователем Uri, 1 сен 2004.

  1. Uri

    Uri New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2004
    Сообщения:
    24
    Адрес:
    Ukraine
    jekyll



    Во первых, не у всех есть возможность купить себе даже GF2. У меня огромное количество знакомых, которые до сих пор сидят на вторых пеньках и стареньких TNT2.





    Вопрос из категории "почему asm а не с или с++?". Ответ будет таким же.



    ozzman



    Это не шейдеры, а чер-те что, а именно при использовании RC и VS мы получим жалкое подобие чего-то нового и красивого, в результате чего интерес к данной теме сразу пропадет, в то время как PS нам дадут просто обалденные эффекты...



    Ух, интерес все-таки есть к теме! До конца недели выложу первый пример.
     
  2. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Uri

    Вопрос из категории "почему asm а не с или с++?". Ответ будет таким же.

    Вообще-то здесь есть 2 большие разницы. glsl - входит в состав opengl 2.0, ну или будет входить (т.к. gl2.0 вроде официально еще нет). можно конечно юзать ps 1.1 и vs 1.1, но можно и про 2.0 рассказать, ведь не в 2000 году живем.

    Каким же будет ответ?
     
  3. Uri

    Uri New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2004
    Сообщения:
    24
    Адрес:
    Ukraine
    jekyll



    Вот-вот. Но в любом случае - glsl это язык высокого уровня, а мы ведь низкоуровники? А значит будем программировать на асме, как саму программу, так и шейдеры.



    jekyll



    Начну с 1.1, продолжу 2.0. И хоть не в 2000м, но все равно большинство людей даже этого не имеют, а тем более ассемблерщиков.

    Но вообще-то это как рассказывать про 486й, а потом перейти к пентиуму :)
     
  4. Uri

    Uri New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2004
    Сообщения:
    24
    Адрес:
    Ukraine
    1. И самое главное: все проекты тут будут компилироваться с помощью fasm. Только в крайнем случае, если подавляющее большинство будет хотеть масм или тасм, и не сможет самостоятельно перенести код на них (кхм, кхм), тогда я выложу варианты и для этих ассемблеров.



    2. Что нам потребуется:<ul type=disc>

    <li>fasm.exe (модифицированный, если не хотите модифицировать весь процесс, об этом в конце поста) (в атачменте - fasm);

    <li>поделки мелкософта: link.exe (у меня версия 6.00.8168), nmake.exe (+nmake.err, у меня 1.50), rc.exe(+rcdll.dll, у меня 5.00.1641.1), хотя rc можно заменить на любой другой, поддерживающий компиляцию ресурсных файлов в coff obj (сразу, или через посредников);

    <li>редактор ресурсов от KetilO resed.exe (снова - можно и любой другой, даже hands.exe :);

    <li>настроеный tools.ini для компиляции .asm в .exe и .dll (в атачменте - tools);

    <li>kernel32.lib, user32.lib, gdi32.lib, opengl32.lib, glu32.lib от мелкософта, можно взять от студии (VS), masm32, или найти отдельно.

    <li>мои либы для фасма (в атачменте - include).

    <li>карточка, поддерживающая opengl и шейдеры (вертексные и пиксельные), версии не ниже 1.1.

    </ul>



    link, nmake, rc - гугль знает, resed - ResEd.zip

    оригинальный fasm - flatassembler.net



    3. Компиляция:<ul type=disc>

    <li>сложить все исполняемые файлы в одно место и прописать к ним PATH;

    <li>туда-же засунуть tools.ini из атачмента (для тех, кто не захочет - все равно возьмите его, и уже на его основе делайте свои батники, или что там у вас);

    <li>распаковать include в отдельную папку и прописать к ней переменную INCLUDE;

    <li>прописать в tools.ini в /LIBPATH путь к либам kernel32.lib и другим;

    <li>проекты ложить в отдельные папки (подпапки - по желанию)

    <li>запускать nmake для релиза; nmake DEBUG=, для дебажной версии; добавить /a для полной перекомпиляции.

    </ul>



    3. Первым исходником будут не шейдеры (а вы надеялись сразу и в дамки?), первым исходником будет облегчение нашей дальнейшей работы, а именно использования расширений opengl. Так как я человек в общем-то ленивый, то мне было очень влом в каждом проекте писать тучу лишнего кода по инициализации расширений, заводить кучу переменных для их функций и вызывать их не напрямую. А потому я написал небольшую dll'ку, которая делает это все сама, а мы юзаем просто функции, и причем точно также, как используем функции самого opengl. Код dll'ки находится в архиве glext - компилируем и ложим в %SystemRoot%/system32.

    Ну а для проверки - project1, который (о чудо!) использует пиксельный шейдер, но (как жаль), требует расширения GL_NV_vertex_program. В качестве текстуры заполнения он использует мусор из хипа, а потому не удивляйтесь, что картинка какая-то пестрая, это просто визуальное представление хаоса, царящего в вашей памяти. Если расширения у вас нету то после запуска вылетит сообщение об этом, тогда можете закоментарить "define USE_NV" и посмотреть на хаос без шейдеров.



    glext идет с минимальными комментариями (они действительно нужны), а project1 - вообще без них (но будут, тут все будет разжевано до мелочей).



    4. Модификация fasm: можете конечно попробовать поюзать немодифицированный и руками прописывать /defaultlib:xxx.lib в командной строке, но меня этоокончательно убило, и я доделал фасм вот таким просым, но эффективным, образом:

    flatassembler/board



    уффф. прошу вопросы в студию, но не по исходниках (хотя если по glext, то можно) а по процессу компиляции. Вот когда он будет всем ясным - тогда и перейдем дальше.



    атачи: так как максимальный размер атача 50К, то большая часть исходников (а именно заголовки для фасма) ушли в раздел "Исходники", остальное сюда. Ссылку добавлю как только они там появятся.
     
  5. Uri

    Uri New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2004
    Сообщения:
    24
    Адрес:
    Ukraine
  6. Uri

    Uri New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2004
    Сообщения:
    24
    Адрес:
    Ukraine
  7. Uri

    Uri New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2004
    Сообщения:
    24
    Адрес:
    Ukraine
  8. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Блин, а exe'шники в архивы не присунуть? Лично я например смотрю сначала сам пример, а если нравиться начинаю копаться в коде. imho и только imho, заставлять народ компилить непонятно что.
     
  9. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Глянул сорцы мельком и еще раз убедился, что сколько существует людей пишущих на фасме, столько и существует flat assembler'ов. =( Фасм мощен и хорош, но берешь исходник одного человека - один ассемблер, другого - другой, если не сказать что чем дальше - тем больше высокого уровня и меньше асма. Не говорю, что это плохо.
     
  10. Uri

    Uri New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2004
    Сообщения:
    24
    Адрес:
    Ukraine
    jekyll



    Ну а ты чего хотел? Ассемблер - штука творческая, он как раз и хорош тем, что не накладывает искуственных ограничений на разум. В любом случае - если есть интерес в данному треду, то придется научится читать мой код.

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





    Ты про switch? Это не высокий уровень - это автоматизация макросами. Неужели лучше было б если бы я ложил параметры процедур в стек через push, для каждого использования статического текста заводил отдельную переменную в сегменте данных и расписывал процедуру обработки сообщений окна через cmp/je? Сколько б тогда тебе понадобилось времени для прочтения сорцов, а тем более для их понимания? Да, я завел автоматизацию (не высокий уровень, ибо высокий уровень думает вместо тебя, а автоматизация - это, можно сказать, простая шаблонизация), но я ведь остался в асме, то-есть можно уверенно сказать что вот эта строка будет вот таким кодом, а вот эта - вот таким, не так ли? Так что никой проблемы я тут не вижу.





    Ну, на первый раз присуну - только они тебе все равно ничего не покажут, а тем более не восхитят. Исходники ложатся тогда, когда надо продемонстрировать визуальную компоненту, а тут работа проходит в середине, и сверху этого не видно (ну почти).

    В дальнейшем исходник будет сопровождаться исполняемым файлом только в случае, если целью исходника будет нарисовать что-то красивое, иначе - только сорец.





    Вот слова достойные истинного Воина дзена! Да - фасм, это прекрасное оружие в извечной борьбе света и тьмы, добра и зла, ассемблерщиков и высокоуровников. Хвала создателю сего чуда, хвала Привалову! :)

    [​IMG] 1708710156__glext+project1.rar
     
  11. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Uri

    Я так и думал, что будет длинный пост. =)

    В дальнейшем исходник будет сопровождаться исполняемым файлом только в случае, если целью исходника будет нарисовать что-то красивое, иначе - только сорец.



    Ну меня вобщем-то почти не интересует код, если визуальный эффект неинтересен.



    Что еще нужно этому екзешнику с dll'кой для запуска???????



    Моя fx5700 вроде шейдеры держит, а с nvemulate эмулирует 6800. Но твой пример вылетел с exeption и сказал, что моя видюха не держит gl_nv_vertex_program........
     
  12. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    почему у тебя почти все или даже все экспортируемые функции в dll'ке начинаются на ud2?
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    jekyll

    Это твоё мнение, другие хотят разобраться в программировании шейдеров, а не рассматривать демки.
     
  14. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    IceStudent

    Это твоё мнение, другие хотят разобраться в программировании шейдеров, а не рассматривать демки.

    Я что против? Было бы странно, если бы я высказывал не свое мнение, а чье-нибудь другое.



    Повторюсь еще раз. Я не вижу смысла в рассмотре кода, который делает не интересный мне эффект. Может это просто какое-нить мультитекстурирование на шейдере, или расчет освещения.

    Если же создается какой-нить хитрый и красивый эффект, то я обязательно посмотрю на код.



    Всякие инициализации ogl'а меня не интересуют.



    У тебя пример работает?
     
  15. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Uri

    IceStudent

    У вас пример работает?
     
  16. Uri

    Uri New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2004
    Сообщения:
    24
    Адрес:
    Ukraine
    jekyll



    Прошу прощения, так как у меня на работе шейдеры вообще не работают, то я допустил довольно досадную ошибку - при отрезании префикса (у меня идет свой дополнительный код перед main) я пропустил изменение ссылания на стек.

    Итак, надо сделать маленькое изменение: все, от метки main: надо изменить на
    Код (Text):
    1.  
    2. main:   cmp dword[esp+8],DLL_PROCESS_ATTACH
    3.     jne @f
    4.     push    eax
    5.     call    VirtualProtect  ,lpName,12,PAGE_READWRITE,esp
    6.     mov [hDllInstance],[esp+4]
    7.     call    GetModuleHandleA,NULL
    8.     mov [hInstance],eax
    9.     call    SetProcAddress  ,'wglMakeCurrent',WglMakeCurrent
    10.     pop ecx
    11.     mov eax,TRUE
    12. @@: ret 12
    13.  


    Тогда заработает. Ну и dll в атаче, project1.exe подходит старый.

    [​IMG] _1198340100__glext.rar
     
  17. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    Uri

    Так мне обновить то, что на сайте???!!!
     
  18. Uri

    Uri New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2004
    Сообщения:
    24
    Адрес:
    Ukraine
    Edmond



    Угумс. Сори, забыл тебя предупредить. Щас мейлом отвечу.



    jekyll



    Это генераторы ексепшенов. Когда функция расширения не находится в opengl, то вход не подменяется и, соответственно, генерируется STATUS_ILLEGAL_INSTRUCTION, ну а дальше по коду - выводим предупрежение и т.д.
     
  19. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Uri

    Тогда заработает. Ну и dll в атаче, project1.exe подходит старый.

    Все равно exeption и не работает.
     
  20. Uri

    Uri New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2004
    Сообщения:
    24
    Адрес:
    Ukraine
    jekyll



    Угумс. Я ж говорил, что на работе не могу проверить :dntknw:

    В общем там вместо [esp+4] надо [esp+8].

    Заминаю я с быстрыми исправлениями - прежде чем положить буду дома проверять. На этот раз вариант проверенный - рабочий.



    Следующий пример будет через пару дней - в качестве наглядного пособия будем изображать морскую поверхность.

    [​IMG] _1416700590__glext.zip