42
OpenGL Shading Language (GLSL)

OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Embed Size (px)

Citation preview

Page 1: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

OpenGL Shading Language (GLSL)

Page 2: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

OpenGL Rendering Pipeline

Page 3: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Vertex Shader Vertex

transformation Normal

transformation & normalization

Texture coordinate generation & transformation

Per-vertex lighting

Page 4: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Geometry Shader Add/remove

primitives Add/remove vertices Edit vertex position Supported by OpenGL

Extension(Glew 1.4+) or DX10

Page 5: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Fragment (pixel) Shader Operations on

interpolated values

Texture access Texture

application Fog Color sum

Page 6: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Qualifiers Used to management the input and

output of shaders. attribute

Communicate frequently changing variables from the application to a vertex shader.

uniform Communicate infrequently changing variables

from the application to any shader. varying

Communicate interpolated variables from a vertex shader to a fragment shader

Page 7: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Qualifiers in pipeline

VertexShader

uniform

attribute varyin

g

FragmentShader

rasterizer

Buffer Op…varyin

g

(x’,y’,z’)

(x,y,z)

Page 8: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Qualifiers in pipeline

VertexShader

uniform

attribute

varying in

FragmentShader

rasterizer

varying out

(x,y,z)

GeometryShader

Page 9: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Vertex Shader

Page 10: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Fragment Shader

Page 11: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Geometry Shader

Vertex Color

gl_FrontColorIn[gl_VerticesIn];gl_BackColorIn[gl_VerticesIn];gl_FrontSecondaryColorIn[gl_VerticesIn];gl_BackSecondaryColorIn[gl_VerticesIn];gl_FogFragCoordIn[gl_VerticesIn];

Geometryprocessor

Color

gl_FrontColor;gl_BackColor;gl_FrontSecondaryColor;gl_BackSecondaryColor;gl_FogFragCoord;

Vertex Coord.

gl_TexCoordIn[gl_VerticesIn][];gl_PositionIn[gl_VerticesIn];

Resterization Info.

gl_PointSizeIn[gl_VerticesIn];gl_ClipVertexIn[gl_VerticesIn];

Coord.

gl_Positiongl_TexCoord[];

Number of Verticesgl_VerticesIn

Page 12: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

GLSL Language Definition Data Type Description

int Integer float Floating-point bool Boolean (true or false). vec2 Vector with two floats. vec3 Vector with three floats. vec4 Vector with four floats. mat22x2 floating-point matrix. mat33x3 floating-point matrix. mat44x4 floating-point matrix.

Page 13: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Vector Vector is like a class You can use following to access

.r .g .b .a .x .y .z .w .s .t .p .q

Example:vec4 color;

color.rgb = vec3(1.0 , 1.0 , 0.0 ); color.a = 0.5or color = vec4(1.0 , 1.0 , 0.0 , 0.5); or color.xy = vec2(1.0 , 1.0); color.zw =vec2(0.0 , 0.5);

Page 14: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Texture Sampler

sampler{1,2,3}D sampler{1,2}DShadow samplerCube

sampler{1,2,3}D Texture unit to access the content of

texture. sampler*DShadow

The depth texture for shadow map. samplerCube

The cube map.

Page 15: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Addition information

Array Similar to C. No union, enum, class

Static cast by function float() int()

Page 16: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Phong Shading

Use varying variable to save the vertex normal or other information.

Compute the Phong lighting in pixel shader with the information.

Page 17: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Vertex Shader Code Examplevarying vec3 normal, lightDir, eyeDir;

void main(){

normal = gl_NormalMatrix * gl_Normal;

vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex);

lightDir = vec3(gl_LightSource[0].position.xyz - vVertex);eyeDir = -vVertex;

gl_Position = ftransform();}

Page 18: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Fragment Shader Code Examplevarying vec3 normal, lightDir, eyeDir;

void main (void){

vec4 final_color = (gl_FrontLightModelProduct.sceneColor * gl_FrontMaterial.ambient) + (gl_LightSource[0].ambient * gl_FrontMaterial.ambient);

vec3 N = normalize(normal);vec3 L = normalize(lightDir);

float lambertTerm = dot(N,L);

if(lambertTerm > 0.0){

final_color += gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse * lambertTerm;

vec3 E = normalize(eyeDir);vec3 R = reflect(-L, N);float specular = pow( max(dot(R, E), 0.0), gl_FrontMaterial.shininess );final_color += gl_LightSource[0].specular * gl_FrontMaterial.specular * specular;

}

gl_FragColor = final_color;}

Page 19: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Result

OpenGL Gouraud Shading GLSL Phong Shading

Page 20: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Geometry Shader

It can change the primitive. Add/remove primitives Add/remove vertices Edit vertex position

Application

Page 21: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Geometry Shader Example Codevoid main(void){

vec2 lineDir = gl_PositionIn[1].xy - gl_PositionIn[0].xy;vec2 normal = vec2(-lineDir.y, lineDir.x); //CCW 90 degree

vec4 v[4];v[0] = gl_PositionIn[1];v[1] = gl_PositionIn[1];v[2] = gl_PositionIn[0];v[3] = gl_PositionIn[0];

v[0].xy -= normal*0.125;v[1].xy += normal*0.125;v[2].xy += normal*0.125;v[3].xy -= normal*0.125;

Page 22: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

gl_Position = v[0];EmitVertex();gl_Position = v[1];EmitVertex();gl_Position = v[2];EmitVertex();gl_Position = v[3];EmitVertex();gl_Position = v[0];EmitVertex();EndPrimitive(); // GL_LINE_STRIP

}

Page 23: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Result

Original input primitive

Output primitive

Page 24: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

New input primitives GL_LINES_ADJACENCY_EXT GL_LINE_STRIP_ADJACENCY_EXT GL_TRIANGLES_ADJACENCY_EXT GL_TRIANGLE_STRIP_ADJECENCY_EXT

Page 25: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Applications

Page 26: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Applications

Page 27: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Use GLSL in OpenGL

You need those head and library files glew.h wglew.h glew32.lib glew32s.lib glew32.dll

Page 28: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Use the shader code in C/C++

Initialize the shader. Use the shader you made. Draw what you want.

Page 29: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Shader Initialization

Page 30: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Part of Example Code (C++)int main(int argc, char **argv) {

glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);glutInitWindowPosition(100,100);glutInitWindowSize(320,320);glutCreateWindow("GPU");

.

.

.glewInit();setShaders();glutMainLoop();return 0;

}

Page 31: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

void setShaders() {

//a few strings// will hold onto the file read in!char *vs = NULL, *fs = NULL, *gs = NULL;

//First, create our shaders v = glCreateShader(GL_VERTEX_SHADER);f = glCreateShader(GL_FRAGMENT_SHADER);g = glCreateShader(GL_GEOMETRY_SHADER_EXT);

//Read in the programsvs = textFileRead("../GeometryShader/ShaderCode/shader.vert");fs = textFileRead("../GeometryShader/ShaderCode/shader.frag");gs = textFileRead("../GeometryShader/ShaderCode/shader.geom");

Page 32: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

//Setup a few constant pointers for belowconst char * ff = fs;const char * vv = vs;const char * gg = gs;

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

free(vs);free(fs);free(gs);

glCompileShader(v);glCompileShader(f);glCompileShader(g);

p = glCreateProgram();

Page 33: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

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

glProgramParameteriEXT(p,GL_GEOMETRY_INPUT_TYPE_EXT,GL_LINES);glProgramParameteriEXT(p,GL_GEOMETRY_OUTPUT_TYPE_EXT,GL_LINE_STRIP);

int temp;glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT,&temp);glProgramParameteriEXT(p,GL_GEOMETRY_VERTICES_OUT_EXT,temp);

glLinkProgram(p);glUseProgram(p);

}

Page 34: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Send texture to shader

Active texture channel Bind the texture Get location of the variable in

shader Set the value

Page 35: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Multi-texture

Op 0

Op 1

Op 2

Op 3

glActiveTextureARB( GL_TEXTURE0_ARB );glBindTexture(GL_TEXTURE_2D, …);

glActiveTextureARB( GL_TEXTURE1_ARB );glBindTexture(GL_TEXTURE_2D, …);

glActiveTextureARB( GL_TEXTURE2_ARB );glBindTexture(GL_TEXTURE_2D, …);

glActiveTextureARB( GL_TEXTURE3_ARB );glBindTexture(GL_TEXTURE_2D, …);

Pixel Color

final color

Page 36: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Shader

glActiveTextureARB( GL_TEXTURE0_ARB );glBindTexture(GL_TEXTURE_2D, …);

glActiveTextureARB( GL_TEXTURE1_ARB );glBindTexture(GL_TEXTURE_2D, …);

glActiveTextureARB( GL_TEXTURE2_ARB );glBindTexture(GL_TEXTURE_2D, …);

glActiveTextureARB( GL_TEXTURE3_ARB );glBindTexture(GL_TEXTURE_2D, …);

final color

Shader

Get location by name

Assign channel number

Page 37: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Get location Glint

glGetUniformLocationARB(GLhandleARBprogram, const GLcharARB *name)

– Return an integer to represent the location of a specific uniform variable.

– name is the name of the uniform variable in the shader.– The location of a variable is assigned in link time, so this

function should be called after the link stage.

Page 38: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Set value Following functions are used to assign values for uniform

variables– Void glUniform{1,2,3,4}{f,i}ARB(Glint location, TYPE v)– Void glUniform{1,2,3,4}{f,i}vARB(Glint location, Gluint count,

TYPE v)– Void glUniformMatrix{2,3,4}fvARB(Glint location,GLuint count, GLboolean transpose, const GLfloat *v)

location is the value obtained using glGetUniformLocationARB().

v is the value to be assigned.

Page 39: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Texture Mapping C++ Code

glUseProgramObjectARB(MyShader);

glActiveTextureARB( GL_TEXTURE0_ARB );glBindTexture(GL_TEXTURE_2D, texObject[0]);GLint location = glGetUniformLocationARB(MyShader, "colorTexture");if(location == -1) printf("Cant find texture name: colorTexture\n");else glUniform1iARB(location, 0);

int i,j;for (i=0;i < object->fTotal;i++){

glBegin(GL_POLYGON);for (j=0;j<3;j++){

glMultiTexCoord2fv(GL_TEXTURE0_ARB, object->tList[object->faceList[i][j].t].ptr);glNormal3fv(object->nList[object->faceList[i][j].n].ptr);glVertex3fv(object->vList[object->faceList[i][j].v].ptr);

}glEnd();

}

glutSwapBuffers();glutPostRedisplay();

}

Page 40: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Texture Mapping Vertex Shader Code

void main(){

gl_TexCoord[0].xy = gl_MultiTexCoord0.xy;gl_Position = ftransform();

}

Page 41: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Texture Mapping Pixel Shader Code

uniform sampler2D colorTexture;

void main (void){

gl_FragColor = texture2D(colorTexture,gl_TexCoord[0].xy).rgba;

}

Page 42: OpenGL Shading Language (GLSL). OpenGL Rendering Pipeline

Result 2