300 likes | 319 Views
Explore the evolution and capabilities of high-performance graphics cards like Nvidia GeForce and AMD Radeon, alongside detailed insights into shader programming with various languages and pipeline stages.
E N D
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 GTX 1080 Ti • 3584 programmable processors • 1582 MHz each • 484 GB/s memory bandwidth • 11 GB memory https://www.nvidia.com/en-us/geforce/products/10series/geforce-gtx-1080-ti/
Parallel Processing Power AMD’s Radeon RX Vega 64 4096 processors, 27.5 TFLOPS The Earth Simulator 5120 processors, 35.86 TFLOPS 6.4 megawatts of power Fastest Computer in the World 2002
Graphics Pipeline Vertices
Graphics Pipeline Vertices Vertex Transformation/Lighting
Graphics Pipeline Vertices Vertex Transformation/Lighting Transformed Vertices
Graphics Pipeline Vertices Vertex Transformation/Lighting Transformed Vertices Viewport Transformation
Graphics Pipeline Vertices Vertex Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup
Graphics Pipeline Vertices Vertex Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup Backface Culling
Graphics Pipeline Vertices Vertex Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup Backface Culling Clipping
Graphics Pipeline Vertices Vertex Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup Backface Culling Clipping Interpolation/Rasterization
Graphics Pipeline Vertices Vertex Transformation/Lighting Vertex Index Stream Transformed Vertices Viewport Transformation Triangle Setup Backface Culling Clipping Interpolation/Rasterization Pixel Location/Color/Depth
Graphics Pipeline Vertices Vertex 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 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; float4Color : 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