Learning by... Reading

Авторы: 
Петр Сикачев

В настоящее время программисту интерактивной трехмерной графики, чтобы считаться минимально квалифицированным, необходимо овладеть массой знаний, не относящихся к "обычному" программированию. В эти знания входят как сугубо практические вещи (графический API, пресловутые "шейдеры" и т. п.), так и более теоретические знания и приемы (некоторый "базис" специфических для компьютерной графики алгоритмов).

Даже в лучших отечественных университетах на основных курсах даются слишком поверхностные знания, а соответствующие спецкурсы начали лишь появляться. Несмотря на обилие информации в Интернете, она плохо структурирована и не всегда достаточна для овладения предметом. Поэтому автор этих строк решил сделать небольшой обзор по литературе разного уровня по компьютерной графики. Необходимо заранее предупредить, что большинство книг нельзя достать в России; в электронном виде тоже доступно не все. Однако более чем реально заказать книги по почте из некоторых западных интернет-магазинов.

В этом обзоре разделим все книги на три уровня (классификация часто проскакивает в западной литературе): Beginner, Intermediate и Expert. Грань между ними весьма и весьма условная, однако кажется более логичным изучать предмет именно в таком порядке: иначе будет непонятен предмет разговора в книгах более "высокого" уровня.

Beginners

Вначале отметим две книги по API OpenGL: это Ю. Баяковский, А. Игнатенко "Начальный курс OpenGL" и т. н. Red Book: Ву, Нейдер, Девис, Шрайнер "OpenGL - официальное руководство программиста". Первая книга хороша как "курс молодого бойца" - достаточно кратко описываются основные вещи, необходимые для самостоятельного написания приложение с использованием данного API. Также в книге кратко описывается несколько "продвинутых" техник (тени, полупрозрачность), что неплохо для знакомства с принципами построения алгоритмов, не встроенных в сам API. Вторая книга предполагает изучение стандарта OpenGL более глубоко; на каждую технику приводятся примеры.

Из книг по шейдерам стоит обратить внимание на переведенный на русский Orange Book: Рэнди Дж. Рост "OpenGL - трехмерная графика и язык программирования шейдеров". Книга дает хорошее понимание графического конвейера и теоретическую базу. Примеры там разбираются довольно неравномерно и новичку может быть сложно реализовать предложенные там техники.

Для закрепления на практике этих навыков можно порекомендовать книгу от известной калифорнийской фирмы: Randimo Fernando, Mark J. Kilgard "The Cg Tutorial". Язык Cg очень незначительно отличается по синтаксису (по функциональности - практически ничем) от GLSL. В книге дается очень хороший практический курс по шейдерам (не перегруженный программированием самого приложения), при этом рассказывается про несколько "продвинутых" алгоритмов, связанных с шейдерами.

Выдержки из книги и другая полезная информация есть здесь:

http://developer.nvidia.com/object/cg_tutorial_home.html

Intermediate

В этой категории отмечу одну отечественную и одну иностранную книгу. Первая - это <Разработка и отладка шейдеров> А.В. Борескова. Книга более практическая, неплохая, разбираются расширения OpenGL, необходимые для нормальной работы (рендеринг в текстуру и т. д.), а также IDE для отладки шейдеров. Серьезный недостаток - "привязка" читателя к классам автора (и все примеры с использованием его классов и библиотек).

Другая книга из этой категории, в основном, теоретического плана - Tom McReynolds, David Blythe <Advanced Graphics Programming using OpenGL>. Очень большой плюс этой книги - она описывает приемы программирования на OpenGL с использованием  <родных> (native) приемов, что зачастую эффективнее использования шейдеров. Например, вы знаете, как использовать параметр растеризации полигонов для антиалиасинга (устранения ступенчатости)? Также описывается принципы большинства алгоритмов, ставших классикой: bump mapping, shadow mapping, environment mapping, deferred shading и т. д.

Полезные ссылки:

www.mkp.com/opengl

http://www.amazon.com/gp/reader/1558606599/ref=sib_dp_pt/102-5344710-2919325#reader-link

Expert

В этой секции уже давно существуют общепризнанные книги (точнее, серии книг). К сожалению, они все (надеюсь пока) на английском, и через отечественные магазины доступны по вскрученным втрое-вчетверо ценам. Однако некоторые из них можно найти в интернете.

Первая (и более известная) - это серия все той же зеленой фирмы <GPU Gems>. Их всего 3 книги (последняя появилась сравнительно недавно), при этом некоторые алгоритмы из первой книги уже почти стали классическими. Статьи в этих книгах пишутся разными авторами, поэтому приведу небольшую классификацию (по субъетивному убыванию интересности):

  • глубокое описание какого-либо метода + вклад авторов (аналог STate of the ARt)
  • научная статья (предыдущий пункт минус глубокое описание)
  • использование GPU в такой-то <неграфической> (GP GPU) области (от обработки изображений и трассировки лучей до физики, шифрования и оценки стоимости опционов)
  • "трюки" для конкретной аппаратуры
  • как мы с друзьями за ящиком пива писали игру, и что из этого получилось

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

Содержание можно посмотреть здесь:

http://developer.nvidia.com/object/gpu_gems_home.html

http://developer.nvidia.com/object/gpu_gems_2_home.html

http://developer.nvidia.com/object/gpu-gems-3.html

Другая серия - "ShaderX" под бессменным редакторством Wolfgang Engel. В ней вышло 3 книги (если не считать непонятную "ShaderX2"); скоро выходит четвертая. Лично автору эта серия нравится, в целом, больше, чем "GPU Gems", благодаря большему акценту на первые два класса статей. Для любителей мобильных устройств там есть специальный раздел, посвященный приемам программирования трехмерной графики для них. При этом многие авторы "засветились" и в той, и в другой серии, что показательно.

Читать от начала до конца эти книги вряд ли имеет смысл (ну разве только "GPU Gems 1"). Реализовывать все методы подряд - тоже.  Автор используют эти книги как источник дополнительного материала при исследовании новой предметной области - здесь они незаменимы. Чтение книг этого уровня позволяет не <изобретать велосипед>, а также пользоваться такими (уже работающими и проверенными) решениями, до которых самостоятельно додуматься было бы очень затруднительно.

В заключение стоит порекомендовать следить за новинками, появляющимися на рынке. Благо сервисы большинства интернет-магазинов позволяют смотреть содержание книг и "пролистывать" некоторые страницы. В настоящий момент автор ждет  6ую часть "ShaderX", книгу того же автора "Programming Vertex, Geometry, and Pixel Shaders", а также книгу "Game Graphics Programming".

Содержание и другая общедоступная информация здесь:

http://shaderx3.com/

http://shaderx4.com/

http://shaderx5.com/

http://shaderx6.com/

Дополнительная информация
Ссылка: 
Петр Сикачев. Learning by... Reading. Компьютерная графика и мультимедиа. Выпуск №6(1)/2008. http://cgm.computergraphics.ru/issues/issue16/3dbooks_review
Выпуск: 
Выпуск №6(1)/2008

Комментарии

На мой взгляд,

На мой взгляд, подборка книг не совсем верная.
Компьютерная графика (КГ) это прежде всего алгоритмы и математика, а не конкретный туториал по интерфейсу D3D или OpenGL. Шейдеры вообще бессмысленны без понимания алгоритмов работы графического конвейера. По моему мнению, "Квалифицированный программист" - это тот, который понимает, что он делает. Именно понимание есть краеугольный камень квалификации.
До прочтения туториалов по OpenGL было бы неплохо ознакомиться с собственно самими алгоритмами КГ. Для тех, кто прошел/проходит курс компьютерной графики на ВМиК МГУ все, конечно, правильно написано, но для новичков, решивших попробовать себя в графике, это не пойдет.

Я считаю, книжку Андре Ламота в области КГ можно сравнить с "Книгой Дракона" в области КК (Конструирование компиляторов) по своей значимости (хотя может быть я и преувеличиваю).
Кстати, она вот так выглядит http://ray-tracing.ru/images/Lamot.jpg
Книга хороша тем, что в ней, как и в "Книге Дракона", понятно "откуда уши растут". Автор не просто описывает тот или иной алгоритм с картинками - нет, он делает гораздо большее. Ламот вместе с читателем на протяжение книги пишет собственный программный рендер, подробно описывая все проблемы и наглядно показывает способы их решения на С (что для обучения не так уж плохо). То, что "Красная книга" освещает снаружи, Ламот дает изнутри вместе с исходными кодами и их подробнейшим описанием.
Более того, он рассчитывает на неподготовленного читателя и дает все необходимые начальные знания, даже по линейной алгебре. Единственное, что нужно занать для прочтения его книжки это С и хорошо бы Ассемблер. В книге освещаются такие важные вопросы как трехмерные преобразования, отсечение треугольников, порядок их вывода на экран, Z-буфферизация, описаны алгоритмы растеризации, наложения текстур (афинное и проективное), разбираются билинейная интерполяция, прозрачность, алгоритмы разбиения пространства и многое другое. Автор не забывает и об эффективности, получив довольно производительный рендер и приводит советы и примеры по оптимизации.

Во-первых,

Во-первых, книги, где ПОДРОБНО описывается графический конвейер с объяснением каждой стадии здесь есть - не одна и даже не две :)
Я не зря, вообще-то, разбил на три части свое обозрение :)
Во-вторых, книжка "Advanced Graphics Programming with OpenGL" как раз таки промывает мозги на предмет крутости нативных средств (типа того же блендинга) OpenGL.
Книжку Ламота я читал, она мне не нравится. Она учит именно игры программировать. Да - для понимания базовых вещей в трехмерной графике она, безусловно, интересна. Но то, что в ней обсуждается - это такой архаизм уже. Если пишешь свой рейтрейсер - то да, возможно, и круто. Но в современной графике навык написания своего алгоритма наложения текстур - как-то не самое главное, имхо. Разумеется, принципы понимать нужно - но о них достаточно написано и в том же "The Cg Tutorial".
А насчет проектирования движков - это в той же ShaderX в каждой серии есть статьи по этой теме, и они несколько более современны.

Да я не спорю,

Да я не спорю, что в "Advanced Graphics Programming with OpenGL" или в ShaderX все это есть. Я совсем не то хотел сказать.
Я хотел сказать, что НАЧИНАТЬ нужно с алгоритмов. Новички не могут читать Advanced Graphics Programming with OpenGL или тем более ShaderX. Они просто не доберуться до этого. Посмотри, им нужно прочитать 6 книг (!) пока они наконец доберуться до ядра + новички часто не очень хорошо читают на английском.

Если читать книги в том порядке, в котором ты их написал то обучение будет идти "Сначала снаружи, затем изнутри". Я не спорю, что такой подход имеет право на жизнь. Это все-равно что изучать ЯП в порядке Python, C++, Assembler. Так тоже делать можно, оно даже проще + больше практических навыков.

Но существует точка зрения, что это не есть хорошо, потому что при таком подходе на каждой стадии обучения человек не до конца понимат, что он делает. Например, на ВМиК сначала изучают Ассемблер, затем С, затем С++ и уже потом только все остальное.

И твоя и моя точки зрения имеют право на жизнь. Но я могу привести хороший пример в мою пользу.
Пятачок прочитал одну или две книжки из твоего списка (самые первые). Вот пишет он на ОпенГЛ рендеринг какого-то объекта в сцене. Тут он решил добаваить прозрачность, а ему говорят "Вы должны СОРТИРОВАТЬ ПРОЗРАЧНЫЕ ПОЛИГОНЫ ПО ГЛУБИНЕ и выводить их ПОСЛЕ ТОГО, КАК БЫЛА ОТРИСОВАНА ПОЛНАЯ СЦЕНА с ВЫКЛЮЧЕННЫМ БУФЕРОМ ГЛУБИНЫ, или получится неправильно".

Пятачок: "Хрю, Зачем отключать Z-буффер? Почему надо сортировать грани? У меня же ведь все работало без прозрачности!"
Виннипух: "ОпенГЛ не рулит, попробуй ДиректИКС, смотри какой я на нем сделал воздушный шарик."

Пятачок переписывает свою программу на DirectX и с удивлением обнаруживает, что здесь от него требуют того же самого. Пятачок явно в недоумение. Он идет к за советом к кролику.

Пятачок: "Хрю, почему и в ОпенГЛ и в ДиректИКС нужно отключать Z-буффер и сортировать грани если рисуешь чо-то прозрачное?"
Кролик: "Не неужно, используй расслоение глубины, посмотри уроки на NeHe" (кролику лень объяснять пятачку в чем дело, он просто дал ссылку, которой пользовался сам).
Пятачок в растерянности. Это еще хлеще. Он идет к сове.

Пятачок: "Хрю, Тут какие-то слои появились, откуда? Почему нельзя просто НАРИСОВАТЬ объект?"
Потому что он не понимает сути проблемы. Он не знает, как работает Z-буффер, что это такое. Он также не знает, как работает графический конвейер, буть то ОпенГЛ или ДеректИКС.
Сова: "Пятачок, почитай книжку Ламота. Z-буффер и альфа-смешивание - просто несовместимые алгоритмы."

По поводу архаизмов:
Частично - да, но только частично. Многие из алгоритмов, описываемых Ламотом используются до сих пор (BSP, порталы хотя бы). И потом, архаизмы очень полезны для обучения, ведь все новое - это хорошо забытое старое. Книга Ламота учит многому из того, что дается на лекциях по КГ на ВМиК. А другие курсы? Паскаль, Ассемблер? - вот уж это точно архаизмы, и тем не менее именно с них начинается обучение.

"Она учит именно игры программировать" - ну...нет. 15-20% книги посвещено этому, не больше. Конкретно про программирование игр там не особенно много. Скорее про программирование движков для игр, или о том как написать собственный DirectX.

По поводу наложения текстур - тут важно, что наглядно рассказано, как они накладываются. Ты сам ведь говорил, что в Nvidia на собеседовании спрашивают такие вещи, про анизотропную фильтрацию и.т.д. Зачем они по твоему это делают? И потом, а что если ты занимаешься например реконструкцией текстур по фотографиям? - была ведь такая работа у Саши Шубина, так что не такой уж это и архаизм.

Вообще-то в

Вообще-то в твоем примере пятачок найдет ответ на свой вопрос в первой книжке из списка, потому что там пример с полупрозрачностью разобран. А пайплайн во ВСЕХ книжках первого-второго уровня оч подробно объясняется.
Проблема твоего подхода - чтобы написать программу а-ля "четвертый машграф" придется прочитать толстенную книжку Ламота. Все-таки много абстрактной теории по первости вредно, я считаю.

А где можно

А где можно первую книжку взять? В ИГУ, например, в библиотеке её нет.

Она выложена на сайте

Она выложена на сайте graphics.cs.msu.ru.

Так в итоге что читать то? На

Так в итоге что читать то? На русском есть что-нибудь? И где взять?
Я - один из тех пятачков которые были упомянуты выше.
Так вот, у меня процес обучения таков: немного теории, куча практики = немного осевших знаний (понимания)

Вот можете скачать, там есть

Вот можете скачать, там есть pdf книжки Начальный курс OpenGL
http://graphics.cs.msu.ru/ru/node/242

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

CAPTCHA
Тест предназначен для отсеивания спама
Fill in the blank