Date post: | 20-Jan-2016 |
Category: |
Documents |
Upload: | claud-daniel |
View: | 300 times |
Download: | 1 times |
OpenGL Shading Language (GLSL)
OpenGL Rendering Pipeline
Vertex Shader Vertex
transformation Normal
transformation & normalization
Texture coordinate generation & transformation
Per-vertex lighting
Geometry Shader Add/remove
primitives Add/remove vertices Edit vertex position Supported by OpenGL
Extension(Glew 1.4+) or DX10
Fragment (pixel) Shader Operations on
interpolated values
Texture access Texture
application Fog Color sum
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
Qualifiers in pipeline
VertexShader
uniform
attribute varyin
g
FragmentShader
rasterizer
Buffer Op…varyin
g
(x’,y’,z’)
(x,y,z)
Qualifiers in pipeline
VertexShader
uniform
attribute
varying in
FragmentShader
rasterizer
varying out
(x,y,z)
GeometryShader
Vertex Shader
Fragment Shader
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
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.
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);
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.
Addition information
Array Similar to C. No union, enum, class
Static cast by function float() int()
Phong Shading
Use varying variable to save the vertex normal or other information.
Compute the Phong lighting in pixel shader with the information.
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();}
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;}
Result
OpenGL Gouraud Shading GLSL Phong Shading
Geometry Shader
It can change the primitive. Add/remove primitives Add/remove vertices Edit vertex position
Application
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;
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
}
Result
Original input primitive
Output primitive
New input primitives GL_LINES_ADJACENCY_EXT GL_LINE_STRIP_ADJACENCY_EXT GL_TRIANGLES_ADJACENCY_EXT GL_TRIANGLE_STRIP_ADJECENCY_EXT
Applications
Applications
Use GLSL in OpenGL
You need those head and library files glew.h wglew.h glew32.lib glew32s.lib glew32.dll
Use the shader code in C/C++
Initialize the shader. Use the shader you made. Draw what you want.
Shader Initialization
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;
}
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");
//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();
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);
}
Send texture to shader
Active texture channel Bind the texture Get location of the variable in
shader Set the value
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
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
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.
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.
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();
}
Texture Mapping Vertex Shader Code
void main(){
gl_TexCoord[0].xy = gl_MultiTexCoord0.xy;gl_Position = ftransform();
}
Texture Mapping Pixel Shader Code
uniform sampler2D colorTexture;
void main (void){
gl_FragColor = texture2D(colorTexture,gl_TexCoord[0].xy).rgba;
}
Result 2