Open GL ES 2.0 An Introduction to the programmable pipeline

Similar documents
Vertex and fragment programs

Introduction to Computer Graphics with WebGL

Image Processing and Computer Graphics. Rendering Pipeline. Matthias Teschner. Computer Science Department University of Freiburg

Recent Advances and Future Trends in Graphics Hardware. Michael Doggett Architect November 23, 2005

CSE 564: Visualization. GPU Programming (First Steps) GPU Generations. Klaus Mueller. Computer Science Department Stony Brook University

The OpenGL ES Shading Language

Shader Model 3.0. Ashu Rege. NVIDIA Developer Technology Group

CS418 GLSL Shader Programming Tutorial (I) Shader Introduction. Presented by : Wei-Wen Feng 3/12/2008

The OpenGL ES Shading Language

Introduction to GPGPU. Tiziano Diamanti

LLVM for OpenGL and other stuff. Chris Lattner Apple Computer

OpenGL Performance Tuning

Monash University Clayton s School of Information Technology CSE3313 Computer Graphics Sample Exam Questions 2007

GPU(Graphics Processing Unit) with a Focus on Nvidia GeForce 6 Series. By: Binesh Tuladhar Clay Smith

GPUs Under the Hood. Prof. Aaron Lanterman School of Electrical and Computer Engineering Georgia Institute of Technology

Computer Graphics Hardware An Overview

OpenGL Shading Language Course. Chapter 5 Appendix. By Jacobo Rodriguez Villar jacobo.rodriguez@typhoonlabs.com

GPU Architecture. Michael Doggett ATI

Optimizing AAA Games for Mobile Platforms

GPGPU Computing. Yong Cao

Midgard GPU Architecture. October 2014

3D Graphics and Cameras

The OpenGL Shading Language

Image Synthesis. Transparency. computer graphics & visualization

Overview Motivation and applications Challenges. Dynamic Volume Computation and Visualization on the GPU. GPU feature requests Conclusions

Writing Applications for the GPU Using the RapidMind Development Platform

Optimizing Unity Games for Mobile Platforms. Angelo Theodorou Software Engineer Unite 2013, 28 th -30 th August

Radeon HD 2900 and Geometry Generation. Michael Doggett

The OpenGL Shading Language

2: Introducing image synthesis. Some orientation how did we get here? Graphics system architecture Overview of OpenGL / GLU / GLUT

The OpenGL R Graphics System: A Specification (Version 3.3 (Core Profile) - March 11, 2010)

How To Teach Computer Graphics

Advanced Visual Effects with Direct3D

INTRODUCTION TO RENDERING TECHNIQUES

Performance Optimization and Debug Tools for mobile games with PlayCanvas

AMD GPU Architecture. OpenCL Tutorial, PPAM Dominik Behr September 13th, 2009

Computer Applications in Textile Engineering. Computer Applications in Textile Engineering

A Crash Course on Programmable Graphics Hardware

Computer Graphics CS 543 Lecture 12 (Part 1) Curves. Prof Emmanuel Agu. Computer Science Dept. Worcester Polytechnic Institute (WPI)

NVPRO-PIPELINE A RESEARCH RENDERING PIPELINE MARKUS TAVENRATH MATAVENRATH@NVIDIA.COM SENIOR DEVELOPER TECHNOLOGY ENGINEER, NVIDIA

Developer Tools. Tim Purcell NVIDIA

The Evolution of Computer Graphics. SVP, Content & Technology, NVIDIA

Introduction to GPU Architecture

Shadows. Shadows. Thanks to: Frédo Durand and Seth Teller MIT. Realism Depth cue

Computer Graphics on Mobile Devices VL SS ECTS

Introduction to Game Programming. Steven Osman

DATA VISUALIZATION OF THE GRAPHICS PIPELINE: TRACKING STATE WITH THE STATEVIEWER

Tutorial 9: Skeletal Animation

A.R.I.S.E. Architectural Real-time Interactive Showing Environment. Supervisor: Scott Chase

Color correction in 3D environments Nicholas Blackhawk

Computer Graphics. Anders Hast

GPU Architecture. An OpenCL Programmer s Introduction. Lee Howes November 3, 2010

NVFX : A NEW SCENE AND MATERIAL EFFECT FRAMEWORK FOR OPENGL AND DIRECTX. TRISTAN LORACH Senior Devtech Engineer SIGGRAPH 2013

Parallel Web Programming

The C Programming Language course syllabus associate level

Dynamic Resolution Rendering

Scan-Line Fill. Scan-Line Algorithm. Sort by scan line Fill each span vertex order generated by vertex list

Web Based 3D Visualization for COMSOL Multiphysics

GPU Shading and Rendering: Introduction & Graphics Hardware

A Pipeline From COLLADA to WebGL for Skeletal Animation

Procedural Shaders: A Feature Animation Perspective

Introduction GPU Hardware GPU Computing Today GPU Computing Example Outlook Summary. GPU Computing. Numerical Simulation - from Models to Software

Modern Graphics Engine Design. Sim Dietrich NVIDIA Corporation

Programmable Graphics Hardware

Silverlight for Windows Embedded Graphics and Rendering Pipeline 1

Real-Time BC6H Compression on GPU. Krzysztof Narkowicz Lead Engine Programmer Flying Wild Hog

C++ INTERVIEW QUESTIONS

Real-Time Realistic Rendering. Michael Doggett Docent Department of Computer Science Lund university

3D Math Overview and 3D Graphics Foundations

Introduction to Computer Graphics

How To Understand The Power Of Unity 3D (Pro) And The Power Behind It (Pro/Pro)

L20: GPU Architecture and Models

Realtime 3D Computer Graphics Virtual Reality

3D Computer Games History and Technology

Lecture Notes, CEng 477

QCD as a Video Game?

Low power GPUs a view from the industry. Edvard Sørgård

Volume Rendering on Mobile Devices. Mika Pesonen

OpenGL & Delphi. Max Kleiner. 1/22

Experiences with 2-D and 3-D Mathematical Plots on the Java Platform

Graphics Cards and Graphics Processing Units. Ben Johnstone Russ Martin November 15, 2011

PART-A Questions. 2. How does an enumerated statement differ from a typedef statement?

Fast Arithmetic Coding (FastAC) Implementations

Interactive Computer Graphics

Press Briefing. GDC, March Neil Trevett Vice President Mobile Ecosystem, NVIDIA President Khronos. Copyright Khronos Group Page 1

Android and OpenGL. Android Smartphone Programming. Matthias Keil. University of Freiburg

How To Use An Amd Graphics Card In Greece And (Amd) With Greege (Greege) With An Amd Greeper 2.2.

2) Write in detail the issues in the design of code generator.

Making natural looking Volumetric Clouds In Blender 2.48a

Introduction to Computer Graphics

Optimization for DirectX9 Graphics. Ashu Rege

Chapter 5 Functions. Introducing Functions

Multichoice Quetions 1. Atributes a. are listed in the second part of the class box b. its time is preceded by a colon. c. its default value is

Transcription:

Open GL ES 2.0 An Introduction to the programmable pipeline Robert J. Simpson Architect, ATI Research. Copyright Khronos Group, 2005 - Page 1

Outline OpenGL ES 2.0 Philosophy The shader model OpenGL ES Shading Language (GLSL ES) Example shaders Compiling s Performance Tips Roadmap for shaders Copyright Khronos Group, 2005 - Page 2

ES 2.0 Philosophy Based on GLSL as used in OpenGL 2.0 - Open standard - Proven on desktop Pure programmable model - Most fixed functionality removed. Not 100% backward compatible with ES1.x - Embedded systems do not have the legacy requirements of the desktop No Software Fallback - Implementations (usually) hardware or nothing - Running graphics routines in software doesn t make sense on embedded platforms Optimized for use in Embedded devices - Aim is to reduce silicon cost - Reduced shader program sizes - Reduced register usage - Reduced numeric precision Copyright Khronos Group, 2005 - Page 3

Copyright Khronos Group, 2005 - Page 4 Existing Fixed Function Pipeline Triangles/Lines/Points API API Processing Primitive Primitive Processing Vertices Transform Transform and Lighting and Lighting Assembly Primitive Primitive Assembly Rasterizer Rasterizer Vertex Buffer Vertex Objects Buffer Objects Environment Texture Texture Environment Colour Colour Sum Sum Fog Fog Alpha Test Alpha Test Stencil Depth Depth Stencil Colour Buffer Colour Blend Buffer Blend Dither Dither Frame Frame Buffer Buffer

Copyright Khronos Group, 2005 - Page 5 ES2.0 Programmable Pipeline Triangles/Lines/Points API API Processing Primitive Primitive Processing Vertices Vertex Vertex Assembly Primitive Primitive Assembly Rasterizer Rasterizer Vertex Buffer Vertex Objects Buffer Objects Fragment Fragment Stencil Depth Depth Stencil Colour Buffer Colour Blend Buffer Blend Dither Dither Frame Frame Buffer Buffer

Copyright Khronos Group, 2005 - Page 6 Programmer s model Attributes Attributes (~8) (~8) Vertex Vertex Uniforms (~96) Uniforms (~96) Vertex Vertex Primitive Assembly Primitive & Assembly & Rasterize Rasterize s s (~8) (~8) Fragment Fragment Uniforms (~16) Uniforms (~16) Fragment Fragment Per-Sample Operations Per-Sample Operations

Copyright Khronos Group, 2005 - Page 7 Vertex Uniforms Uniforms Textures Textures Attribute Attribute 0 0 Attribute Attribute 1 1 Attribute Attribute 2 2 Attribute Attribute 3 3 Attribute Attribute 4 4 Attribute Attribute 5 5 Attribute Attribute 6 6 Attribute Attribute 7 7 Vertex Vertex Temporary variables Temporary variables 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 gl_position gl_position gl_frontfacing gl_frontfacing gl_pointsize gl_pointsize

Copyright Khronos Group, 2005 - Page 8 Fragment Uniforms Uniforms Textures Textures 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 gl_position gl_position gl_frontfacing gl_frontfacing gl_pointposition gl_pointposition Fragment Fragment Temporary variables Temporary variables gl_fragcolor gl_fragcolor gl_position gl_position

GLSL ES Overview C like language Many simplifications - No pointers - No implicit type conversion - Simplified preprocessor Some graphics-specific additions - Built-in vector and matrix types - Built-in functions Similar to desktop GLSL - Removal of most OpenGL fixed function state - Restrictions on shader complexity - Fewer sampler modes - No access to frag depth - Support for mixed precisions - More general invariance mechanism. Copyright Khronos Group, 2005 - Page 9

Copyright Khronos Group, 2005 - Page 10 GLSL ES Preprocessor Comments // /* */ Macros # #define #undef Control #if #ifdef #ifndef #else #elif #endif #error Operators defined Extensions #pragma #extension #version #line

Copyright Khronos Group, 2005 - Page 11 GLSL ES Types Scalar void float int bool Vector - boolean bvec2 bvec3 bvec4 - integer ivec2 ivec3 ivec4 - floating point vec2 vec3 vec4 Matrix mat2 mat3 mat4 Sampler sampler2d Container struct Arrays

GLSL ES Storage Qualifiers GLSL ES Storage Qualifiers const - Local constants within a shader. uniform - Constant shader parameters (light position/direction, texture units, ) - Do not change per vertex. attribute - Per-vertex values (position, normal, ) varying - Generated by vertex shader - Interpolated by the rasterizer to generate per pixel values - Used as inputs to Fragment - e.g. texture coordinates Copyright Khronos Group, 2005 - Page 12

GLSL ES Function Parameter Qualifiers Functions parameters can be used to pass values in or out or both Call by value copy in, copy out semantics. Qualifiers: in (default) out inout Can use const with in. Functions can still return a value - But use a parameter if returning an array e.g. bool f(const in vec2 v, out int a[2]) {...} Copyright Khronos Group, 2005 - Page 13

Copyright Khronos Group, 2005 - Page 14 GLSL ES Precision Qualifiers Rationale - ALU and register resources are scarce. - Many operations require only limited precision Available float precisions - lowp float - mediump float - highp float Available int precisions - lowp int - mediump int - highp int

GLSL ES Precision Qualifiers lowp float - Typically implemented by fixed point sign + 1.8 fixed point. - Range is -2.0 < x < 2.0 - Resolution 1/256 - Use for simple colour blending mediump float - Typically implemented by sign + 5.10 floating point - -16384 < x < 16384 - Resolution 1 part in 1024 - Use for HDR blending, some texture coordinate calculations highp float - Typically implemented by 24 bit float (16 bits of mantissa) - range ± 2 62 - Resolution 1 part in 2 16 - Use of texture coordinate calculation e.g. environment mapping single precision - Not explicit in GLSL but usually available in the vertex shader Copyright Khronos Group, 2005 - Page 15

GLSL ES Precision Qualifiers Can specify per variable or set a default. Per Variable: mediump float x; Set default: precision mediump float; Can change the default: { } precision mediump float; float x; // x is a medium precision float precision lowp float; float y; // y is a low precision float Copyright Khronos Group, 2005 - Page 16

GLSL ES Precision Precision of a sub-expression depends entirely on the operands Evaluated at the highest precision of lowp float x; mediump float y; highp float z = x * y; // * evaluated at // medium precision Literals do not have any defined precision lowp float x; highp float z = x * 2.0 + 1.2; // evaluated at // low precision Some special cases - If no operands have a precision, use outer-level sub-expression: lowp float x = 1.0 / 3.0; // evaluated at // low precision - Use default precision if required bool b = (1.0/3.0 > 0.33); // Must have default // precision defined. Copyright Khronos Group, 2005 - Page 17

GLSL ES Constructors Replaces type casting All named types have constructors available - Includes built-in types, structs - Excludes arrays No implicit conversion: must use constructors Int to Float: int n = 1; float x,y; x = float(n); y = float(2); Concatenation: float x = 1.0,y = 2.0; vec2 v = vec2(x,y); Struct initialization struct S {int a; float b;}; S s = S(2, 3.5); Copyright Khronos Group, 2005 - Page 18

Copyright Khronos Group, 2005 - Page 19 GLSL ES Swizzle operators Use to select a set of components from a vector Can be used in L-values vec2 u,v; v.x = 2.0; float a = v.x; v.xy = u.yx; v = v.xx; v.xx = u; Component sets Use one of: xyzw rgba stpq // Assignment to single component // Component selection // swap components // replicate components // Error Indexing operator vec4 u,v; float x = u[0]; // equivalent to u.x Must use indexing operator for matrices

GLSL ES Features cont. Operators - ++ -- + -! () [] - * / + - - < <= > >= - ==!= - && ^^ -?: - = *= /= += -= Flow control - <expression>? <expression_1> : <expression_2> - if else - for while do - return break continue - discard (fragment shader only) Copyright Khronos Group, 2005 - Page 20

Copyright Khronos Group, 2005 - Page 21 GLSL Built-in in Variables Aim of ES is to reduce the amount of fixed functionality - Ideal would be a totally pure programmable model - But still need some Vertex shader - vec4 gl_position; // Write-only (required) - float gl_pointsize; // Write-only Fragment shader - vec4 gl_fragcoord; // Read-only - bool gl_frontfacing; // Read-only - vec2 gl_pointcoord; // Read-only - float gl_fragcolor; // Write only (required)

Copyright Khronos Group, 2005 - Page 22 GLSL ES Built-in in Functions General - pow, exp2, log2, sqrt, inversesqrt - abs, sign, floor, ceil, fract, mod, min, max, clamp Trig functions - radians, degrees, sin, cos, tan, asin, acos, atan Geometric - length, distance, cross, dot, normalize, faceforward, reflect, refract Interpolations - mix(x,y,alpha) x*( 1.0-alpha) + y*alpha) - step(edge,x) x <= edge? 0.0 : 1.0 - smoothstep(edge0,edge1,x) t = (x-edge0)/(edge1-edge0); t = clamp( t, 0.0, 1.0); return t*t*(3.0-2.0*t); Texture - texture1d, texture2d, texture3d, texturecube - texture1dproj, texture2dproj, texturecubeproj

Copyright Khronos Group, 2005 - Page 23 GLSL ES Built-in in Functions Vector comparison (vecn, ivecn) - bvecn lessthan(vecn, vecn) - bvecn lessthanequal(vecn, vecn) - bvecn greaterthan(vecn, vecn) - bvecn greaterthanequal(vecn, vecn) Vector comparison (vecn, ivecn, bvecn) - bvecn equal(vecn, vecn) - bvecn notequal(vecn, vecn) Vector (bvecn) - bvecn any(bvecn) - bvecn all(bvecn) - bvecn not(bvecn) Matrix - matrixcompmult (matn, matn)

Copyright Khronos Group, 2005 - Page 24 GLSL ES: Invariance GLSL ES: Invariance the problem the problem Consider a simple transform in the vertex shader: = w z y x p o n m l k j i h g f e d c b a w z y x x = ax + by + cz + dw But how is this calculated in practice? - There may be several possible code sequences

GLSL ES: Invariance e.g. MUL R1, a, x or MUL R2, b, y MUL R3, c, z MUL R4, d, w ADD R1, R1, R2 ADD R3, R3, R4 ADD R1, R1, R3 MUL R1, a, x MADD R1, b, y MADD R1, c, z MADD R1, d, w Copyright Khronos Group, 2005 - Page 25

GLSL ES: Invariance Three reasons the result may differ: - Use of different instructions - Instructions executed in a different order - Different precisions used for intermediate results (only minimum precisions are defined) But it gets worse... Modern compilers may rearrange your code - Values may lose precision when written to a register - Sometimes it is cheaper to recalculate a value rather than store it in a register. But will it be calculated the same way? e.g. uniform sampler2d tex1, tex2;... const vec2 pos =...; vec4 col1 = texture2d(tex1, pos);... vec4 col2 = texture2d(tex2, pos);// is this the same value? gl_fragcolor = col1 col2; Copyright Khronos Group, 2005 - Page 26

Copyright Khronos Group, 2005 - Page 27 GLSL ES: Invariance The solution Solution is in three parts: invariant keyword to specify specific variables are invariant invariant varying vec3 LightPosition; - Currently can only be used on outputs Global switch to make all variable invariant #pragma STDGL invariant(all) General invariance rule within shaders. - Values of variables do not change between assignments Usage - Turn on invariance to make programs safe and easier to debug - Turn off invariance to get the maximum optimization from the compiler.

Copyright Khronos Group, 2005 - Page 28 GLSL ES Examples: Null Vertex attribute vec4 VertexPositionIn; // Input to Vertex attribute vec4 VertexColourIn; // Input to Vertex varying vec4 VertexColorOut; // Output from Vertex shader void main() { VertexColorOut = VertexColorIn gl_position = VertexPositionIn; } Fragment varying vec4 FragmentColorIn; // Input to Fragment void main() { gl_fragcolor = FragmentColorIn; }

Copyright Khronos Group, 2005 - Page 29 Vertex functions The vertex shader can do: - Transformation of position using model-view and projection matrices - Transformation of normals, including renormalization - Texture coordinate generation and transformation - Per-vertex lighting - Calculation of values for lighting per pixel The vertex shader cannot do: - Anything that requires information from more than one vertex - Anything that depends on connectivity. - Any triangle operations (e.g. clipping, culling) - Access colour buffer

Copyright Khronos Group, 2005 - Page 30 Example Vertex Diffuse lighting uniform mat4 ModelViewProjectionMatrix, NormalMatrix; uniform vec4 LightSourceDiffuse, LightSourcePosition, MaterialDiffuse; attribute vec4 InputPosition, InputNormal, InputTextureCoordinates; varying vec4 VertexColour; varying vec4 TextureCoordinates; void main() { vec3 normal, lightdirection; vec4 diffuse; float NdotL; normal = normalize(normalmatrix * Normal); lightdirection = normalize(vec3(lightsourceposition)); NdotL = max(dot(normal, lightdirection), 0.0); diffuse = MaterialDiffuse * LightSourceDiffuse; VertexColor = NdotL * diffuse; TextureCoordinates = InputTextureCoordinates; gl_position = ModelViewProjectionMatrix * position; }

Copyright Khronos Group, 2005 - Page 31 Fragment Functions The fragment shader can do: - Texture blending - Fog - Alpha testing - Dependent textures - Pixel discard - Bump and environment mapping The fragment shader cannot do: - Blending with colour buffer - ROP operations - Depth or stencil tests - Write depth

Copyright Khronos Group, 2005 - Page 32 Example Fragment Simple Texture Blend uniform sampler2d TextureHandle; varying vec2 TextureCoordinates; varying vec4 VertexColour; void main() { vec4 texel = texture2d (TextureHandle, TextureCoordinates); gl_fragcolor = texel * VertexColour; }

Copyright Khronos Group, 2005 - Page 33 Gooch (Vertex) uniform vec4 lightpos; varying vec3 normal; varying vec3 lightvec; varying vec3 viewvec; void main() { gl_position = gl_modelviewprojectionmatrix * gl_vertex; vec4 vert = gl_modelviewmatrix * gl_vertex; normal = gl_normalmatrix * gl_normal; lightvec = vec3(lightpos - vert); viewvec = -vec3(vert); }

Gooch (Fragment) uniform vec3 ambient; varying vec3 normal; varying vec3 lightvec; varying vec3 viewvec; void main(){ const float b = 0.55; const float y = 0.3; const float Ka = 1.0; const float Kd = 0.8; const float Ks = 0.9; vec3 specularcolor = vec3(1.0, 1.0, 1.0); vec3 norm = normalize(normal); vec3 L = normalize (lightvec); vec3 V = normalize (viewvec); vec3 halfangle = normalize (L + V); vec3 orange = vec3(.88,.81,.49); vec3 purple = vec3(.58,.10,.76); vec3 kcool = purple; vec3 kwarm = orange; float NdotL = dot(l, norm); float NdotH = clamp(dot(halfangle, norm), 0.0, 1.0); float specular = pow(ndoth, 64.0); float blendval = 0.5 * NdotL + 0.5; vec3 Cgooch = mix(kwarm, kcool, blendval); vec3 result = Ka * ambient + Kd * Cgooch + specularcolor * Ks * specular; } gl_fragcolor = vec4(result, 1.0); Copyright Khronos Group, 2005 - Page 34

Gooch Copyright Khronos Group, 2005 - Page 35

Copyright Khronos Group, 2005 - Page 36 Compiling and using a shader Vertex glcreateobject glsource glcompile gldeleteobject glcreateprogramobject glattachobject Fragment glcreateobject glattachobject glsource gllinkprogram glcompile gluseprogramobject gldeleteobject gldeleteobject

Copyright Khronos Group, 2005 - Page 37 Compiling and using a shader: : The code // Create Objects GLhandleARB programobject = glcreateprogramobjectarb(); GLhandleARB vertexobject = glcreateobjectarb(gl_vertex_shader_arb); GLhandleARB fragmentobject = glcreateobjectarb(gl_fragment_shader_arb); GLcharARB *vertexsource = readfile(vertexfilename); GLcharARB *fragmentsource = readfile(fragmentfilename); // Load code into shader objects glsourcearb(vertexobject, 1, vertexsource, NULL); glsourcearb(fragmentobject, 1, fragmentsource, NULL); glcompilearb(vertexobject); glcompilearb(fragmentobject); glattachobjectarb(programobject, vertexobject); glattachobjectarb(programobject, fragmentobject); gllinkprogramarb(programobject); gluseprogramobjectarb(programobject);

Performance Tips Keep fragment shaders simple - Fragment shader hardware is expensive. - Early implementations will not have good performance with complex shaders. Try to avoid using textures for function lookups. - Calculation is quite cheap, accessing textures is expensive. - This is more important with embedded devices. Minimize register usage - Embedded devices do not support the same number of registers compared with desktop devices. Spilling registers to memory is expensive. Minimize the number of shader changes - s contain a lot of state - May require the pipeline to be flushed - Use uniforms to change behaviour in preference to loading a new shader. Copyright Khronos Group, 2005 - Page 38

Copyright Khronos Group, 2005 - Page 39 Uniform s Problem: How to calculate uniforms? - e.g. how to generate inverse matrices Issues: - Want to remove legacy fixed functions from API - Embedded devices may have slow CPU or no floating point Possible solutions: - Put code in vertex shader and rely on compiler to hoist code and run only once - Put fixed functions back - Uniform shaders - Allow vertex shaders to write results to memory.

Copyright Khronos Group, 2005 - Page 40 Uniform s Uniform Uniform API API Uniforms Uniforms Uniforms Uniforms Vertices Vertex Vertex Rasterizer PA PA & & Rasterizer Fragment Fragment Frame Frame Buffer Buffer

Copyright Khronos Group, 2005 - Page 41 Future Directions Sample s - Enables alpha testing at per-sample resolution - Enables more of the fixed function pipeline to be removed. - Allows more programmability when using multi-sampling. - e.g. Read and write depth and stencil Object (Geometry) s - Programmable tessellation - Higher order surfaces - Procedural geometry - Possibility of accelerating many more algorithms e.g. shadows, occlusion culling.

Copyright Khronos Group, 2005 - Page 42 Future ES Pipeline? Uniform Uniform API API Vertex Buffer Vertex Objects Buffer Objects Processing Primitive Primitive Processing Vertex Vertex Assembly Primitive Primitive Assembly Object Object Rasterizer Rasterizer Fragment Fragment Sample Sample Frame Frame Buffer Buffer

Any Questions? Copyright Khronos Group, 2005 - Page 43