traditional graphics pipelinecs5600/slides/glsl.pdf · 2013. 1. 17. · 1 1 january 2008 an...

6
1 An Introduction to the OpenGL Shading Language 1 January 2008 Traditional Graphics Pipeline CPU Application Display List Polynomial Evaluator Per Vertex Operations & Primitive Assembly Rasterization Per Fragment Operations Frame Buffer Texture Memory Pixel Operations An Introduction to the OpenGL Shading Language 2 January 2008 Xform Lighting Projection Clipping etc Traditional Graphics Pipeline CPU Application Display List Polynomial Evaluator Per Vertex Operations & Primitive Assembly Rasterization Per Fragment Operations Frame Buffer Texture Memory Pixel Operations An Introduction to the OpenGL Shading Language 3 January 2008 Traditional Graphics Pipeline A simplified graphics pipeline ! Note that pipe widths vary ! Many caches, FIFOs, and so on not shown GPU CPU Application Transform Rasterizer Shade Video Memory (Textures) An Introduction to the OpenGL Shading Language 4 January 2008 An Introduction to the OpenGL Shading Language 5 January 2008 An Introduction to the OpenGL Shading Language 6 January 2008

Upload: others

Post on 03-Dec-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Traditional Graphics Pipelinecs5600/slides/GLSL.pdf · 2013. 1. 17. · 1 1 January 2008 An Introduction to the OpenGL Shading Language Traditional Graphics Pipeline CPU Application

1

An Introduction to the OpenGL Shading Language 1 January 2008

Traditional Graphics Pipeline

CPU

Application Display List

Polynomial Evaluator

Per Vertex Operations &

Primitive Assembly

Rasterization Per Fragment

Operations Frame Buffer

Texture Memory

Pixel Operations

An Introduction to the OpenGL Shading Language 2 January 2008

Xform Lighting

Projection Clipping

etc

Traditional Graphics Pipeline

CPU

Application Display List

Polynomial Evaluator

Per Vertex Operations &

Primitive Assembly

Rasterization Per Fragment

Operations Frame Buffer

Texture Memory

Pixel Operations

An Introduction to the OpenGL Shading Language 3 January 2008

Traditional Graphics Pipeline

A simplified graphics pipeline

!! Note that pipe widths vary

!! Many caches, FIFOs, and so on not shown

GPU CPU

Application Transform Rasterizer Shade Video Memory

(Textures)

An Introduction to the OpenGL Shading Language 4 January 2008

An Introduction to the OpenGL Shading Language 5 January 2008 An Introduction to the OpenGL Shading Language 6 January 2008

Page 2: Traditional Graphics Pipelinecs5600/slides/GLSL.pdf · 2013. 1. 17. · 1 1 January 2008 An Introduction to the OpenGL Shading Language Traditional Graphics Pipeline CPU Application

2

An Introduction to the OpenGL Shading Language 7 January 2008 An Introduction to the OpenGL Shading Language 8 January 2008

An Introduction to the OpenGL Shading Language 9 January 2008 An Introduction to the OpenGL Shading Language 10 January 2008

An Introduction to the OpenGL Shading Language 11 January 2008 An Introduction to the OpenGL Shading Language 12 January 2008

Page 3: Traditional Graphics Pipelinecs5600/slides/GLSL.pdf · 2013. 1. 17. · 1 1 January 2008 An Introduction to the OpenGL Shading Language Traditional Graphics Pipeline CPU Application

3

An Introduction to the OpenGL Shading Language 13 January 2008 An Introduction to the OpenGL Shading Language 14 January 2008

An Introduction to the OpenGL Shading Language 15 January 2008 An Introduction to the OpenGL Shading Language 16 January 2008

An Introduction to the OpenGL Shading Language 17 January 2008

Fixed Functionality Pipeline

API

Transform and

Lighting Rasterizer Primitive

Assembly

Texture Environment

Depth Stencil

Color Sum

Alpha Test

Fog

Dither Color Buffer Blend

Vertex Buffer

Objects

Vertices

Triangles/Lines/Points

Primitive Processing

Frame Buffer

An Introduction to the OpenGL Shading Language 18 January 2008

Programmable Shader Pipeline

API

Vertex Shader Rasterizer Primitive

Assembly

Fragment Shader

Depth Stencil Dither

Color Buffer Blend

Vertex Buffer

Objects

Vertices

Triangles/Lines/Points

Primitive Processing

Frame Buffer Alpha Test

Page 4: Traditional Graphics Pipelinecs5600/slides/GLSL.pdf · 2013. 1. 17. · 1 1 January 2008 An Introduction to the OpenGL Shading Language Traditional Graphics Pipeline CPU Application

4

An Introduction to the OpenGL Shading Language 19 January 2008

Programmer’s Model

Vertex Shader

Fragment Shader

Primitive Assembly

& Rasterize

Per-Sample Operations

Attributes (m * vec4)

Vertex Uniforms (p * vec4)

Varyings (n * vec4)

Fragment Uniforms (q * vec4)

An Introduction to the OpenGL Shading Language 20 January 2008

An Introduction to the OpenGL Shading Language 21 January 2008

Vertex Shader Environment

Attribute 0

Uniforms Textures

Attribute 1 Attribute 2 Attribute 3 Attribute 4 Attribute 5

… Attribute m

Varying 0 Varying 1 Varying 2 Varying 3 Varying 4 Varying 5

… Varying n

Temporary variables

Clip position

Vertex Shader

Point size

An Introduction to the OpenGL Shading Language 22 January 2008

An Introduction to the OpenGL Shading Language 23 January 2008 An Introduction to the OpenGL Shading Language 24 January 2008

Fragment Shader Environment

Uniforms Textures

Temporary variables

Fragment Color(s)

Varying 0 Varying 1 Varying 2 Varying 3 Varying 4 Varying 5

… Varying n

Fragment Shader

Window coord Front facing flag

Point coord

Fragment Depth

Page 5: Traditional Graphics Pipelinecs5600/slides/GLSL.pdf · 2013. 1. 17. · 1 1 January 2008 An Introduction to the OpenGL Shading Language Traditional Graphics Pipeline CPU Application

5

An Introduction to the OpenGL Shading Language 25 January 2008 An Introduction to the OpenGL Shading Language 26 January 2008

Hello World!

void main(void) { // This is our Hello World vertex shader

// Standard MVP transform gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }

void main(void) { // This is our Hello World fragment shader

// Set to a constant color (hint: look at it upside down) gl_FragColor = vec4(0.7734); }

An Introduction to the OpenGL Shading Language 27 January 2008

Basic method

2 basic object types

!! Shader object

!! Program object

Create Vertex & Fragment Shader Objects

Compile both

Create program object & attach shaders

Link program

Use program

An Introduction to the OpenGL Shading Language 28 January 2008

Creating Shaders

An Introduction to the OpenGL Shading Language 29 January 2008

Compiling

void glShaderSource(GLuint shader, GLsizei nstrings, const GLchar **strings, const GLint *lengths)

//if lengths==NULL, assumed to be null-terminated

void glCompileShader (GLuint shader);

An Introduction to the OpenGL Shading Language 30 January 2008

Attaching & Linking

void glAttachShader(GLuint program, GLuint shader);

//twice, once for vertex shader & once for fragment shader

void glLinkProgram(GLuint program);

//program now ready to use

void glUseProgram(GLuint program);

//switches on shader, bypasses FFP

//if program==0, shaders turned off, returns to FFP

Page 6: Traditional Graphics Pipelinecs5600/slides/GLSL.pdf · 2013. 1. 17. · 1 1 January 2008 An Introduction to the OpenGL Shading Language Traditional Graphics Pipeline CPU Application

6

An Introduction to the OpenGL Shading Language 31 January 2008

In short… GLuint programObject;

GLuint vertexShaderObject;

GLuint fragmentShaderObject;

unsigned char *vertexShaderSource = readShaderFile(vertexShaderFilename);

unsigned char *fragmentShaderSource = readShaderFile(fragmentShaderFilename);

programObject=glCreateProgram ();

vertexShaderObject=glCreateShader (GL_VERTEX_SHADER);

fragmentShaderObject=glCreateShader (GL_FRAGMENT_SHADER);

glShaderSource (vertexShaderObject,1,(const char**)&vertexShaderSource,NULL);

glShaderSource (fragmentShaderObject,1,(const char**)&fragmentShaderSource,NULL);

glCompileShader (vertexShaderObject);

glCompileShader (fragmentShaderObject);

glAttachObject (programObject, vertexShaderObject);

glAttachObject (programObject, fragmentShaderObject);

glLinkProgram (programObject);

glUseProgram (programObject);

An Introduction to the OpenGL Shading Language 32 January 2008

Example

void setShaders() { char *vs,*fs;

v = glCreateShader(GL_VERTEX_SHADER); f = glCreateShader(GL_FRAGMENT_SHADER);

vs = textFileRead("toon.vert"); fs = textFileRead("toon.frag");

const char * vv = vs; const char * ff = fs;

glShaderSource(v, 1, &vv,NULL); glShaderSource(f, 1, &ff,NULL);

free(vs);free(fs);

glCompileShader(v); glCompileShader(f);

p = glCreateProgram();

glAttachShader(p,v); glAttachShader(p,f);

glLinkProgram(p); glUseProgram(p);

}

An Introduction to the OpenGL Shading Language 33 January 2008

Other functions

Clean-up

void glDetachObject (GLuint container, GLuint attached); void glDeleteObject (GLuint object);

Info Log

void glGetInfoLog (GLuint object, GLsizei maxLength, GLsizei *length, GLchar *infoLog);

!! Returns compile & linking information, errors

An Introduction to the OpenGL Shading Language 34 January 2008

Useful References

http://www.3dshaders.com/

!! Home page for the “orange book” focused solely on GLSL

http://www.opengl.org/sdk/

!! OpenGL SDK, including links to the below resources

http://www.opengl.org/sdk/libs/OpenSceneGraph/glsl_quickref.pdf

!! one double-sided page cheat sheet to GLSL – indispensible!

http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf

!! This is the ultimate authority: the GLSL specification document

http://www.opengl.org/sdk/docs/books/SuperBible/

!! Full reference and tutorial to OpenGL 2.1

!! All sample code downloadable for Windows, Mac OS X, and Linux