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

OpenGL ES Shading Language

Feb 11, 2022

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 1

Open GL ES 2.0 Open GL ES 2.0 An Introduction to the programmable pipelineAn Introduction to the programmable pipeline

Robert J. SimpsonArchitect, ATI Research.

Page 2: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 2

OutlineOutline• OpenGL ES 2.0 Philosophy• The shader model• OpenGL ES Shading Language (GLSL ES)• Example shaders• Compiling Shaders• Performance Tips• Roadmap for shaders

Page 3: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 3

ES 2.0 PhilosophyES 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

Page 4: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 4

Existing Fixed Function PipelineExisting Fixed Function Pipeline

APIAPI

Transformand

Lighting

Transformand

Lighting RasterizerRasterizerPrimitiveAssembly

PrimitiveAssembly

TextureEnvironment

TextureEnvironment

DepthStencil

DepthStencil

ColourSum

ColourSum

AlphaTest

AlphaTest

FogFog

DitherDitherColourBufferBlend

ColourBufferBlend

VertexBuffer

Objects

VertexBuffer

Objects

Vertices

Triangles/Lines/Points

PrimitiveProcessingPrimitive

Processing

Frame BufferFrame Buffer

Page 5: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 5

ES2.0 Programmable PipelineES2.0 Programmable Pipeline

APIAPIVertexShader

VertexShader RasterizerRasterizerPrimitive

AssemblyPrimitiveAssembly

FragmentShader

FragmentShader

DepthStencil

DepthStencil DitherDitherColour

BufferBlend

ColourBufferBlend

VertexBuffer

Objects

VertexBuffer

Objects

Vertices

Triangles/Lines/Points

PrimitiveProcessingPrimitive

Processing

Frame BufferFrame Buffer

Page 6: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 6

Programmer’s modelProgrammer’s model

VertexShader

VertexShader

FragmentShader

FragmentShader

PrimitiveAssembly

& Rasterize

PrimitiveAssembly

& Rasterize

Per-SampleOperations

Per-SampleOperations

Attributes(~8)

Attributes(~8)

Vertex Uniforms(~96)

Vertex Uniforms(~96)

Varyings(~8)

Varyings(~8)

Fragment Uniforms(~16)

Fragment Uniforms(~16)

Page 7: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 7

VertexVertex ShaderShader

Attribute 0Attribute 0

UniformsUniforms TexturesTextures

Attribute 1Attribute 1

Attribute 2Attribute 2

Attribute 3Attribute 3

Attribute 4Attribute 4

Attribute 5Attribute 5

Attribute 6Attribute 6

Attribute 7Attribute 7

Varying 0Varying 0

Varying 1Varying 1

Varying 2Varying 2

Varying 3Varying 3

Varying 4Varying 4

Varying 5Varying 5

Varying 6Varying 6

Varying 7Varying 7

Temporary variables

Temporary variables

gl_Positiongl_Position

gl_FrontFacinggl_FrontFacing

Vertex ShaderVertex Shader

gl_PointSizegl_PointSize

Page 8: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 8

FragmentFragment ShaderShader

UniformsUniforms TexturesTextures

Temporary variables

Temporary variables

gl_Positiongl_Position

gl_FragColorgl_FragColor

Varying 0Varying 0

Varying 1Varying 1

Varying 2Varying 2

Varying 3Varying 3

Varying 4Varying 4

Varying 5Varying 5

Varying 6Varying 6

Varying 7Varying 7

Fragment ShaderFragment Shader

gl_Positiongl_Position

gl_FrontFacinggl_FrontFacing

gl_PointPositiongl_PointPosition

Page 9: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 9

GLSL ES OverviewGLSL 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.

Page 10: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 10

GLSL ES GLSL ES PreprocessorPreprocessor• Comments// /* */

• Macros##define#undef

• Control#if#ifdef#ifndef#else#elif#endif

#error

• Operatorsdefined

• Extensions#pragma#extension#version#line

Page 11: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 11

GLSL ES TypesGLSL ES Types• Scalar

void float int bool

• Vector- boolean

bvec2 bvec3 bvec4

- integerivec2 ivec3 ivec4

- floating pointvec2 vec3 vec4

• Matrixmat2 mat3 mat4

• Samplersampler2D

• ContainerstructArrays

Page 12: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 12

GLSL ES Storage QualifiersGLSL 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 Shader- e.g. texture coordinates

Page 13: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 13

GLSL ES Function Parameter QualifiersGLSL 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)outinout

• 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]) {...}

Page 14: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 14

GLSL ES Precision QualifiersGLSL 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

Page 15: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 15

GLSL ES Precision QualifiersGLSL 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 ± 262

- Resolution 1 part in 216

- Use of texture coordinate calculation e.g. environment mapping• single precision

- Not explicit in GLSL but usually available in the vertex shader

Page 16: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 16

GLSL ES Precision QualifiersGLSL 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 floatprecision lowp float;float y; // y is a low precision float

}

Page 17: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 17

GLSL ES PrecisionGLSL 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 precisionlowp 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 requiredbool b = (1.0/3.0 > 0.33); // Must have default

// precision defined.

Page 18: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 18

GLSL ES ConstructorsGLSL 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 initializationstruct S {int a; float b;};S s = S(2, 3.5);

Page 19: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 19

GLSL ES Swizzle operatorsGLSL 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; // Assignment to single componentfloat a = v.x; // Component selectionv.xy = u.yx; // swap componentsv = v.xx; // replicate components

v.xx = u; // Error

• Component setsUse one of:xyzwrgbastpq

• Indexing operatorvec4 u,v;float x = u[0]; // equivalent to u.x

• Must use indexing operator for matrices

Page 20: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 20

GLSL ES Features cont.GLSL ES Features cont.• Operators

- ++ -- + - ! () []- * / + -- < <= > >=- == != - && ^^ ||- ?:- = *= /= += -=

• Flow control- <expression> ? <expression_1> : <expression_2>- if else- for while do - return break continue- discard (fragment shader only)

Page 21: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 21

GLSL BuiltGLSL Built--in Variablesin 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)

Page 22: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 22

GLSL ES BuiltGLSL ES Built--in Functionsin 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

Page 23: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 23

GLSL ES BuiltGLSL ES Built--in Functionsin 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)

Page 24: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 24

GLSL ES: Invariance GLSL ES: Invariance –– the problemthe problem• Consider a simple transform in the vertex shader:

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

=

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

′′′′

wzyx

ponmlkjihgfedcba

wzyx

x’ = ax + by + cz + dw

But how is this calculated in practice?- There may be several possible code sequences

Page 25: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 25

GLSL ES: InvarianceGLSL ES: Invariancee.g.

MUL R1, a, xMUL R2, b, yMUL R3, c, zMUL R4, d, wADD R1, R1, R2ADD R3, R3, R4ADD R1, R1, R3

orMUL R1, a, xMADD R1, b, yMADD R1, c, zMADD R1, d, w

Page 26: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 26

GLSL ES: InvarianceGLSL 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;

Page 27: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 27

GLSL ES: Invariance GLSL ES: Invariance –– The solutionThe 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.

Page 28: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 28

GLSL ES Examples: ‘Null GLSL ES Examples: ‘Null ShaderShader’’• Vertex

attribute vec4 VertexPositionIn; // Input to Vertex Shaderattribute vec4 VertexColourIn; // Input to Vertex Shader varying vec4 VertexColorOut; // Output from Vertex shader

void main() {VertexColorOut = VertexColorIn gl_Position = VertexPositionIn;

}

• Fragment

varying vec4 FragmentColorIn; // Input to Fragment Shader

void main(){ gl_FragColor = FragmentColorIn;

}

Page 29: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 29

VertexVertex ShaderShader functionsfunctions• 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

Page 30: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 30

Example VertexExample Vertex ShaderShader• 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;}

Page 31: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 31

FragmentFragment ShaderShader FunctionsFunctions• 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

Page 32: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 32

Example FragmentExample Fragment ShaderShader• Simple Texture Blend

uniform sampler2D TextureHandle;varying vec2 TextureCoordinates;varying vec4 VertexColour;void main(){ vec4 texel = texture2D (TextureHandle, TextureCoordinates);gl_FragColor = texel * VertexColour;

}

Page 33: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 33

GoochGooch ShaderShader (Vertex)(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);

}

Page 34: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 34

GoochGooch ShaderShader (Fragment)(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);}

Page 35: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 35

GoochGooch ShaderShader

Page 36: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 36

Compiling and using aCompiling and using a shadershader

glCreateProgramObject

glAttachObject

glAttachObject

glLinkProgram

glUseProgramObject

glCreateShaderObject

glShaderSource

glCompileShader

glDeleteObject

glCreateShaderObject

glShaderSource

glCompileShader

glDeleteObject

glDeleteObject

Vertex Shader

Fragment Shader

Page 37: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 37

Compiling and using aCompiling and using a shadershader: The code: The code// Create Shader ObjectsGLhandleARB programObject = glCreateProgramObjectARB();GLhandleARB vertexShaderObject = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);GLhandleARB fragmentShaderObject = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);

GLcharARB *vertexShaderSource = readShaderFile(vertexShaderFilename);GLcharARB *fragmentShaderSource = readShaderFile(fragmentShaderFilename);

// Load code into shader objectsglShaderSourceARB(vertexShaderObject, 1, vertexShaderSource, NULL);glShaderSourceARB(fragmentShaderObject, 1, fragmentShaderSource, NULL);

glCompileShaderARB(vertexShaderObject);glCompileShaderARB(fragmentShaderObject);

glAttachObjectARB(programObject, vertexShaderObject);glAttachObjectARB(programObject, fragmentShaderObject);

glLinkProgramARB(programObject);

glUseProgramObjectARB(programObject);

Page 38: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 38

Performance TipsPerformance 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

- Shaders contain a lot of state- May require the pipeline to be flushed- Use uniforms to change behaviour in preference to loading a new shader.

Page 39: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 39

UniformUniform ShadersShaders

• 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.

Page 40: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 40

UniformUniform ShadersShaders

UniformsUniforms

VertexShader

VertexShader PA &

RasterizerPA &

Rasterizer FragmentShader

FragmentShader

UniformsUniforms

APIAPI

Vertices

UniformShader

UniformShader

Frame BufferFrame Buffer

Page 41: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 41

Future DirectionsFuture Directions• Sample Shaders

- 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) Shaders- Programmable tessellation- Higher order surfaces- Procedural geometry- Possibility of accelerating many more algorithms e.g. shadows, occlusion culling.

Page 42: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 42

Future ES Pipeline?Future ES Pipeline?

APIAPI

VertexShader

VertexShader RasterizerRasterizer

FragmentShader

FragmentShader

VertexBuffer

Objects

VertexBuffer

Objects

SampleShader

SampleShader

ObjectShader

ObjectShader

UniformShader

UniformShader

PrimitiveAssembly

PrimitiveAssemblyPrimitive

ProcessingPrimitive

Processing

Frame BufferFrame Buffer

Page 43: OpenGL ES Shading Language

© Copyright Khronos Group, 2005 - Page 43

Any Questions?Any Questions?