Программирование графических процессоров Безгодов Алексей Алексеевич НИИ НКТ, СПбГУ ИТМО
2 Принципы 3D-графики
33 Стадии графического конвейера
4 Шейдеры: назначение
5
6 Текстуры и внеэкранные поверхности Типы: –1D, 2D, 3D- позиция в «массиве» –Cube- направление на одну из граней куба Форматы текстур: –Компоненты: Lum, RGB, RGBA и др. –Формат компонент: Byte, Int16, Float16, Float32 Адресация: Wrap, Clamp, Border, Mirror Фильтрация: Nearest, Linear, Mipmap, Anisotropic
7 Языки программирования шейдеров Низкоуровневые (asm) Высокоуровневые: –HLSL- Direct3D 9 и 10 –Cg- OpenGL, Direct3D –GLSL- OpenGL
8 Данные (HLSL, Cg) Скалярные: float, half, int, bool Векторные: float2, float3, float4 Матричные: float2x2 … float4x4 Текстурные: sampler2D, sampler3D etc Способы хранения: uniform, static etc Семантика данных: COLOR, NORMAL, POSITION etc
9 Основные операции Математические: –+ - * / –mad(), dot(), cross(), reflect() –sin(), cos(), pow() –saturate(), clamp(), step() –floor(), ceil() Текстурные (обращение к памяти): –tex2D, tex3D, texCUBE, tex2Dlod, tex2Dgrad, tex2Dproj …
10 Выражения float4 a; float4 b(1,2,3,4); float4 c = 1; // = float4(1,1,1,1); a = b; a.x = b.y; a.xyzw = b.wzxy;// можно менять местами // компоненты for, if, while, do - идентичны языку С, но есть исключения
11 Функции float4 DoSomething( in float3 a, out float2 b, inout float4 c) { b.xy = a.xz; c.xyz = a.zzy; c.w = dot(c.xyz, a.xyz); return float4(1,2,3,4); }
12 Шейдерные константы uniform float4x4 world_matrix : register (c1); uniform float4 color_mul : register (c5); uniform sampler input_data : register (s1); PS_OUT PSMain(in VS_OUT input) { PS_OUT output; output.color = tex2D(input_data, input.tex0.xy); output.color *= color_mul; return out; }
13 Создание шейдеров (входные и выходные данные) Vertex Shader struct VS_IN { float3 pos : POSITION; float2 tex : TEXCOORD0; float4 clr : COLOR0; float3 norm : NORMAL; }; struct VS_OUT { float4 pos : POSITION; float2 tex : TEXCOORD0; float4 clr : COLOR0; }; POSITION – используется растеризатором Pixel Shader struct PS_IN { //float4 pos : POSITION; float2 tex : TEXCOORD0; float4 clr : COLOR0; }; struct PS_OUT { float4 color : COLOR0; float depth : DEPTH; };
14 Создание шейдеров (точки входа) VS: VS_OUT VSMain(VS_IN input) { VS_OUT output; //… return output; } PS: PS_OUT PSMain(VS_OUT input) { PS_OUT output; //… return out; }
15 Текстурирование x x, y tex2D( sampler, float2(x, y) ); tex1D( sampler, float(x) );tex3D( sampler, float3(x, y, z) ); x, y, z
16 Выполнение шейдеров INPUT ASSEMBLER POSITION COLOR NORMAL TEXCOORD New POSITION New COLOR New TEXCOORD RAZTERIZER Geometry Shader VSMain Shader Consts
17 Выполнение шейдеров VS_OUT #1 VS_OUT #3 VS_OUT #2 PSMain PS_IN RASTERIZER Shader Consts
18 Схема использования шейдеров для вычислительных задач
19 Практические задания Обработка изображений –demo_imgproc.fx Простые приемы научной визуализации –demo_sci.fx Сложные приемы научной визуализации –demo_mri.fx
20 Обработка изображений (demo_imgproc.fx)
21 Простые приемы научной визуализации (demo_sci.fx) float value = tex3D(data, float3(x,y,z)).r; // … return tex2D(pal, float2(value, 0)); ddx(), ddy() if((s0 h) || (s1 h) || (s2 h) || (s3 h)) { sample = 1; } else { sample = 0; }
22 Сложные приемы научной визуализации (demo_mri.fx)