Программирование на видеокартах GPGPU (1184391), страница 11
Текст из файла (страница 11)
В остальном это — добротная CUDA-программа, к которой добавленграфический интерфейс, что позволяет качественно исследовать поведение многихгравитирующих тел. Описание теоретической составляющей этой программы можно посмотреть вдокументе nbody_gems3_ch31.pdf, также входящем в состав CUDA SDK.Вообще надо сказать, что OpenGL — большая и довольно сложная библиотека, "объять" которуюза короткое время трудно, поэтому здесь такая попытка даже не делается. Если естьнеобходимость использовать OpenGL — имеет смысл обратиться к руководствам, особенно таким,40где всё изложено подробно, с большим количеством иллюстраций и примеров; вот лишьнесколько ссылок:An intro to modern OpenGL.
Table of Contentshttp://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Table-of-Contents.htmlAnton's OpenGL 4 Tutorialshttp://www.antongerdelan.net/opengl/OpenGL Step by Step — OpenGL Development on Linuxhttp://ogldev.atspace.co.uk/GLSL (OpenGL Shading Language)Если внимательно просмотреть исходные тексты упомянутой выше демонстрации nbody, томожно заметить (см. файл render_particles.cpp), что там присутствуют вроде бы исимвольные строки, но в то же время и какие-то фрагменты программного кода... Эти странныеданные в упомянутом файле имеют названия vertexShader и pixelShader.
И это действительнопрограммы, причём на специальном (C-подобном) языке GLSL!Программы на этом языке не используются сами по себе, они являются частью более сложнойOpenGL-программы. Или можно сказать так: с некоторых пор каждая OpenGL-программа "внутри"(возможно — невидимым для нас образом) использует мини-программы, написанные на языкеGLSL. Далее мы будем называть эти программы по-русски шейдерами (shaders), несмотря на то,что это слово ещё не получило широкого распространения.
Как правило, эти программы(шейдеры) исполняются на GPU. Имеется два основных вида шейдеров:••vertex shader — исполняется для каждой вершины в сцене отрисовкиfragment shader — исполняется для каждого пиксела, видимого на экранеКод каждого шейдера что-то принимает на вход и что-то генерирует на выходе.
В первом случае(vertex shader) принимаются позиции каждой вершины, координаты текстуры, которуюнеобходимо отобразить в каждой вершине, и преобразование для них (сдвиг, масштаб, поворот);на выходе получаются экранные координаты вершин, координаты текстуры вершины. Далееfragment shader будет использовать эти данные.attribute vec4 a_position;attribute vec2 a_texCoord;uniform mat4 u_MVPMatrix;varying mediump vec2 v_texCoord;void main(){gl_Position = u_MVPMatrix * a_position;v_texCoord = a_texCoord;}41Шейдеру вершин надо заполнить значение встроенной переменной gl_Positionположением преобразованнойвершины, т.е. входная позицияумножается наModelViewProjection-матрицу.Ключевое слово attribute говорит о том, что это входная переменная, сопоставляемаякаждой вершине; vec2 и vec4 говорят о том, данные являются векторами вещественныхчисел (float).
Если нужно передать шейдеру из кода некоторую внешнюю переменную, онаобъявляется uniform. Тип mat4 говорит о том, что это матрица размера 4x4 из вещественныхзначений.Переменные, которые должны из шейдера вершин (vertex shader) попасть в шейдер фрагментов(fragment shader), помечены ключевым словом varying. Самое интересное, что такиепеременные интерполируются, т.е., для каждого пиксела в промежутке между вершинамиустанавливается значение, получаемое в результате линейной интерполяции между значениями ввершинах.mediump — это спецификатор точности (наряду с highp и lowp), он определяет качествовычислений и размер при хранении величины.
Для большей точности будут использованы болееточные типы данных, но скорость вычислений может быть меньше.Кроме того, каждый шейдер должен иметь (ничего не возвращающую) функцию main() безкаких-либо параметров.Цель шейдера фрагментов, напомним, — определить цвет каждого пиксела.precision mediump float;varying vec2 v_texCoord;uniform sampler2D u_texture;void main(){gl_FragColor =}texture2D(u_texture, v_texCoord);Всё, что шейдер вершин передаёт(v_texCoord). Шейдер фрагментовu_texture.
Встроенная переменнаяпиксела: берётся цвет из u_textureна выход, должно быть определено здесь как входтоже может иметь uniform-переменные, здесь этоgl_FragColor заполняется результирующим цветомс использованием координаты v_texCoord.Высокоуровневые shading-языки появились в 2004 году: GLSL (в рамках OpenGL), Cg от nVidia, HLSLот Microsoft. В 2006 был введён так называемый geometry shader, а все три шейдера былипривязаны к одному и тому же набору инструкций. Появилась так называемая Unified ShaderArchitecture.С этого момента GPU становится не только параллельным сопроцессором для CPU в графическихпрограммах, но и параллельным процессором общего назначения.
Это привело к появлению неграфических языков (CUDA, OpenCL), позволяющих эффективно использовать параллельность ивычислительную мощь современных GPU.42Собственно, об этом и идёт речь в рамках этого краткого спецкурса: практически всеустройства с процессорами общего назначения (CPU) сейчас имеют также и графическиепроцессоры (GPU), зачастую заметно превосходящие по вычислительным возможностямосновные процессоры. Поэтому важно знать, какие средства имеются в нашем распоряжении,и каким образом мы могли бы использовать эти новые возможности.Если необходимо узнать, с какой версией OpenGL и GLSL мы имеем дело, можно использоватьпростую (но полезную) программу GetVerGLSL.cpp; для её построения в свойства проектаследуетдобавитьпутьпоисказаголовочныхфайловвNVIDIACUDASDK($(NVSDKCOMPUTE_ROOT)\C\common\inc).Длязапускапрограммепонадобятсядинамические библиотеки OpenGL32.dll и glut32.dll.OpenGL в браузере — WebGLГоворя об OpenGL, нельзя не сказать, что повсеместное распространение этой библиотеки иподдержка её подавляющим числом графических карт закономерно привели к появлению новыхвозможностей в интернет-браузерах — как стационарных, так и мобильных устройств.WebGL — это программный интерфейс для доступа к графическому оборудованию (т.е.
GPU) врамках браузера, причём без установки каких-либо дополнительных расширений. Основанный наOpenGL ES 2.0 и HTML5, он позволяет программисту определить объекты и операции длясоздания высококачественных графических изображений, в частности цветных изображенийтрёхмерных объектов.Поддерживает браузер WebGL или нет, можно узнать с помощью специальных страниц в Сети(например, http://get.webgl.org/ — это самая авторитетная, от создателей). Можно также(используя JavaScript) создать простой HTML-документ для этой цели (см. самодостаточный файлTest_WebGL.html). Иногда браузер может поддерживать WebGL, но эта поддержка — невключена. Это связано с тем, что считается, будто реализации WebGL могут быть подверженыуязвимостям для вредоносного кода (по этой причине Internet Explorer от Microsoft пока неподдерживает WebGL).
Однако на современном телефоне такая поддержка часто есть и включенапо умолчанию.Примеры использования WebGL для отображения графики и анимации в браузере есть в файлахWebGL-DrawCheckerboard.html,WebGL-AnimatedStar.html. Если заглянуть висходный текст этих HTML-документов, мы легко обнаружим там "старых знакомых": шейдерывершин и шейдеры фрагментов, а также JavaScript-код, сильно напоминающий программу наOpenGL обилием функций с уже привычными именами...В заключение — интересная ссылка на демонстрации WebGL:https://www.khronos.org/webgl/wiki/Demo_Repository4310Вспомогательные средства при работе с CUDAи смежными библиотекамиПоскольку типы данных, употребляемые в современных программах, имеют тенденцию кусложнению, ясно, насколько важно в процессе отладки ёмко и информативно отображатьтекущие значения "сложноогранизованных" величин.
К счастью, используемая нами средаразработки программ Visual Studio позволяет "подстроить" отображение таких величинжелательным образом.Визуализаторы — это компоненты пользовательского интерфейса отладчика среды Visual Studio.Они создают диалоги или другие интерфейсные единицы — чтобы отобразить переменную илиобъект в присущем этому типу данных стиле. Visual Studio использует несколько стандартныхвизуализаторов: для текста, для HTML, для XML и другие, а также позволяет создаватьдополнительные визуализаторы.
Самое приятное для "обычного" пользователя — это то, что онможет повлиять на то, как показываются величины, используемые в программе, при отладке: втултипах и Watch-окошках.Visual Studio 2005, 2008, 2010Изменение представления различных величин в отладчике возможно путём модификации файлаautoexp.dat, причём такая возможность имеется, начиная с версии Visual Studio 2005 и далее.Этот файл находится (при установке по умолчанию) в таких каталогах:VS 2008C:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\DebuggerVS 2010C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\Debuggerили в более общем виде — %VSINSTALLDIR%\Common7\Packages\Debugger, хотя самапеременная окружения VSINSTALLDIR (или аналогичная) может и отсутствовать.Форматирующие правила располагаются в файле autoexp.dat в секции [Visualizer],куда можно добавить также описание своих собственных или других необходимых для работытипов.
Всего в этом файле имеются три секции: [AutoExpand], [Visualizer],[hresult], однако нас пока более всего интересует именно секция [Visualizer].Размещать свои визуализаторы надо, помня о способе поиска визуализатора отладчиком: онобнаруживает первый подходящий по типу визуализатор из файла.