Programmable Shaders Dr. Scott Schaefer
Graphics Cards Performance Nvidia Geforce 6800 GTX1 6.4 billion pixels/sec Nvidia Geforce 7900 GTX2 15.6 billion pixels/sec Xbox 3603 16 billion pixels/sec (4X AA) Nvidia Geforce 8800 GTX4 36.8 billion pixels/sec Nvidia Geforce GTX 2955 92.2 billion pixels/sec 1: http://www.nvidia.com/page/geforce_6800.html 2: http://www.nvidia.com/page/geforce_7900.html 3: http://news.com.com/Xbox+specs+revealed/2100-1043_3-5705372.html 4: http://www.nvidia.com/page/geforce_8800.html 5: http://www.nvidia.com/object/geforce_gtx_295.html
Parallel Processing Power Nvidia Geforce Titan Z 5760 programmable processors 876 MHz each 672 GB/s memory bandwidth 12 GB memory http://www.geforce.com/hardware/desktop-gpus/geforce-gtx-titan-z/specifications
Parallel Processing Power AMD’s Radeon R9 295X2 5632 processors, 11.5 TFLOPS IBM’s ASCI White 8192 cores, 12.2 TFLOPS Fastest Computer in the World 2001
Graphics Pipeline Vertices
Transformation/Lighting Graphics Pipeline Vertices Vertex Transformation/Lighting
Transformation/Lighting Graphics Pipeline Vertices Vertex Transformation/Lighting Transformed Vertices
Transformation/Lighting Viewport Transformation Graphics Pipeline Vertices Vertex Transformation/Lighting Transformed Vertices Viewport Transformation
Transformation/Lighting Viewport Transformation Graphics Pipeline Vertices Vertex Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup
Transformation/Lighting Viewport Transformation Graphics Pipeline Vertices Vertex Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup Backface Culling
Transformation/Lighting Viewport Transformation Graphics Pipeline Vertices Vertex Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup Backface Culling Clipping
Graphics Pipeline Vertices Vertex Index Stream Transformed Vertices Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup Backface Culling Clipping Interpolation/Rasterization
Graphics Pipeline Vertices Vertex Index Stream Transformed Vertices Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup Backface Culling Clipping Interpolation/Rasterization Pixel Location/Color/Depth
Graphics Pipeline Vertices Vertex Index Stream Transformed Vertices Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup Backface Culling Clipping Interpolation/Rasterization Pixel Location/Color/Depth Visibility Determination
Graphics Pipeline Vertices Vertex Index Stream Transformed Vertices Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup Backface Culling Clipping Interpolation/Rasterization Pixel Location/Color/Depth Visibility Determination Frame Buffer
Programmable Graphics Pipeline Vertices Vertex Shader Vertex Index Stream Transformed Vertices/ Normals/Texture coords/… Viewport Transformation Triangle Setup Backface Culling Clipping Interpolated Vertex Data Interpolation/Rasterization Pixel Shader Pixel Location Visibility Determination Color/Depth Frame Buffer
Shader Programming Many different languages Assembly OpenGL Shading Language Nvidia’s CG Microsoft’s HLSL Different capabilities based on shader model Register count Instructions Maximum number of instructions
Vertex Shaders Input: anything associated with vertices Position, normal, texture coordinates, etc… Output: transformed vertices MUST output position Can produce color, normal, texture coordinates, etc…
Vertex Shaders // vertex shader output structure struct VS_OUTPUT { float4 Pos : POSITION; };
Vertex Shaders VS_OUTPUT VS( float3 InPos : POSITION // Vertex position in model space ) { VS_OUTPUT Out = (VS_OUTPUT)0; // transform the position float3 transformedPos = mul(float4(InPos, 1), (float4x3)World); Out.Pos = mul(float4(transformedPos,1), ViewProjection); return Out; }
Pixel Shaders Input: Vertex data produced from vertex shader Output: MUST output color Can output depth as well Cannot change location of pixel on screen
Pixel Shaders float4 PS ( VS_OUTPUT In ) : COLOR { // may perform texture lookup, depth effects, fog, etc… return float4 ( 1, 1, 1, 1 ); }
Gouraud Shading Example // vertex shader output structure struct VS_OUTPUT { float4 Pos : POSITION; float4 Color : COLOR; };
Gouraud Shading Example VS_OUTPUT VS( float3 InPos : POSITION, // Vertex position in model space float3 InNormal : NORMAL // Vertex normal in model space ) { VS_OUTPUT Out = (VS_OUTPUT)0; // transform the position and normal float3 transformedPos = mul(float4(InPos, 1), (float4x3)World); Out.Pos = mul(float4(transformedPos,1), ViewProjection); float3 transNormal = mul(InNormal, (float3x3)World); // normal (view space) Out.Color = float4 ( calcColor ( normalize ( lightPos – transformedPos ), transNormal, normalize ( eyePos – transformedPos ) ), 1 ); return Out; }
Gouraud Shading Example float3 calcColor ( float3 lightVec, float3 normal, float3 eyeToVertex ) { float3 color = 0; color += lightColor * MaterialAmbient; color += lightColor * MaterialDiffuse * max ( 0, dot ( normal, lightVec ) ); float3 R = normalize ( reflect ( lightVec, normal ) ); color += lightColor * MaterialSpecular * pow ( max ( 0, dot ( R, eyeToVertex ) ), MaterialSpecularPower ); return color; }
Gouraud Shading Example float4 PS ( VS_OUTPUT In ) : COLOR { return In.Color; }
Phong Shading Example // vertex shader output structure struct VS_OUTPUT { float4 Pos : POSITION; float3 Normal : TEXCOORD0; float3 TransformedPos : TEXCOORD1; };
Phong Shading Example VS_OUTPUT VS( float3 InPos : POSITION, // Vertex position in model space float3 InNormal : NORMAL // Vertex normal in model space ) { VS_OUTPUT Out = (VS_OUTPUT)0; // transform the position and normal Out.TransformedPos = mul(float4(InPos, 1), (float4x3)World); Out.Pos = mul(float4(Out.TransformedPos,1), ViewProjection); Out.Normal = mul(InNormal, (float3x3)World); // normal (view space) return Out; }
Phong Shading Example float4 PS ( VS_OUTPUT In ) : COLOR { // vector from vertex towards eye float3 EyeToVertex = normalize ( In.TransformedPos - EyePos ); float3 normal = normalize ( In.Normal ); float4 color = calcColor ( normalize ( lightPos – In.TransformedPos ), normal, EyeToVertex ); return color; }
General Purpose GPU Programming Originally success was limited because problems had to be crammed into graphics pipeline General purpose computation now available Nvidia’s CUDA DirectX Compute OpenCL