230 likes | 368 Views
Программирование графических процессоров. Безгодов Алексей Алексеевич НИИ НКТ, СПбГУ ИТМО. Принципы 3D -графики. Стадии графического конвейера. 3. Шейдеры: назначение. Шейдеры: назначение. Текстуры и внеэкранные поверхности. Типы: 1D, 2D, 3D - позиция в «массиве»
E N D
Программирование графических процессоров Безгодов Алексей Алексеевич НИИ НКТ, СПбГУ ИТМО
Текстуры и внеэкранные поверхности • Типы: • 1D, 2D, 3D - позиция в «массиве» • Cube - направление на одну из граней куба • Форматытекстур: • Компоненты: Lum, RGB, RGBA и др. • Формат компонент:Byte, Int16, Float16, Float32 • Адресация:Wrap, Clamp, Border, Mirror • Фильтрация:Nearest, Linear, Mipmap, Anisotropic
Языки программирования шейдеров • Низкоуровневые (asm) • Высокоуровневые: • HLSL - Direct3D 9 и 10 • Cg - OpenGL, Direct3D • GLSL - OpenGL
Данные (HLSL, Cg) • Скалярные:float, half, int, bool • Векторные:float2, float3, float4 • Матричные:float2x2 … float4x4 • Текстурные: sampler2D, sampler3D etc • Способы хранения: uniform, static etc • Семантикаданных: COLOR, NORMAL, POSITION etc
Основные операции • Математические: • + - * / • mad(), dot(), cross(), reflect() • sin(), cos(), pow() • saturate(), clamp(), step() • floor(), ceil() • Текстурные (обращение к памяти): • tex2D, tex3D, texCUBE, tex2Dlod, tex2Dgrad, tex2Dproj …
Выражения 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 - идентичны языку С, но есть исключения
x Текстурирование tex1D( sampler, float(x) ); tex3D( sampler, float3(x, y, z) ); x, y, z tex2D( sampler, float2(x, y) ); x, y
Функции • float4 DoSomething(infloat3 a, outfloat2 b, inoutfloat4 c) { b.xy = a.xz; c.xyz = a.zzy; c.w = dot(c.xyz, a.xyz); return float4(1,2,3,4);}
Шейдерные константы uniformfloat4x4 world_matrix : register (c1); uniformfloat4 color_mul : register (c5); uniformsampler 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; }
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;}; Создание шейдеров(входные и выходные данные)
Создание шейдеров(точки входа) • VS: VS_OUT VSMain(VS_IN input) { VS_OUT output;//…return output;} • PS:PS_OUT PSMain(VS_OUT input) { PS_OUT output;//…return out;}
Выполнение шейдеров Shader Consts VSMain INPUTASSEMBLER RASTERIZERGeometry Shader POSITION COLOR NORMAL TEXCOORD New POSITION NewCOLOR New TEXCOORD VSMain VSMain
Выполнение шейдеров Shader Consts VS_OUT #3 PS_IN PSMain RASTERIZER VS_OUT #1 VS_OUT #2
Схема использования шейдеровдля вычислительных задач
Обработка изображений demo_imgproc.fx Простые приемы научной визуализации demo_sci.fx Сложные приемы научной визуализации demo_mri.fx Практические задания 19
float value = tex3D(data, float3(x,y,z)).r; // … returntex2D(pal, float2(value, 0)); ddx(), ddy() if((s0<h && s1>h) || (s1<h && s0>h) || (s2<h && s3>h) || (s3<h && s2>h)) { sample = 1; } else { sample = 0; } Простые приемы научной визуализации (demo_sci.fx)
Сложные приемы научной визуализации (demo_mri.fx)