Announcement Lots of CS Scholarship opportunities Textures I Deadline: April 15, 2008. Final exam effects Final exam effects Lighting Neon lights Textures / refelction Strawberry Snapple bottle Water surface CD surface Volumetric PET scan visualization Postprocessing “Classic” film look Impressionistic painting Final exam effects Final exam effects Grads Please register your preference Research and implementation plan Mycourses quiz. Teams Implementation RenderMan GLSL Documentations 1
Notes for Lab 1 Notes for Lab 1 GLSL coordinate spaces In Renderman, premultiply opacity…I.e. world eye clip Os = Oi; object Model View Projection Cs = Ci * Os; transformation gl_ModelViewMatrix gl_ModelViewProjection Plan Texture Mapping Define surface characteristics of Textures an object using an image This week Basic concept: associate value texture space (u,v) at some coordinates in texture Texture mapping (from files) with pixel at some coordinates in parameterization Bump Mapping geometry Coordinate spaces used in Environment Mapping object space (x o ,y o , z o ) texture mapping: Simple Toon Shading Texture space (u, v) projection Next week Object space (x o ,y o ,z o ) Screen space (x, y) screen space (x,y) Procedural shading Texture Mapping Texture Mapping y z x geometry screen v image u 2
Textures in shaders Texture pipeline Textures are just data Texture coordinates available to the shader Global variable / semantic Akenine-Moller / Haines Actual mapping determined by underlying scene model. Texture pipeline example Textures in shaders Tasks: Make texture data available to rendering Grab texture data for a given point Use texture coord from shading point Indexed by some other means Apply texture data as appropriate Color, normal, opacity, whatever. Akenine-Moller / Haines Textures in RenderMan Texture mapping in RenderMan Texture coordinates range from 0-1 in Access texture values from file using the texture() function texture space texture (filename, q, r) -- Return Values of texture coords corresponding value(s) at texture coords (q,r) to P given in global parameters s and texture (filename) -- Return value(s) t . at standard texture coords (s, t). Filtered texture lookup Free antialiasing. 3
Textures in RenderMan Textures in RenderMan texture() function provides manual Can access color or floating point values control over filtering from file Blur f = float texture (“foo.tex”); Filter width c = color texture (“bar.tex”); Type of filter Can access specific channels from file Fill data (for missing channels) f = texture (“foo.tex” [1]); See Section 8.1.4 in text. Texture format Textures in RenderMan prman has a proprietary format for textures. surface paintedplastic ( float Ka = 1, Kd = .5, Ks = .5, roughness = .1; txmake [args] infile outfile color speccolor = 1; string texname = “”;) Converts images into this format { Args: color Ct = Cs; if (texname != “”) -mode [black clamp periodic] Ct *= color texture (texname); -smode, -tmode normal Nf = faceforward (normalize(N), I); -short, -float vector V = -normalize (I); -resize up- Ci = Ct * (Ka*ambient() + Kd*diffuse(Nf)) + speccolor * Ks * specular (Nf, V, roughness); Oi = Os; Ci *= Oi; } Textures in RenderMan Textures in GLSL Questions? Texture access in GLSL is almost as easy EXCEPT… Texture state must be set up in OpenGL program! Places texture into texture memory for use by shaders 4
Setting up OpenGL Texture Setting up the OpenGL texture state state Select a texture unit and make it active Notes: ( glActiveTexture()) No need to enable texture (glEnable()) or Create a tecture object and bind to the set the up the texture function active texture ( glBindTexture()). (glTexEnv()) Set texture parameters (wrapping, Texture data must be read in by aux filtering etc) ( glTexParam()). functions. Define the texture ( glTexImage()) Sample setup code Sample code setup Initializing the texture Using the texture glActiveTexture (GL_TEXTURE0) glBindTexture (GL_TEXTURE_2D, myTexName); Sample code setup On the shader side Textures are grabbed from texture Passing texture to a shader memory by use of samplers sampler1D - 1D texture texLoc = glGetUniformLocation (myProgram, sampler2D - 2D texture “paramname); sampler3D - 3D texture glUniform1i (texLoc, 0); samplerCube - cube map texture samplerShadow1D/2D - shadow maps 5
Shader texture functions Texture access in GLSL Access to texture values: use texture1D textureNNNN[proj/Lod] () functions texture2D shadowNNNN[proj/Lod] () functions NNNN = texture3D 1D / 2D / 3D - using texture coords (0-1) textureCube Cube - for environment mapping [proj] - projective texture map shadow1D Proj = As if projected by slide projector/Useful in shadowing Lod = Use of textures in vertex shaders shadow2D See section 5.7 for complete list Textures in GLSL Simple example Projective texture mapping varying float Intensity; Uniform sampler2D myTexture; void main() { vec3 light = vec3 (texture2D (myTexture, glTexCoord [0].st; glFragColor = vec4 (light * Intensity, 1.0); } What you can do with texture Textures in GLSL maps Textures are data Color Can be used as values Bump Mapping Individual components can be accessed via Environment Mapping swizzling / masking Toon Shading. Questions / Break 6
Texture Mapping- Bump Mapping Texture Mapping- Bump Mapping Perturbing surface normal Adds roughness to surfaces Texture map represents displacements from the Quick way to add detail to normal an object Use perturbed normal in illumination model Polygon remains physically flat, but appears bumpy Jim Blinn Texture mapping – Bump Mapping Issues with Bump Mapping How much to perturb Common coordinate system Using eye or even object may be cumbersome. Normal map defined on object Tangent Space Bump mapping in RenderMan Build a local coordinate system around Performed using the displacement shader: the normal at a point Modifies global variables P and N P+= bumpheight * normalize(N); N = calculatenormal (P); Recall that displacement shaders are executed before surface shaders. bumpheight can be read from a texture file, or generated procedurally, or both… 7
Bump mapping in RenderMan Bump vs displacement mapping Displacement mapping Bump mapping calculations should be done in “shader” space Moves actual point P+= bumpheight * normalize(N); Coordinate Description N = calculatenormal (P); System Bump mapping "shader" The coordinate system in which the shader was defined. This is the "object" coordinate Just changes normal system when the shader is defined. N = calculatenormal (P + amp*normalize(N)); "current" The coordinate system in which the shading calculations are being performed. This is normally the "camera" or "world" coordinate system. Bump Mapping in Renderman Bump Mapping in GLSL vector Nshad = vtransform (“shader”, N); No convenient displacement shader point Pshad = transform (“shader”, P); Just vertex and fragment shaders Pshad += amp * normalize (Nshad); P = transform (“shader”, “current”, Pshad); N = calculatenormal (P); Must be done in fragment shader Works just as well (see Section 8.2.3 in text for derivation) vector Nn = normalize (N); P += Nn * (amp / length (vtransform(“shader”, Nn)); Phong as a Vertex Shader - Phong as a Vertex Shader - diffuse specular Lighthouse3d.com 8
Issues with Bump Mapping Tangent Space How much to perturb Build a local coordinate system around the normal at a point Common coordinate system Using eye or even object may be cumbersome. Normal map defined on object GLSL does not have a calculatenormal() function Tangent Space Matrix Multiplication Converting to tangent space � � � � � � S x T x T y T z O x � � � � � � S y = B x B y B z O y � � � � � � � � S x T x T y T z O x � � � � � � � � � � � � � S z � N x N y N z � O z � � � � � � � S y = B x B y B z O y � � � � � � � S z � � N x N y N z � � O z � � � � � S x = T x O x + T y O y + T z O z � � S - vector in tangent space T - tangent vector S x = T • O N - normal vector B - binormal vector S y = B • O O - vector in object space S z = N • O Bump Mapping Bump Mapping For a modified Phong For a modified Phong: Vertex shader takes as args: Fragment Shader will: Normal (built-in) Modify normal Tangent (user defined) Do lighting calculation. Bi-normal (can be calculated) Will pass to fragment: Set fragment color. Light vector Eye position BOTH IN Tangent Space 9
Recommend
More recommend