opengl shading language - amd · original code was of form: // to avoid nested (incoherent) ifs //...

72
OpenGL Shading Language OpenGL Shading Language Bill Licea Bill Licea - - Kane Kane ATI Research, Inc. ATI Research, Inc.

Upload: others

Post on 08-Jul-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

OpenGL Shading LanguageOpenGL Shading Language

Bill LiceaBill Licea--KaneKaneATI Research, Inc.ATI Research, Inc.

Page 2: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

AgendaAgenda(Familiar with ARB extensions?)(Familiar with ARB extensions?)

•• API ChangesAPI Changes•• Shading Language ChangesShading Language Changes•• Shader Examples (and demos)Shader Examples (and demos)

Page 3: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

AgendaAgenda(Familiar with ARB extensions?)(Familiar with ARB extensions?)

•• API ChangesAPI Changes•• Shading Language ChangesShading Language Changes•• Shader Examples (and demos)Shader Examples (and demos)

Page 4: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI ChangesGenerally speakingGenerally speaking

•• Drop ARB suffixDrop ARB suffix•• GLhandleARBGLhandleARB GLuintGLuint•• Drop Drop ““objectobject””–– ShaderObjectShaderObject ShaderShader–– ProgramObjectProgramObject ProgramProgram–– Object Object Program and ShaderProgram and Shader

•• UnremoveUnremove glIsObjectGL2 twiceglIsObjectGL2 twice……

Page 5: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes6.1.11 Pointer/String Queries6.1.11 Pointer/String Queries

GLubyteGLubyte **glGetStringglGetString( GL_SHADING_LANGUAGE_VERSION );( GL_SHADING_LANGUAGE_VERSION );

Page 6: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes6.1.11 Pointer/String Queries6.1.11 Pointer/String Queries

GLubyteGLubyte **glGetStringglGetString( GL_SHADING_LANGUAGE_VERSION );( GL_SHADING_LANGUAGE_VERSION );

Page 7: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

AgendaAgenda

•• API ChangesAPI Changes•• Shading Language ChangesShading Language Changes•• Shader Examples (and demos)Shader Examples (and demos)

Page 8: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesOverviewOverview……

•• Add preprocessor directivesAdd preprocessor directives•• Add more derived matrix state!Add more derived matrix state!•• Change function calls with arraysChange function calls with arrays•• Simplify constructorsSimplify constructors•• UnremoveUnremove gl_FragData[ngl_FragData[n]]

Page 9: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language Changes……OverviewOverview

•• Update builtUpdate built--in constant namesin constant names•• Add a few builtAdd a few built--in functions in functions •• Fix functionsFix functions•• Clarify shadowsClarify shadows•• Make reservationsMake reservations•• Correct Correct miscelaneusmiscelaneus typoestypoes

Page 10: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesNew preprocessor directivesNew preprocessor directives

// #version // #version numbernumber

// default is:// default is:

#version 110#version 110

// #extension // #extension extension_nameextension_name : behavior: behavior

// // extension_nameextension_name = all , see OpenGL Extension Registry= all , see OpenGL Extension Registry

// // behavior = require, enable, warn, disablebehavior = require, enable, warn, disable

// default is:// default is:

#extension all : disable#extension all : disable

Page 11: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesAdd more derived matrix stateAdd more derived matrix state……

// Inverse// Inverse

uniform mat4 uniform mat4 gl_ModelViewMatrixInversegl_ModelViewMatrixInverse;;

uniform mat4 uniform mat4 gl_ProjectionMatrixInversegl_ProjectionMatrixInverse;;

uniform mat4 uniform mat4 gl_ModelViewProjectionMatrixInversegl_ModelViewProjectionMatrixInverse;;

uniform mat4 uniform mat4 gl_TextureMatrixInverse[gl_MaxTextureCoordsgl_TextureMatrixInverse[gl_MaxTextureCoords];];

// Transpose// Transpose

uniform mat4 uniform mat4 gl_ModelViewMatrixTransposegl_ModelViewMatrixTranspose;;

uniform mat4 uniform mat4 gl_ProjectionMatrixTransposegl_ProjectionMatrixTranspose;;

uniform mat4 uniform mat4 gl_ModelViewProjectionMatrixTransposegl_ModelViewProjectionMatrixTranspose;;

uniform mat4 uniform mat4 gl_TextureMatrixTranspose[gl_MaxTextureCoordsgl_TextureMatrixTranspose[gl_MaxTextureCoords];];

Page 12: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language Changes……Add more derived matrix stateAdd more derived matrix state

// // InverseTransposeInverseTranspose

uniform mat4 uniform mat4 gl_ModelViewMatrixInverseTransposegl_ModelViewMatrixInverseTranspose;;

uniform mat4 uniform mat4 gl_ProjectionMatrixInverseTransposegl_ProjectionMatrixInverseTranspose;;

uniform mat4 uniform mat4 gl_ModelViewProjectionMatrixInverseTransposegl_ModelViewProjectionMatrixInverseTranspose;;

uniform mat4 uniform mat4 gl_TextureMatrixInverseTranspose[gl_MaxTextureCoordsgl_TextureMatrixInverseTranspose[gl_MaxTextureCoords];];

Page 13: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language Changes……Good thing there is a preprocessorGood thing there is a preprocessor

#define MVIT #define MVIT gl_ModelViewMatrixInverseTransposegl_ModelViewMatrixInverseTranspose

Page 14: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesChange function calls with arraysChange function calls with arrays

// Function definition with array parameter// Function definition with array parameter

varying vec4 vTC[4];varying vec4 vTC[4];

vec4 Function( vec4 X[4] );vec4 Function( vec4 X[4] );

void main ( void )void main ( void )

{{

gl_FragColorgl_FragColor = Function( = Function( vTCvTC ); );

}}

vec4 Function( vec4 X[4] )vec4 Function( vec4 X[4] )

{{

vec4 r = vec4( 0.0 );vec4 r = vec4( 0.0 );

for ( for ( intint i=0 ; i<4 ; i++ ) r += i=0 ; i<4 ; i++ ) r += X[iX[i];];

return r * 0.25;return r * 0.25;

}}

Page 15: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesSimplify constructorsSimplify constructors

// Limit number of // Limit number of argsargs to a constructorto a constructor

vec4( vec4( 1.01.0 ); // OK); // OK

vec4( 1.0, 2.0 ); // NOT OKvec4( 1.0, 2.0 ); // NOT OK

vec4( 1.0, 2.0, 3.0 ); // NOT OKvec4( 1.0, 2.0, 3.0 ); // NOT OK

vec4( vec4( 1.01.0, , 2.02.0, , 3.03.0, , 4.04.0 ); // OK); // OK

vec4( 1.0, 2.0, 3.0, 4.0, vec4( 1.0, 2.0, 3.0, 4.0, 5.05.0 ); // NOT OK); // NOT OK

vec4( vec3( vec4( vec3( 1.01.0, , 2.02.0, , 3.03.0 ), ), 4.04.0 ); // OK); // OK

vec4( vec3( vec4( vec3( 1.01.0, , 2.02.0, , 3.03.0 ), vec2( ), vec2( 4.04.0, 5.0 ) ); // OK, 5.0 ) ); // OK

vec4( vec3( 1.0, 2.0, 3.0 ), 4.0, vec4( vec3( 1.0, 2.0, 3.0 ), 4.0, 5.05.0 ); // NOT OK); // NOT OK

// Can no longer construct a matrix from another matrix// Can no longer construct a matrix from another matrix

mat2( mat3( 1.0 ) ); // NOT OKmat2( mat3( 1.0 ) ); // NOT OK

Page 16: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesUnremoveUnremove gl_FragData[ngl_FragData[n]]

// Can still write to // Can still write to gl_FragColorgl_FragColor

gl_FragColorgl_FragColor = vec4( 1,1,0,1 ); // Write to all buffers= vec4( 1,1,0,1 ); // Write to all buffers

// OR can write to // OR can write to gl_FragData[gl_FragData[nn]]

// Assume // Assume gl_MaxDrawBuffersgl_MaxDrawBuffers = 4= 4

gl_FragData[0] = vec4( 1,1,0,1 ); // Write to buffer 0gl_FragData[0] = vec4( 1,1,0,1 ); // Write to buffer 0

gl_FragData[1] = vec4( 0,0,1,1 ); // Write to buffer 1gl_FragData[1] = vec4( 0,0,1,1 ); // Write to buffer 1

// buffer 2 undefined// buffer 2 undefined

// buffer 3 undefined// buffer 3 undefined

// YOU MUST NOT (STATICALLY) WRITE TO BOTH// YOU MUST NOT (STATICALLY) WRITE TO BOTH

// // gl_FragColorgl_FragColor

// // gl_FragData[gl_FragData[nn]]

Page 17: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesUpdate builtUpdate built--in constant namesin constant names

•• Drop suffix for extensions Drop suffix for extensions promoted to corepromoted to core

Page 18: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesAdd a few builtAdd a few built--in functionsin functions……

genType exp( genType x ); // e^xgenType log( genType x ); // natural logarithm

Page 19: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language Changes……Add a few builtAdd a few built--in functionsin functions

genType refract( genType I, genType N, float eta ){

// The caller should provide normalized I and Nfloat k;k = 1.0 - eta*eta * (1.0 - dot(N,I)*dot(N,I));if (k < 0.0)

result = genType(0.0);else

result = eta*I - ( eta*dot(N,I) + sqrt(k) )*N;}

Page 20: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesFix functionsFix functions

•• Define domain of exponentialsDefine domain of exponentials•• Fix stepFix step

•• Soon, fix clamp and smoothstepSoon, fix clamp and smoothstep–– undefined if (min > max)

1.0

undefined if (min > max)

0.0edge

Page 21: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesClarify shadowsClarify shadows……

•• 2D Texture functions 2D Texture functions ““knowknow”” they they need need TC.stTC.st or or TC.stqTC.stq

•• 2D Shadow functions 2D Shadow functions ““knowknow”” they they need need TC.stTC.stpp or or TC.stTC.stppqq for for GL_COMPARE_R_TO_TEXTUREGL_COMPARE_R_TO_TEXTURE

Page 22: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language Changes……Clarify shadowsClarify shadows

•• Texture functions are Texture functions are DEFINEDDEFINED ififTEXTURE_COMPARE_MODETEXTURE_COMPARE_MODE is is NONENONE

•• Shadow functions are Shadow functions are UNDEFINEDUNDEFINED ififTEXTURE_COMPARE_MODETEXTURE_COMPARE_MODE is is NONENONE

•• ARB_fragment_program_shadowARB_fragment_program_shadowhas similar languagehas similar language

Page 23: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesMake reservationsMake reservations……

•• ““VENVEN”” Prefix/Suffix is one ofPrefix/Suffix is one of–– Vendor specific acronymVendor specific acronym

SGI, HP, IBM, APPLE, SUN, NV, MESA, ATI, I3DSGI, HP, IBM, APPLE, SUN, NV, MESA, ATI, I3D

–– MultiMulti--vendor acronymvendor acronymEXT, OML, (GL2), OESEXT, OML, (GL2), OES

–– ARBARB

Page 24: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language Changes……Make reservationsMake reservations

•• VariablesVariablesglgl_<Name> are RESERVED to GL_<Name> are RESERVED to GL

glgl_<Name>VEN are RESERVED for extensions_<Name>VEN are RESERVED for extensions

Example: attribute vec3 Example: attribute vec3 gl_TangentSGIgl_TangentSGI

•• KeywordsKeywords__<name> are RESERVED to GL__<name> are RESERVED to GL

__<name>VEN are RESERVED for extensions__<name>VEN are RESERVED for extensions

(__(__asdfasdf are RESERVED to GL)are RESERVED to GL)

((as__dfas__df are RESERVED to GL)are RESERVED to GL)

((asdfasdf__ are RESERVED to GL)__ are RESERVED to GL)

Page 25: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language Changes……Make reservationsMake reservations

•• Basic Data TypesBasic Data TypesAdd new basic data type through new keywordsAdd new basic data type through new keywords

Example: __Example: __intEXTintEXT

•• Derived Data TypesDerived Data Typesglgl_<name> are RESERVED to GL_<name> are RESERVED to GL

glgl_<name>VEN are RESERVED for extensions_<name>VEN are RESERVED for extensions

•• OperatorsOperatorsRequires prior approval of ARBRequires prior approval of ARB

Recommended alternative, add new basic data typesRecommended alternative, add new basic data types

Page 26: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language Changes……Make reservationsMake reservations

•• BuiltBuilt--in functionsin functions<name> are RESERVED to GL<name> are RESERVED to GL

<name>VEN are RESERVED for extensions<name>VEN are RESERVED for extensions

Example:Example:

float simplexNoise1ATI( float simplexNoise1ATI( genTypegenType P );P );

vec2 simplexNoise2ATI( vec2 simplexNoise2ATI( genTypegenType P );P );

vec3 simplexNoise3ATI( vec3 simplexNoise3ATI( genTypegenType P );P );

vec4 simplexNoise4ATI( vec4 simplexNoise4ATI( genTypegenType P );P );

Page 27: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesCorrect Correct miscelaneusmiscelaneus typoestypoes

•• miscellaneous typosmiscellaneous typos

Page 28: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language ChangesDDééjjàà overvuovervu……

•• Added preprocessor directivesAdded preprocessor directives•• Added more derived matrix state!Added more derived matrix state!•• Changed function calls with arraysChanged function calls with arrays•• Simplified constructorsSimplified constructors•• UnremovedUnremoved gl_FragData[ngl_FragData[n]]

Page 29: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shading Language ChangesShading Language Changes……DDééjjàà overvuovervu

•• Updated builtUpdated built--in constant namesin constant names•• Added a few builtAdded a few built--in functions in functions •• Fixed functionsFixed functions•• Clarified shadowsClarified shadows•• Made reservationsMade reservations•• Corrected miscellaneous typosCorrected miscellaneous typos

Page 30: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

AgendaAgenda(Familiar with ARB extensions?)(Familiar with ARB extensions?)

•• API ChangesAPI Changes•• Shading Language ChangesShading Language Changes•• Shader Examples (and demos)Shader Examples (and demos)

Page 31: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shader ExamplesShader Examples

•• Splines, Splines, splinessplines everywhere...everywhere...•• Perlin Simplex NoisePerlin Simplex Noise

Page 32: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shader ExamplesShader Examples

•• Splines, Splines, splinessplines everywhere...everywhere...•• Perlin Simplex NoisePerlin Simplex Noise

Page 33: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywhereCommon usage with RenderMan ShadersCommon usage with RenderMan Shaders

•• Darwyn PeacheyDarwyn Peachey•• Ken MusgraveKen Musgrave•• Larry Larry GritzGritz•• Tony Tony ApodacaApodaca•• Peter Peter QuintQuint•• TalTal LancasterLancaster……

Page 34: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhere everywhere Bake the spline?Bake the spline?

•• RenderMan RenderMan splinessplines areare““catmullcatmull--romrom”” basis by default.basis by default.

•• RenderMan RenderMan splinessplines with awith a““linearlinear”” basis are basis are ““quirkyquirky””

Page 35: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywherecatmullcatmull--romrom splinespline

P[5]P[4]

P[3]P[1]

P[0]

P[2]

P[6]

Page 36: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywhereStore knots in textureStore knots in texture

P[3].rP[3].rP[3].gP[3].gP[3].bP[3].bP[3].aP[3].a

P[P[nn].r].rP[P[nn].g].gP[P[nn].b].bP[P[nn].a].a

......

P[2].rP[2].rP[2].gP[2].gP[2].bP[2].bP[2].aP[2].a

P[1].rP[1].rP[1].gP[1].gP[1].bP[1].bP[1].aP[1].a

P[0].rP[0].rP[0].gP[0].gP[0].bP[0].bP[0].aP[0].a

Page 37: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywhereStore Store swizzledswizzled knots in textureknots in texture

P[3].aP[3].aP[4].aP[4].aP[5].aP[5].aP[6].aP[6].a

P[3].bP[3].bP[4].bP[4].bP[5].bP[5].bP[6].bP[6].b

P[3].gP[3].gP[4].gP[4].gP[5].gP[5].gP[6].gP[6].g

P[3].rP[3].rP[4].rP[4].rP[5].rP[5].rP[6].rP[6].r

P[P[nn--33].a].aP[P[nn--22].a].aP[P[nn--11].a].aP[P[nn ].a].a

......P[2].aP[2].aP[3].aP[3].aP[4].aP[4].aP[5].aP[5].a

P[1].aP[1].aP[2].aP[2].aP[3].aP[3].aP[4].aP[4].a

P[0].aP[0].aP[1].aP[1].aP[2].aP[2].aP[3].aP[3].a

P[P[nn--33].b].bP[P[nn--22].b].bP[P[nn--11].b].bP[P[nn ].b].b

......P[2].bP[2].bP[3].bP[3].bP[4].bP[4].bP[5].bP[5].b

P[1].bP[1].bP[2].bP[2].bP[3].bP[3].bP[4].bP[4].b

P[0].bP[0].bP[1].bP[1].bP[2].bP[2].bP[3].bP[3].b

P[P[nn--33].g].gP[P[nn--22].g].gP[P[nn--11].g].gP[P[nn ].g].g

......P[2].gP[2].gP[3].gP[3].gP[4].gP[4].gP[5].gP[5].g

P[1].gP[1].gP[2].gP[2].gP[3].gP[3].gP[4].gP[4].g

P[0].gP[0].gP[1].gP[1].gP[2].gP[2].gP[3].gP[3].g

P[P[nn--33].r].rP[P[nn--22].r].rP[P[nn--11].r].rP[P[nn ].r].r

......

P[2].rP[2].rP[3].rP[3].rP[4].rP[4].rP[5].rP[5].r

P[1].rP[1].rP[2].rP[2].rP[3].rP[3].rP[4].rP[4].r

P[0].rP[0].rP[1].rP[1].rP[2].rP[2].rP[3].rP[3].r

Page 38: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywhereStore Store swizzledswizzled knots in textureknots in texture

P[3].aP[3].aP[4].aP[4].aP[5].aP[5].aP[6].aP[6].a

P[3].bP[3].bP[4].bP[4].bP[5].bP[5].bP[6].bP[6].b

P[3].gP[3].gP[4].gP[4].gP[5].gP[5].gP[6].gP[6].g

P[3].rP[3].rP[4].rP[4].rP[5].rP[5].rP[6].rP[6].r

P[P[nn--33].a].aP[P[nn--22].a].aP[P[nn--11].a].aP[P[nn ].a].a

......P[2].aP[2].aP[3].aP[3].aP[4].aP[4].aP[5].aP[5].a

P[1].aP[1].aP[2].aP[2].aP[3].aP[3].aP[4].aP[4].a

P[0].aP[0].aP[1].aP[1].aP[2].aP[2].aP[3].aP[3].a

P[P[nn--33].b].bP[P[nn--22].b].bP[P[nn--11].b].bP[P[nn ].b].b

......P[2].bP[2].bP[3].bP[3].bP[4].bP[4].bP[5].bP[5].b

P[1].bP[1].bP[2].bP[2].bP[3].bP[3].bP[4].bP[4].b

P[0].bP[0].bP[1].bP[1].bP[2].bP[2].bP[3].bP[3].b

P[P[nn--33].g].gP[P[nn--22].g].gP[P[nn--11].g].gP[P[nn ].g].g

......P[2].gP[2].gP[3].gP[3].gP[4].gP[4].gP[5].gP[5].g

P[1].gP[1].gP[2].gP[2].gP[3].gP[3].gP[4].gP[4].g

P[0].gP[0].gP[1].gP[1].gP[2].gP[2].gP[3].gP[3].g

P[P[nn--33].r].rP[P[nn--22].r].rP[P[nn--11].r].rP[P[nn ].r].r

......

P[2].rP[2].rP[3].rP[3].rP[4].rP[4].rP[5].rP[5].r

P[1].rP[1].rP[2].rP[2].rP[3].rP[3].rP[4].rP[4].r

P[0].rP[0].rP[1].rP[1].rP[2].rP[2].rP[3].rP[3].r

Page 39: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywhereShader for LinearSpline3Shader for LinearSpline3……

uniform sampler2D splineTexture;uniform texelWidth, halfTexelWidth;

vec3 LinearSpline3( const in float t,const in float nKnots )

{float t0 = ( t * (nKnots-3.0) );float tt = fract( t0 ); // fractional partfloat tf = t0 - tt; // floorfloat ss = (tf * texelWidth ) + halfTexelWidth;

Page 40: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywhere……Shader for LinearSpline3Shader for LinearSpline3

const vec2 quarterT = vec3( 0.0, 0.25 );vec2 tr = vec2( ss, 0.125 );vec2 tg = tr + quarterT;vec2 tb = tg + quarterT;

vec4 kr,kg,kb;kr.rgba = texture2D( splineTexture, tr ); // R 0,1,2,3kg.rgba = texture2D( splineTexture, tg ); // G 0,1,2,3kb.rgba = texture2D( splineTexture, tb ); // B 0,1,2,3

vec3 color1 = vec3( kr[1], kg[1], kb[1] );vec3 color2 = vec3( kr[2], kg[2], kb[2] );return mix( color1, color2, tt );

}

Page 41: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywhereShader for CatmullRomSpline3Shader for CatmullRomSpline3……

uniform sampler2D splineTexture;uniform texelWidth, halfTexelWidth;

vec3 CatmullRomSpline3( const in float t,const in float nKnots )

{float t0 = ( t * (nKnots-3.0) );float tt = fract( t0 ); // fractional partfloat tf = t0 - tt; // floorfloat ss = (tf * texelWidth ) + halfTexelWidth;

Page 42: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywhere……Shader for CatmullRomSpline3Shader for CatmullRomSpline3

const vec2 quarterT = vec3( 0.0, 0.25 );vec2 tr = vec2( ss, 0.125 );vec2 tg = tr + quarterT;vec2 tb = tg + quarterT;

vec4 kr,kg,kb;kr.rgba = texture2D( splineTexture, tr ); // R 0,1,2,3kg.rgba = texture2D( splineTexture, tg ); // G 0,1,2,3kb.rgba = texture2D( splineTexture, tb ); // B 0,1,2,3

return return CatmullRomSplineSegmentCatmullRomSplineSegment( ( tttt, , kr,kg,kbkr,kg,kb ););}

Page 43: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywhereShader for Shader for CatmullRomSplineSegmentCatmullRomSplineSegment

vec3 CatmullRomSplineSegment( const in float t,const in vec4 kr,const in vec4 kg,const in vec4 kb)

{const mat4 CatmullRomBasisMatrix = mat4(

0.0, -0.5, 1.0, -0.5,1.0, 0.0, -2.5, 1.5,0.0, 0.5, 2.0, -1.5,0.0, 0.0, -0.5, 0.5 ); // OOPS, data row major

// “FIX” below

Page 44: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywhere……Shader for Shader for CatmullRomSplineSegmentCatmullRomSplineSegment

vec4 tt; // will be ( 1.0, t, t^2, t^3 )tt.x = 1.0;tt.y = t; tt.z = tt.y*t;tt.w = tt.z*t;

vec4 w = tt * CatmullRomBasisMatrix; // Transposedvec3 color;

color.r = dot( w, kr );color.g = dot( w, kg );color.b = dot( w, kb );

return color; }

Page 45: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Splines, Splines, splinessplines everywhereeverywhere

Page 46: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Shader ExamplesShader Examples

•• Splines, Splines, splinessplines everywhere...everywhere...•• Perlin Simplex NoisePerlin Simplex Noise

Page 47: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Perlin Simplex NoisePerlin Simplex NoiseOften overlookedOften overlooked……

•• 11STST presented at presented at SiggraphSiggraph 20012001–– Course 24, Course 24, ““Real Time ShadingReal Time Shading””•• Noise HardwareNoise Hardware

•• NOT presented in NOT presented in SiggraphSiggraph 2002 2002 paperpaper

Ken PerlinKen Perlinhttp://www.csee.umbc.edu/~olano/s2001c24/http://www.csee.umbc.edu/~olano/s2001c24/http://mrl.nyu.edu/~perlin/doc/vita.htmlhttp://mrl.nyu.edu/~perlin/doc/vita.html

Page 48: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Perlin Simplex NoisePerlin Simplex Noise……Often overlookedOften overlooked

Stefan Gustavson, Linköping University, SwedenSimplex noise demystifiedhttp://http://www.itn.liu.se/~stegu/simplexnoisewww.itn.liu.se/~stegu/simplexnoise//

Page 49: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Perlin Simplex NoisePerlin Simplex NoiseWhy use it? Why use it? CHEAPERCHEAPER and better.and better.

3V 4V 5V 6V 7V (n+1)V2D 3D 4D 5D 6D nD4V 8V 16V 32V 64V 2nV

3L 7L 15L 31L 63L (2n)-1LEric W. Eric W. WeissteinWeisstein. "Simplex." From . "Simplex." From MathWorldMathWorld----A Wolfram Web Resource.A Wolfram Web Resource.

http://http://mathworld.wolfram.com/Simplex.htmlmathworld.wolfram.com/Simplex.htmlEric W. Eric W. WeissteinWeisstein. "Hypercube." From . "Hypercube." From MathWorldMathWorld----A Wolfram Web Resource. A Wolfram Web Resource.

http://http://mathworld.wolfram.com/Hypercube.htmlmathworld.wolfram.com/Hypercube.html

Page 50: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Perlin Simplex NoisePerlin Simplex NoiseBasic StepsBasic Steps

•• Transform to Transform to ““shearedsheared”” spacespace•• Which cell, cube, hypercube?Which cell, cube, hypercube?•• Transform cell origin backTransform cell origin back•• Which simplex?Which simplex?•• Sum nearest vertex contributionsSum nearest vertex contributions•• ScaleScale

Page 51: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Perlin Simplex NoisePerlin Simplex NoiseWhich simplex?Which simplex?……

X

Z

Y

Y>X>Z0,1,01,1,01,1,1 X>Y>Z

1,0,01,1,01,1,1

X>Z>Y1,0,01,0,11,1,1

Z>X>Y0,0,11,0,11,1,1

Y>Z>X0,1,00,1,11,1,1

Z>Y>X0,0,10,1,11,1,1

X>Y1,01,1

Y>X0,11,1Y

X

R2

R3

Page 52: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Perlin Simplex NoisePerlin Simplex Noise……Which simplex?Which simplex?

•• Original code was of form:Original code was of form:// To avoid nested (incoherent) // To avoid nested (incoherent) IFsIFs

// Calculate index into lookup texture, expensive// Calculate index into lookup texture, expensive

// Fetch lookup texture texel// Fetch lookup texture texel

// Calculate offset vectors from texel, not too expensive// Calculate offset vectors from texel, not too expensive

•• New code is of form:New code is of form:// NO nested (incoherent) // NO nested (incoherent) IFsIFs

// Accumulate stepping direction order, not as expensive// Accumulate stepping direction order, not as expensive

// NO texture lookup// NO texture lookup

// Calculate offset vectors from order, not too expensive// Calculate offset vectors from order, not too expensive

Page 53: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Perlin Simplex NoisePerlin Simplex Noise……Which simplex?Which simplex?

void simplex( const in vec3 P,void simplex( const in vec3 P,out vec3 offset1, out vec3 offset2 )out vec3 offset1, out vec3 offset2 )

{{vec3 offset0;vec3 offset0;

vec2 vec2 isXisX = step( = step( P.yzP.yz, , P.xxP.xx ); // ); // P.xP.x >= >= P[iP[i]]offset0.x = dot( offset0.x = dot( isXisX, vec2( 1.0 ) ); // o0.x = 0|1|2, vec2( 1.0 ) ); // o0.x = 0|1|2offset0.yz = 1.0 offset0.yz = 1.0 -- isXisX; // o0.yz = 0|1; // o0.yz = 0|1float float isYisY = step( = step( P.zP.z, , P.yP.y ); // ); // P.yP.y >= >= P.zP.zoffset0.y += offset0.y += isYisY; // o0.y = 0|1|2; // o0.y = 0|1|2offset0.z += 1.0 offset0.z += 1.0 -- isYisY; // o0.z = 0|1|2; // o0.z = 0|1|2offset2 = clamp( offset0, 0.0, 1.0 ); // 0,1,1|1,0,1|1,1,0offset2 = clamp( offset0, 0.0, 1.0 ); // 0,1,1|1,0,1|1,1,0offset1 = clamp( offset1 = clamp( ----offset0, 0.0, 1.0 ); // 1,0,0|0,1,0|0,0,1offset0, 0.0, 1.0 ); // 1,0,0|0,1,0|0,0,1

}}

Page 54: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Perlin Simplex NoisePerlin Simplex NoiseFractal noise exampleFractal noise example……

Page 55: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

Perlin Simplex NoisePerlin Simplex Noise““bluemarblebluemarble””

Page 56: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

BACKUPBACKUPDetailed API ChangesDetailed API Changes

•• OrangeOrange–– OpenGL 2.0OpenGL 2.0

•• BlueBlue–– ARB_shader_objectsARB_shader_objects–– ARB_vertex_shaderARB_vertex_shader–– ARB_fragment_shaderARB_fragment_shader

Page 57: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes2.7 Vertex Specification2.7 Vertex Specification……

void glVertexAttrib{1234}{sfd}( void glVertexAttrib{1234}{sfd}( GLuintGLuint indexindex,,

T T valuesvalues ););

void glVertexAttrib{123}{sfd}v( void glVertexAttrib{123}{sfd}v( GLuintGLuint indexindex,,

T T valuesvalues ););

void glVertexAttrib4{bsifd void glVertexAttrib4{bsifd ubusui}vubusui}v( ( GLuintGLuint indexindex,,

T T valuesvalues ););

void glVertexAttrib{1234}{sfd}void glVertexAttrib{1234}{sfd}ARBARB( ( GLuintGLuint indexindex,,

T T valuesvalues ););

void glVertexAttrib{123}{sfd}vvoid glVertexAttrib{123}{sfd}vARBARB( ( GLuintGLuint indexindex,,

T T valuesvalues ););

void glVertexAttrib4{bsifd void glVertexAttrib4{bsifd ubusui}vubusui}vARBARB( ( GLuintGLuint indexindex,,

T T valuesvalues ););

Page 58: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes2.7 2.7 ……Vertex SpecificationVertex Specification

void glVertexAttrib4Nub( void glVertexAttrib4Nub( GLuintGLuint indexindex,,

T T valuesvalues ););

void glVertexAttrib4N{bsi void glVertexAttrib4N{bsi ubusui}vubusui}v( ( GLuintGLuint indexindex,,

T T valuesvalues ););

void glVertexAttrib4Nubvoid glVertexAttrib4NubARBARB( ( GLuintGLuint indexindex,,

T T valuesvalues ););

void glVertexAttrib4N{bsi void glVertexAttrib4N{bsi ubusui}vubusui}vARBARB( ( GLuintGLuint indexindex,,

T T valuesvalues ););

Page 59: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes2.15.1 Shader Objects2.15.1 Shader Objects……

GLuintGLuint glCreateShaderglCreateShader( ( GLenumGLenum typetype ););

GLhandleARBGLhandleARB glCreateShaderglCreateShaderObjectARBObjectARB( ( GLenumGLenum shaderTypeshaderType ););

void void glShaderSourceglShaderSource( ( GLuintGLuint shader,shader,

GLsizeiGLsizei countcount,,

const const GLcharGLchar ****stringstring, const Glint *, const Glint *lengthlength ););

void void glShaderSourceglShaderSourceARBARB( ( GLhandleARBGLhandleARB shaderOjbshaderOjb,,

GLsizeiGLsizei countcount,,

const const GLcharARBGLcharARB ****stringstring, const , const GLintGLint **lengthlength ););

void void glCompileShaderglCompileShader( ( GLuintGLuint shadershader ););

void void glCompileShaderglCompileShaderARBARB( ( GLhandleARBGLhandleARB shaderObjshaderObj ););

Page 60: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes2.15.1 2.15.1 ……Shader ObjectsShader Objects

void void glDeleteglDeleteShaderShader( ( GLuintGLuint shadershader ););

void void glDeleteglDeleteObjectARBObjectARB( ( handleARBhandleARB objobj ););

GLuintGLuint glCreateProgramglCreateProgram( void );( void );

GLhandleARBGLhandleARB glCreateProgramglCreateProgramObjectARBObjectARB( void );( void );

void void glAttachglAttachShaderShader( ( GLuintGLuint programprogram, , GLuintGLuint shadershader ););

void void glAttachglAttachObjectARBObjectARB( ( GLhandleARBGLhandleARB containerObjcontainerObj,,

GLhandleARBGLhandleARB objobj ););

void void glDetachglDetachShaderShader( ( GLuintGLuint programprogram, , GLuintGLuint shadershader ););

void void glDetachglDetachObjectARBObjectARB( ( GLhandleARBGLhandleARB containerObjcontainerObj,,

GLhandleARBGLhandleARB attachedObjattachedObj ););

Page 61: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes2.15.2 Program Objects2.15.2 Program Objects

void void glLinkProgramglLinkProgram( ( GLuintGLuint programprogram ););

void void glLinkProgramglLinkProgramARBARB( ( GLhandleARBGLhandleARB programObjprogramObj ););

void void glUseProgramglUseProgram( ( GLuintGLuint programprogram ););

void void glUseProgramglUseProgramARBARB( ( GLhandleARBGLhandleARB programObjprogramObj ););

void void glDeleteglDeleteProgramProgram( ( GLuintGLuint programprogram ););

void void glDeleteglDeleteObjectARBObjectARB( ( GLhandleARBGLhandleARB objobj ););

Page 62: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes2.15.3 Shader Variables2.15.3 Shader Variables……

void void glGetActiveAttribglGetActiveAttrib( ( GLuintGLuint programprogram,,

GLuintGLuint indexindex, , GLsizeiGLsizei bufSizebufSize,,

GLsizeiGLsizei **lengthlength, Glint *, Glint *sizesize,,

GLenumGLenum **typetype, , GLcharGLchar **namename ););

void void glGetActiveAttribglGetActiveAttribARBARB( ( GLhandleARBGLhandleARB programObjprogramObj,,

GLuintGLuint indexindex, , GLsizeiGLsizei maxLengthmaxLength,,

GLsizeiGLsizei **lengthlength, Glint *, Glint *sizesize,,

GLenumGLenum **typetype GLcharARBGLcharARB **namename ););

Page 63: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes2.15.3 2.15.3 ……Shader VariablesShader Variables

GLintGLint glGetAttribLocationglGetAttribLocation( ( GLuintGLuint programprogram,,

const char *const char *namename ););

GLintGLint glGetAttribLocationglGetAttribLocationARBARB( ( GLhandleARBGLhandleARB programObjprogramObj, , const const charARBcharARB **namename ););

void void glBindAttribLocationglBindAttribLocation( ( GLuintGLuint programprogram,,

GLuintGLuint indexindex, const , const GLcharGLchar **namename ););

void void glBindAttribLocationglBindAttribLocationARBARB( ( GLhandleARBGLhandleARB programObjprogramObj,,

GLuintGLuint indexindex, const , const GLcharGLchar **namename ););

Page 64: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes2.15.3 2.15.3 ……Shader VariablesShader Variables

GLintGLint glGetUniformLocationglGetUniformLocation( ( GLuintGLuint programprogram,,

const const GLcharGLchar **namename ););

GLintGLint glGetUniformLocationglGetUniformLocationARBARB( ( GLhandleARBGLhandleARB programObjprogramObj,,

const const GLcharARBGLcharARB **namename ););

void void glGetActiveUniformglGetActiveUniform( ( GLuintGLuint programprogram,,

GLuintGLuint index,index, GLsizeiGLsizei bufSizebufSize,,

GLsizeiGLsizei **lengthlength, , GLintGLint **sizesize,,

GLenumGLenum **typetype, , GLcharGLchar **namename ););

Void Void glGetActiveUniformglGetActiveUniformARBARB( ( GLhandleARBGLhandleARB programObjprogramObj,,

GLuintGLuint indexindex, , GLsizeiGLsizei maxLengthmaxLength,,

GLsizeiGLsizei **lengthlength, Glint *, Glint *sizesize,,

GLenumGLenum **typetype, , GLcharARBGLcharARB *name );*name );

Page 65: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes2.15.3 2.15.3 ……Shader VariablesShader Variables

void glUniform{1234}{if}( void glUniform{1234}{if}( GLintGLint locationlocation, T , T valuevalue ););

void glUniform{1234}{if}v( void glUniform{1234}{if}v( GLintGLint locationlocation,,

GLsizeiGLsizei countcount, T , T valuesvalues ););

void glUniformMatrix{234}fv( void glUniformMatrix{234}fv( GLintGLint locationlocation,,

GLsizeiGLsizei countcount, , GLbooleanGLboolean transposetranspose,,

const float *const float *valuevalue ););

void glUniform{1234}{if}void glUniform{1234}{if}ARBARB( ( GLintGLint locationlocation, T , T valuevalue ););

void glUniform{1234}{if}vvoid glUniform{1234}{if}vARBARB( ( GLintGLint locationlocation,,

GLsizeiGLsizei countcount, T , T valuesvalues ););

void glUniformMatrix{234}fvvoid glUniformMatrix{234}fvARBARB( ( GLintGLint locationlocation,,

GLsizeiGLsizei countcount, , GLbooleanGLboolean transposetranspose,,

const float *const float *valuevalue ););

Page 66: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes2.15.4 Shader Execution2.15.4 Shader Execution

void void glValidateProgramglValidateProgram( ( GLuintGLuint programprogram ););

void void glValidateProgramglValidateProgramARBARB( ( GLhandleARBGLhandleARB programObjprogramObj ););

Page 67: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes6.1.11 Pointer/String Queries6.1.11 Pointer/String Queries

GLubyteGLubyte **glGetStringglGetString( GL_SHADING_LANGUAGE_VERSION );( GL_SHADING_LANGUAGE_VERSION );

Page 68: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API Changes API Changes –– NewNew6.1.14 Shader/Program Queries6.1.14 Shader/Program Queries……

GLbooleanGLboolean glIsShaderglIsShader( ( GLuintGLuint shadershader ););

void void glGetShaderivglGetShaderiv( ( GLuintGLuint shadershader, , GLenumGLenum pnamepname,,

GLintGLint **paramsparams ););

GLbooleanGLboolean glIsProgramglIsProgram( ( GLuintGLuint programprogram ););

void void glGetProgramivglGetProgramiv( ( GLuintGLuint programprogram, , GLenumGLenum pnamepname,,

GLintGLint **paramsparams ););

void void glGetObjectParameterfvARBglGetObjectParameterfvARB( ( GLhandleARBGLhandleARB objobj,,

GLenumGLenum pnamepname, , GLfloatGLfloat **paramsparams ););

void void glGetObjectParameterivglGetObjectParameterivARBARB( ( GLhandleARBGLhandleARB objobj,,

GLenumGLenum pnamepname, , GLintGLint **paramsparams ););

Page 69: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes6.1.14 6.1.14 ……Shader/Program QueriesShader/Program Queries

void void glGetAttachedglGetAttachedShadersShaders( ( GLuintGLuint programprogram,,

GLsizeiGLsizei maxCountmaxCount, , GLsizeiGLsizei **countcount, , uintuint **shadersshaders ););

void void glGetAttachedglGetAttachedObjectsARBObjectsARB( ( GLhandleARBGLhandleARB containerObjcontainerObj,,

GLsizeiGLsizei maxCountmaxCount, , GLsizeiGLsizei **count, count, GLuintGLuint **objobj ););

void void glGetglGetShaderInfoLogShaderInfoLog( ( GLuintGLuint shadershader, , GLsizeiGLsizei bufSizebufSize,,GLsizeiGLsizei **lengthlength, , GLcharGLchar **infoLoginfoLog ););

void void glGetglGetProgramInfoLogProgramInfoLog( ( GLuintGLuint programprogram, , GLsizeiGLsizei bufSizebufSize,,GLsizeiGLsizei **lengthlength, , GLcharGLchar **infoLoginfoLog ););

void void glGetglGetInfoLogARBInfoLogARB( ( GLhandleARBGLhandleARB objobj, , GLsizeiGLsizei maxLengthmaxLength,,GLsizeiGLsizei **lengthlength, , GLcharGLchar **infoLoginfoLog ););

Page 70: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes6.1.14 6.1.14 ……Shader/Program QueriesShader/Program Queries

void void glGetShaderSourceglGetShaderSource( ( GLuintGLuint shadershader, , GLsizeiGLsizei bufSizebufSize,,GLsizeiGLsizei **lengthlength, , GLcharGLchar *source*source ););

void void glGetShaderSourceglGetShaderSourceARBARB( ( GLhandleARBGLhandleARB objobj, , GLsizeiGLsizei maxLengthmaxLength,,GLsizeiGLsizei **lengthlength, , GLcharGLchar *source*source ););

Page 71: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes6.1.14 6.1.14 ……Shader/Program QueriesShader/Program Queries

void void glGetVertexAttribdvglGetVertexAttribdv( ( GLuintGLuint index, index, GLenumGLenum pnamepname,,GLdoubleGLdouble **paramsparams ););

void void glGetVertexAttribfvglGetVertexAttribfv( ( GLuintGLuint index, index, GLenumGLenum pnamepname,,GlfloatGlfloat **paramsparams ););

void void glGetVertexAttribivglGetVertexAttribiv( ( GLuintGLuint index, index, GLenumGLenum pnamepname,,GLintGLint **paramsparams ););

void void glGetVertexAttribPointervglGetVertexAttribPointerv( ( GLuintGLuint index, index, GLenumGLenum pnamepname,,void **pointer );void **pointer );

void void glGetVertexAttribdvglGetVertexAttribdvARBARB( ( GLuintGLuint index, index, GLenumGLenum pnamepname,,GLdoubleGLdouble **paramsparams ););

void void glGetVertexAttribfvglGetVertexAttribfvARBARB( ( GLuintGLuint index, index, GLenumGLenum pnamepname,,GlfloatGlfloat **paramsparams ););

void void glGetVertexAttribivglGetVertexAttribivARBARB( ( GLuintGLuint index, index, GLenumGLenum pnamepname,,GLintGLint **paramsparams ););

void void glGetVertexAttribPointervglGetVertexAttribPointervARBARB( ( GLuintGLuint index, index, GLenumGLenum pnamepname,,void **pointer );void **pointer );

Page 72: OpenGL Shading Language - AMD · Original code was of form: // To avoid nested (incoherent) IFs // Calculate index into lookup texture, expensive •

API ChangesAPI Changes6.1.14 6.1.14 ……Shader/Program QueriesShader/Program Queries

void void glGetUniformfvglGetUniformfv( ( GLuintGLuint programprogram,,

Glint Glint locationlocation, , GLfloatGLfloat **paramsparams ););

void void glGetUniformivglGetUniformiv( ( GLuintGLuint programprogram,,

Glint Glint locationlocation, , GLintGLint **paramsparams ););

void void glGetUniformfvglGetUniformfvARBARB( ( GLhandleARBGLhandleARB programObjprogramObj,,

Glint Glint locationlocation, , GLfloatGLfloat **paramsparams ););

void void glGetUniformivglGetUniformivARBARB( ( GLhandleARBGLhandleARB programObjprogramObj,,

Glint Glint locationlocation, , GLintGLint **paramsparams ););