GPU vs. CPU NV47 R580 302 млн. транзисторов 380 млн. транзисторов Тактовая частота 550Mhz Тактовая частота 650Mhz 1GB 850x2 MHz памяти 1GB 775x2 MHz памяти Тактовая частота 3.46Ghz 367 млн. транзисторов (dual core) Intel Pentium XE 955 GPU vs. CPU (3 года назад) NV30 R300 120 млн. транзисторов 107 млн. транзисторов Тактовая частота 500Mhz Тактовая частота 325Mhz 128MB 500MHz памяти 128MB 310MHz памяти Тактовая частота 1.6Ghz – 3.06Ghz 42 млн. Транзисторов (core) Полигональное представление объектов Объект задан набором вершин, которые объединены в плоские грани, чаще всего – треугольные. Для каждой вершины заданы: Координаты вершины Нормаль Координаты текстуры И много чего еще ... Общая архитектура системы (GeForce 6800 Ultra) Обращение к атрибутам вершины по индексу CPU Удобно в циклах 6.4 GB/s CPU RAM 6.4 GB/s Chipset 8 GB/s GPU 35 GB/s GPU RAM По материалам книги GPU Gems 2 Классический графический конвейер float4x4 modelview,projection; float4 lights[8]; float4 diffuse,specular,ambient; float4 position; float3 normal; float2 tex; x,y,z,w,… T&L x,y,z,u0,v0, u1,v1,… Rasterization x,y,z,RGBA Pixel Ops GLenum GLenum GLenum GLenum GLenum env_mode0; GLenum env_mode1; Texture2D tex0; Texture2D tex1; blend_mode; depth_func; alpha_func’ stencil_func,stencil_op; Программируемый графический конвейер … float4 float4 float4 float3 … float4x4 m0,m1,m2,…mN; float4 v0,v1,…,vM; position (attr0) attr1; attr2; attr3; x,y,z,w,… T&L x,y,z,w, c0,c1, c2,c3,… Rasterization x,y,z,RGBA Pixel Ops GLenum GLenum GLenum GLenum … Texture2D tex0; Texture2D tex1; … blend_mode; depth_func; alpha_func’ stencil_func,stencil_op; Вершинная программа (шейдер) Вершинная программа - программа, на вход которой поступают однородные координаты x,y,z и w вершины и некоторый набор дополнительных атрибутов attr1,attr2,.., attrK. Результатом работы вершинной программы являются однородные координаты x’,y’,z’,w’ и некоторый набор значений c0,c1,…,cN. dp4 dp4 dp4 dp4 mov mov x, y , z , attr1 , attr2 ,..., attrK T&L r0.x, v0, r0.y, v0, r0.z, v0, r0.w, v0, oD0, c[4] oPos, r0 m0[0] m0[1] m0[2] m0[3] ; Output color ; Output vertex x' , y ' , z ' , w' , c0 , c1 ,..., cN , w' x' w' , w' y ' w' , w' z ' w'. Пиксельная программа (шейдер) Пиксельная программа (пиксельный шейдер, fragment program) программа, на вход которой поступают координаты x’,y’,z’ и некоторый набор интерполированных по примитиву значений c0,c1,…,cN для обрабатываемого пиксела. Результатом работы пиксельной программы является цвет в формате RGBA и, возможно, измененная координата z. c0, c1, c2,… c0, c1, c2,… c0, c1, c2,… x, y , z , c0 , c1 ,..., c N 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, Rasterization RGBA Язык описания шейдеров Язык описания шейдеров определяет допустимый набор передаваемых параметров (сколько атрибутов может быть у вершины, сколько величин может интерполироваться вдоль примитива) и набор доступных операций для некоторого абстрактного графического процессора 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 Система 6 вершинных процессоров Блок отсечения и подготовки примитивов Rasterization & Z-Cull 16 фрагментных процессоров 16 блоков пиксельных операций 4 memory partitions Кэш текстур По материалам книги GPU Gems 2 Возможности вершинных программ 3.0 Instancing Один поток вершин может порождать несколько объектов 32 временных регистра float4 Инструкции динамического ветвления Условные переходы и циклы Возможность обращения к текстурам Фактически, доступ к массивам float4 512 статических инструкций 65536 динамических инструкций Возможности фрагментных программ 3.0 Instancing Один поток вершин может порождать несколько объектов Несколько render target Результаты могут быть записаны в 4 float4 Инструкции динамического ветвления Условные переходы и циклы Обращение к атрибутам вершины по индексу Удобно в циклах Модель begin/end void glMatrixMode(…); void glLoadIdentity(); void glMultMatrixd(…); void void void void void glBegin(GLenum type); glVertex(…); glNormal(…); glColor(…); glEnd(); T&L Rasterization Pixel Ops void glDepthFunc(…); void glBlendFunc(…); void glStencilOp(…); void glTexture2d(…); void glTexEnv(…); void glPolygonMode(…); Формирование граней из вершин GL_TRIANGLES: 3 2 GL_QUADS: 4 3 1 0 5 7 5 1 GL_POLYGON: 1 2 0 3 0 4 7 6 5 2 4 6 Уменьшение количества вершин GL_TRIANGLE_FAN: 3n vs. 1+n, n>1 3 2 GL_TRIANGLE_STRIP: 3n vs. 2+n 4 0 GL_QUAD_STRIP: 4n vs. 2+2n 1 5 7 5 1 0 3 0 2 4 3 5 6 7 1 2 4 6 Однородные координаты P {x, y, z, w; w 0} P3 {x / w, y / w, z / w} Общее аффинное преобразование сводится к умножению на матрицу 1 0 T ( x, y , z ) 0 0 x 1 0 y 0 1 z 0 0 1 0 0 Проецирование также сводится к умножению на матрицу Преобразование координат x0 y V0 0 z0 w0 Ve MV0 xe y Ve e ze we Vc PVe xc y Vc c zc wc Viewport xd [1,1] yd [1,1] z d [1,1] Отсечение: Vi={Ps,RGBA,…} xd xc / wc yd yc / wc z d zc / wc wc xc wc wc yc wc wc zc wc Уравнение освещенности по Фонгу I am al d m dl (n l ) sm sl (e r ) hs Фоновое освещение не имеет источника и зависит только от сцены При диффузном освещении свет от источника равномерно рассеивается во всех направлениях. При зеркальном освещении свет от источника отражается от повехности.в одном направлении. Зеркальная освещенность дополнительно зависит от положения наблюдателя.. l P’ n r e (a, b), (a, b) 0 ( a b) ( a , b) 0 0, r reflect (l , n) Модели Блинна и Шлика Вычисление отраженного вектора – трудоемкая операция (Блинн) I am al d m dl (n l ) sm sl (n h) l e h l e hs l P’ n r e Возведение в степень также работает не очень быстро... (Шлик) D ( n h) ~ , D ( n h) hs Dhs D hs Уравнение освещенности OpenGL n 1 c em am as atti spoti (am ai d m d i (n l ) sm si (n h) hm ) i 0 1 atti , 2 k c ,i k l , i r k q ,i r P’ 1, i , spoti 0, (vi ,l ) cos( i ), (vi ,l ), (vi ,l ) cos( i ). -l v i i spoti – коэффициент направленности atti – коэффициент затухания as– фоновое освещение ai ,si ,di – свойства i-го источника освещения еm ,am , sm , dm , hm – свойства материала Интерполяция цвета • Вычислить цвет (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 На поверхности задается система координат b b [n, t ] n t R ' n' x G ' n' y B' n' z t 'x t'y t 'z b' x R b' y G b' z B n x ' nx n ' ( M 1 )T n 3 x3 y y nz ' nz Bump-mapping На поверхности задается система координат b b [n, t ] n t Компоненты текстуры RGB задают нормаль в связанной с поверхностью системе координат Для расчета освещения направления на источник освещения и направление на наблюдателя преобразуются в связанную с поверхностью систему координат Для расчета отражения вектор нормали преобразуется в систему координат наблюдателя. Затем рассчитывается отражения (sphere map или cube map) Литература Боресков А.В. Расширения OpenGL. СПб.: БХВ-Петербург, 2005 Дж. Рост OpenGL. Трехмерная графика и язык программирования шейдеров - СПб.: Питер, 2005