Presentation is loading. Please wait.

Presentation is loading. Please wait.

OpenGL Shading Language (GLSL)

Similar presentations


Presentation on theme: "OpenGL Shading Language (GLSL)"— Presentation transcript:

1 OpenGL Shading Language (GLSL)

2 OpenGL Fixed Pipeline Vertex pipeline Transformation & Lighting
Viewport culling & clipping Primitive assembly Rasterizer setup Pixel pipeline Texture blending Per Fragment operations Buffer operations Framebuffer

3 Vertex Shader Vertex transformation
Normal transformation & normalization Texture coordinate generation & transformation Per-vertex lighting Transformation & Lighting Primitive assembly Viewport culling & clipping Vertex processor Rasterizer setup

4 Geometry Shader Add/remove primitives Add/remove vertices
Edit vertex position Supported by OpenGL Extension (Glew 1.4+) or DX10 Stream output Vertex processor Primitive assembly Viewport culling & clipping Geometry processor Rasterizer setup

5 Fragment (pixel) Shader
Operations on interpolated values Texture access Texture application Fog Color sum Rasterizer setup Texture blending Per Fragment operations Buffer operations Fragment processor

6 Programmable Pipeline
Vertex pipeline Viewport culling & clipping Vertex Shader Geometry Shader Rasterizer setup Pixel pipeline Pixel Shader Per Fragment operations Buffer operations Framebuffer

7 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

8 Qualifiers in Pipeline
(x,y,z) (x’,y’,z’) Vertex Shader Fragment Shader attribute rasterizer Buffer Op… varying varying uniform

9 Qualifiers in Pipeline
(x,y,z) Vertex Shader Geometry Shader Fragment Shader attribute rasterizer varying in varying out uniform

10 Vertex Shader Vertex processer Build-in Uniform: gl_ModelviewMatrix
Build-in Attributes: gl_Color gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1 User-defined Attributes: Tangent Bitangent Build-in Uniform: gl_ModelviewMatrix gl_ProjectionMatrix gl_LightSource[0~n] gl_FrontMaterial User-defined Uniform: Texture EyePosition Time ScaleValue Vertex processer Build-in Varying: gl_FrontColor gl_TexCoord[0~n] Special Output: gl_Position gl_PointSize User-defined Varying: normal tangent

11 Fragment Shader Fragment processer Build-in Varying: gl_TexCoord[0~n]
gl_FragCoord gl_FrontColor User-defined Varying: normal tangent Build-in Uniform: gl_ModelviewMatrix gl_ProjectionMatrix gl_LightSource[0~n] gl_FrontMaterial User-defined Uniform: Texture EyePosition Time ScaleValue Fragment processer Special Output: gl_FragColor / gl_FragData[] gl_FragDepth

12 Geometry Shader Geometry processor Coord. gl_Position gl_TexCoord[];
Vertex Color gl_FrontColorIn[gl_VerticesIn]; gl_BackColorIn[gl_VerticesIn]; gl_FrontSecondaryColorIn[gl_VerticesIn]; gl_BackSecondaryColorIn[gl_VerticesIn]; gl_FogFragCoordIn[gl_VerticesIn]; Vertex Coord. gl_TexCoordIn[gl_VerticesIn][]; gl_PositionIn[gl_VerticesIn]; Resterization Info. gl_PointSizeIn[gl_VerticesIn]; gl_ClipVertexIn[gl_VerticesIn]; Geometry processor Number of Vertices gl_VerticesIn Color gl_FrontColor; gl_BackColor; gl_FrontSecondaryColor; gl_BackSecondaryColor; gl_FogFragCoord; Coord. gl_Position gl_TexCoord[];

13 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. mat2 2x2 floating-point matrix. mat3 3x3 floating-point matrix. mat4 4x4 floating-point matrix.

14 Vector Vector is like a class You can use following to access Example:
.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.5 or 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);

15 Texture Sampler sampler*DShadow sampler{1,2,3}D sampler{1,2}DShadow
samplerCube Texture unit to access the content of texture. sampler*DShadow The depth texture for shadow map. The cube map.

16 Addition Information Array Static cast by function Similar to C.
No union, enum, class Static cast by function float() int()

17 Phong Shading Use varying variable to save the vertex normal or other information. Compute the Phong lighting in pixel shader with the information.

18 Vertex Shader Code Example
varying 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(); //gl_Position = gl_ProjectionMatrix*gl_ModelViewMatrix*gl_Vertex; }

19 Fragment Shader Code Example
varying 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;

20 OpenGL Gouraud Shading
Result OpenGL Gouraud Shading GLSL Phong Shading

21 Geometry Shader It can change the primitive. Application
Add/remove primitives Add/remove vertices Edit vertex position Application

22 Geometry Shader Example Code
void 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;

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

24 Original input primitive
Result Original input primitive Output primitive

25 New Input Primitives GL_LINES_ADJACENCY GL_LINE_STRIP_ADJACENCY
GL_TRIANGLES_ADJACENCY GL_TRIANGLE_STRIP_ADJECENCY

26 Applications

27 Applications

28 Use GLSL in OpenGL glew.h glew32.lib glew32.dll
You need those head and library files glew.h glew32.lib glew32.dll

29 Use the Shader Code in C/C++
Initialize the shader. Use the shader you made. Draw what you want.

30 Shader Initialization
Vertex Shader glCreateShade Vertex Shader Code glShaderSource glCreateProgram glCompileShader glAttachShader Fragment Shader glAttachShader glCreateShade glLinkProgram Fragment Shader Code glShaderSource glUseProgram glCompileShader

31 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; }

32 void setShaders() { //a few strings // will hold onto the file read in
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 programs vs = textFileRead("../GeometryShader/ShaderCode/shader.vert"); fs = textFileRead("../GeometryShader/ShaderCode/shader.frag"); gs = textFileRead("../GeometryShader/ShaderCode/shader.geom");

33 //Setup a few constant pointers for below const char
//Setup a few constant pointers for below const 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();

34 glAttachShader(p,f); glAttachShader(p,v); glAttachShader(p,g); glProgramParameteri(p,GL_GEOMETRY_INPUT_TYPE,GL_LINES); glProgramParameteri(p,GL_GEOMETRY_OUTPUT_TYPE,GL_LINE_STRIP); int temp; glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES,&temp); glProgramParameteri(p,GL_GEOMETRY_VERTICES_OUT,temp); glLinkProgram(p); glUseProgram(p); }

35 Multi-texture Pixel Color Op 0 Op 1 Op 2 Op n final color
glActiveTexture( GL_TEXTURE0 ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); Op 1 glActiveTexture( GL_TEXTURE1 ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); Op 2 glActiveTexture( GL_TEXTURE2 ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); Op n final color glActiveTexture( GL_TEXTUREn ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …);

36 Shader Get location by name Assign layer number final color
glActiveTexture( GL_TEXTURE0 ); glBindTexture(GL_TEXTURE_2D, …); glActiveTexture( GL_TEXTURE1 ); glBindTexture(GL_TEXTURE_2D, …); final color glActiveTexture( GL_TEXTURE2 ); glBindTexture(GL_TEXTURE_2D, …); glActiveTexture( GL_TEXTURE3 ); glBindTexture(GL_TEXTURE_2D, …);

37 The Setting of Texture Operative Ignored
glActiveTexture / glBindTexture MAG and MIN Filter GL_NEAREST, GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, … WRAP S, T GL_CLAMP, GL_REPEAT, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER Ignored glEnable(GL_TEXTURE_nD) / glDisable GL_TEXTURE_ENV_MODE GL_REPLACE, GL_MODULATE, GL_ADD Pixel Color Op 0 glActiveTexture( GL_TEXTURE0 ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …);

38 Send Texture to Shader Active texture channel Bind the texture
Get location of the variable in shader Set the value

39 Get Location Glint glGetUniformLocation(GLhandleprogram, const GLchar *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.

40 Set Value Following functions are used to assign values for uniform variables – Void glUniform{1,2,3,4}{f,i}(Glint location, TYPE v) – Void glUniform{1,2,3,4}{f,i}v(Glint location, Gluint count, TYPE v) – Void glUniformMatrix{2,3,4}fv(Glint location,GLuint count, GLboolean transpose, const GLfloat *v) location is the value obtained using glGetUniformLocation(). v is the value to be assigned. glUniform1i can be used to assign texture slot of glActiveTexture.

41 Texture Mapping C++ Code
glUseProgramObject(MyShader); glActiveTexture( GL_TEXTURE0 ); glBindTexture(GL_TEXTURE_2D, texObject[0]); GLint location = glGetUniformLocation(MyShader, "colorTexture"); if(location == -1) printf("Cant find texture name: colorTexture\n"); else glUniform1i(location, 0); int i,j; for (i=0;i < object->fTotal;i++){ glBegin(GL_POLYGON); for (j=0;j<3;j++){ glMultiTexCoord2fv(GL_TEXTURE0, 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();

42 Texture Mapping Vertex Shader Code
void main() { gl_TexCoord[0].xy = gl_MultiTexCoord0.xy; gl_Position = ftransform(); }

43 Texture Mapping Pixel Shader Code
uniform sampler2D colorTexture; void main (void) { gl_FragColor = texture2D(colorTexture,gl_TexCoord[0].xy).rgba; }

44 gl_TexCoord[0] Vertex Shader Fragment Shader (colorTexture) gl_MultiTexCoord0 rasterizer glGetUniformLocation glActiveTexture glBindTexture(..) GL_TEXTURE0 location glUniform1i(location, 0); id GL_TEXTURE1 Texture Content GL_TEXTUREn

45 Result 2

46 Send Attribute Data You can use glMultiTexCoord instead.
It is similar to uniform data. Get location glGetAttribLocation(program id, variable name) Set Values Per Vertex Set by glVertexAttrib{234}{fd}{v} Call glVertex{34}{fd}{v} You can use glMultiTexCoord instead.


Download ppt "OpenGL Shading Language (GLSL)"

Similar presentations


Ads by Google