GPU vs. CPU 302 млн. транзисторов Тактовая частота 550Mhz 1GB 850x2 MHz памяти 380 млн. транзисторов Тактовая частота 650Mhz 1GB 775x2 MHz памяти Тактовая частота 3.46Ghz 367 млн. транзисторов (dual core) NV47 R580 Intel Pentium XE 955
GPU vs. CPU (3 года назад) 120 млн. транзисторов Тактовая частота 500Mhz 128MB 500MHz памяти 107 млн. транзисторов Тактовая частота 325Mhz 128MB 310MHz памяти Тактовая частота 1.6Ghz – 3.06Ghz 42 млн. Транзисторов (core) NV30 R300
Полигональное представление объектов Для каждой вершины заданы: Координаты вершины Нормаль Координаты текстуры И много чего еще... Объект задан набором вершин, которые объединены в плоские грани, чаще всего – треугольные.
Общая архитектура системы (GeForce 6800 Ultra) CPU Chipset GPU GPU RAM CPU RAM 6.4 GB/s 8 GB/s6.4 GB/s 35 GB/s По материалам книги GPU Gems 2 Обращение к атрибутам вершины по индексу Удобно в циклах
Классический графический конвейер float4x4 modelview,projection; float4 lights[8]; float4 diffuse,specular,ambient; float4 position; float3 normal; float2 tex; T&L Rasterization Pixel Ops GLenum env_mode0; GLenum env_mode1; Texture2D tex0; Texture2D tex1; GLenum blend_mode; GLenum depth_func; GLenum alpha_func GLenum stencil_func,stencil_op; x,y,z,w,…x,y,z,u0,v0, u1,v1,… x,y,z,RGBA
Программируемый графический конвейер float4x4 m0,m1,m2,…mN; float4 v0,v1,…,vM; … float4 position (attr0) float4 attr1; float4 attr2; float3 attr3; … T&L Rasterization Pixel Ops … Texture2D tex0; Texture2D tex1; … GLenum blend_mode; GLenum depth_func; GLenum alpha_func GLenum stencil_func,stencil_op; x,y,z,w,…x,y,z,w, c0,c1, c2,c3,… x,y,z,RGBA
Вершинная программа (шейдер) T&L dp4 r0.x, v0, m0[0] dp4 r0.y, v0, m0[1] dp4 r0.z, v0, m0[2] dp4 r0.w, v0, m0[3] mov oD0, c[4] ; Output color mov oPos, r0 ; Output vertex Вершинная программа - программа, на вход которой поступают однородные координаты x,y,z и w вершины и некоторый набор дополнительных атрибутов attr 1,attr 2,.., attr K. Результатом работы вершинной программы являются однородные координаты x,y,z,w и некоторый набор значений c 0,c 1,…,c N.
Пиксельная программа (шейдер) Пиксельная программа (пиксельный шейдер, fragment program) - программа, на вход которой поступают координаты x,y,z и некоторый набор интерполированных по примитиву значений c 0,c 1,…,c N для обрабатываемого пиксела. Результатом работы пиксельной программы является цвет в формате RGBA и, возможно, измененная координата z. c 0, c 1, c 2,… Rasterization ps.1.0 // DX8 Version. tex t0 // n-map. texm3x3pad t1, t0_bx2 texm3x3pad t2, t0_bx2 v0_bx2 texm3x3tex t3, t0_bx2 dp3_sat r0, t3_bx2, c 0, c 1, c 2,…
Язык описания шейдеров Язык описания шейдеров определяет допустимый набор передаваемых параметров (сколько атрибутов может быть у вершины, сколько величин может интерполироваться вдоль примитива) и набор доступных операций для некоторого абстрактного графического процессора GL_ARB_vertex_program GL_ARB_fragment_program GL_NV_texture_shader Direct3D Pixel Shaders 1.0, 1.1 (DirectX 8), 2.0 (DirectX 9) Direct3D Vertex Shaders Nvidia Cg
Архитектура GeForce 6800 Ultra Система По материалам книги GPU Gems 2 6 вершинных процессоров Блок отсечения и подготовки примитивов Rasterization & Z-Cull 16 фрагментных процессоров 16 блоков пиксельных операций 4 memory partitions Кэш текстур
Возможности вершинных программ 3.0 Instancing Один поток вершин может порождать несколько объектов 32 временных регистра float4 Инструкции динамического ветвления Условные переходы и циклы Возможность обращения к текстурам Фактически, доступ к массивам float4 512 статических инструкций динамических инструкций
Возможности фрагментных программ 3.0 Instancing Один поток вершин может порождать несколько объектов Несколько render target Результаты могут быть записаны в 4 float4 Инструкции динамического ветвления Условные переходы и циклы Обращение к атрибутам вершины по индексу Удобно в циклах
Модель begin/end void glMatrixMode(…); void glLoadIdentity(); void glMultMatrixd(…); void glBegin(GLenum type); void glVertex(…); void glNormal(…); void glColor(…); void glEnd(); T&L Rasterization Pixel Ops void glTexture2d(…); void glTexEnv(…); void glPolygonMode(…); void glDepthFunc(…); void glBlendFunc(…); void glStencilOp(…);
Формирование граней из вершин GL_TRIANGLES: GL_QUADS: GL_POLYGON:
Уменьшение количества вершин GL_TRIANGLE_FAN: 3n vs. 1+n, n> GL_TRIANGLE_STRIP: 3n vs. 2+n GL_QUAD_STRIP: 4n vs. 2+2n
Однородные координаты Общее аффинное преобразование сводится к умножению на матрицу Проецирование также сводится к умножению на матрицу
Преобразование координат Отсечение: Viewport V i ={P s,RGBA,…}
Уравнение освещенности по Фонгу l n r P e Фоновое освещение не имеет источника и зависит только от сцены При диффузном освещении свет от источника равномерно рассеивается во всех направлениях. При зеркальном освещении свет от источника отражается от повехности.в одном направлении. Зеркальная освещенность дополнительно зависит от положения наблюдателя..
Модели Блинна и Шлика Вычисление отраженного вектора – трудоемкая операция (Блинн) Возведение в степень также работает не очень быстро... (Шлик) l n r P e
Уравнение освещенности OpenGL е m,a m, s m, d m, h m – свойства материала a i,s i,d i – свойства i -го источника освещения a s – фоновое освещение att i – коэффициент затухания spot i – коэффициент направленности -l vivi P
Интерполяция цвета Вычислить цвет (RGB) в каждой вершине. Вычислить цвет в точках P1 и P2: s = ||P1 - B|| / ||A - B|| C(P1) = s(C(A)) - (1-s)(C(B)) Вычислить цвет в т. Р: s = ||P - P2|| / ||P1 - P2|| C(P) = s(C(P1))-(1-s)(C(P2))
Недостатки закраски по Гуро
Интерполяция нормали Вычислить нормали (RGB) в каждой вершине. Вычислить нормаль в точках P1 и P2: s = ||P1 - B|| / ||A - B|| N(P1) = s(N(A)) + (1-s)(N(B)) Вычислить нормаль в т. Р: s = ||P - P2|| / ||P1 - P2|| N(P) = s(т(P1))-(1-s)(N(P2)) Вычислить цвет в точке Р.
Bump-mapping На поверхности задается система координат n t b
Bump-mapping На поверхности задается система координат Компоненты текстуры RGB задают нормаль в связанной с поверхностью системе координат Для расчета освещения направления на источник освещения и направление на наблюдателя преобразуются в связанную с поверхностью систему координат n t b Для расчета отражения вектор нормали преобразуется в систему координат наблюдателя. Затем рассчитывается отражения (sphere map или cube map)
Литература Боресков А.В. Расширения OpenGL. - СПб.: БХВ-Петербург, 2005 Дж. Рост OpenGL. Трехмерная графика и язык программирования шейдеров - СПб.: Питер, 2005