Transcript Document
Shader
Original Rendering Pipeline
Vertex Shader
Vertex transformation Normal transformation & normalization Texture coordinate generation & transformation Per-vertex processing
Fragment (pixel) Shader
Operations on interpolated values Texture access Texture application Color sum
Shading languages
DirectX ’ s High Level Shading Language NVidia ’ s Cg ATI ’ s RenderMonkey OpenGL Shading Language (GLSL)
Introduction of GLSL
Data Type Vertex Shader Fragment Shader
GLSL Language Definition
Data Type Description
int
Integer
float bool vec2 vec3
Floating-point Boolean ( true or false ).
Vector with two floats.
Vector with three floats.
vec4
Vector with four floats.
mat2 2x2 floating-point matrix.
mat3 3x3 floating-point matrix.
mat4 4x4 floating-point matrix.
Vector
Vector is like a structure 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.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);
Addition data type : 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 data type
struct, array
Similar to C.
No union, enum, class
Qualifiers
Used to management the input and output of shaders.
attribute Communicate changing variables from the application to a vertex shader.
uniform Communicate changing variables from the application to any shader.
varying Communicate interpolated variables from a vertex shader to a fragment shader
Qualifiers
OpenGL Application uniform attribute Vertex Shader varying Fragment Shader
Vertex Shader
Fragment Shader
Vertex Shader Code Example
void main(void) { vec3 v3Normal; float fAngle; float fShininessFactor; v3Normal = gl_NormalMatrix * gl_Normal; v3Normal = normalize(v3Normal); fAngle = max(0.0, dot(v3Normal, vec3(gl_LightSource[0].halfVector))); fShininessFactor = pow(fAngle, gl_FrontMaterial.shininess); gl_FrontColor = gl_LightSource[0].ambient * gl_FrontMaterial.ambient + gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse * fAngle + gl_LightSource[0].specular * gl_FrontMaterial.specular * fShininessFactor; gl_Position = ftransform(); }
Fragment Shader Code Example
void main(void) { gl_FragColor = gl_Color; }
Result
OpenGL Gouraud Shading GLSL Phong Shading
Use GLSL in OpenGL
You need those head and library files glew.h
wglew.h
glew32.lib
glew32s.lib
glew32.dll
texture glaux.h
glaux.lib glaux.dll
Texture
#define TEX_NUM 1 //the number of textures you use.
Gluint texObject[TEX_NUM]; //texture object glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texObject[0]); GLint location = glGetUniformLocationARB( MyShader, "colorTexture"); glMultiTexCoord2fv(GL_TEXTURE0_ARB,object->tList[object->faceList[i][j].t].ptr);
LoadTexture
void LoadTexture(int textureIndex,char* filename) { AUX_RGBImageRec* img; img = auxDIBImageLoadA(filename); glBindTexture(GL_TEXTURE_2D, texobject[textureIndex]); gluBuild2DMipmaps(GL_TEXTURE_2D, 4, img->sizeX, img->sizeY,GL_RGB, GL_UNSIGNED_BYTE, img->data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP _LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP _LINEAR); }
Texture
Vertex shader
void main() { gl_TexCoord[0].xy = gl_MultiTexCoord0.xy; gl_Position = ftransform(); }
Fragment shader
uniform sampler2D colorTexture; void main (void) { gl_FragColor = texture2D(colorTexture, gl_TexCoord[0].xy).rgba; }
Texture
vec3 v3Normal = gl_NormalMatrix * gl_Normal; vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex); lightDir = vec3(gl_LightSource[0].position.xyz - vVertex); eyeDir = -vVertex; gl_ModelViewMatrix : 4x4 Matrix representing the m-v matrix.
gl_NormalMatrix : 3x3 Matrix representing the inverse transpose m-v matrix.This matrix is used for normal transformation .
uniform sampler2D colorTexture; vec2 i = vec2 ( gl_TexCoord[1].x,gl_TexCoord[1].y ); // 將 texture 座標點存入 i vec4 i_color = texture2D(colorTexture,i); // 將 i 座標點的顏色存入 i_color gl_FrontMaterial.ambient gl_LightSource[0].ambient
gl_FrontMaterial.diffuse gl_LightSource[0].diffuse gl_FrontMaterial.specular gl_LightSource[0].specular // 對應程式中的各種 light 參數
HW2 : Shader Programming
Write a shader program with Phong Shading. (50%) Write a shader program with Bump Mapping. (50%) Due day : 5/21( 四 ) 5/25 HW3
Gouraud Shading Phong Shading Bump Mapping