- Timestamp:
- 08/26/08 13:30:31 (16 years ago)
- Location:
- GTP/trunk/App/Demos/Vis/FriendlyCulling
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/App/Demos/Vis/FriendlyCulling/default.env
r2865 r2867 11 11 camPosition=483.398f 242.364f 186.078f 12 12 camDirection=1 0 0 13 useFullScreen= 014 useLODs= 013 useFullScreen=1 14 useLODs=1 15 15 #modelPath=data/city/model/ 16 16 -
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/DeferredShader.cpp
r2866 r2867 42 42 mFbo = new FrameBufferObject(w, h, FrameBufferObject::DEPTH_NONE); 43 43 // the diffuse color buffer 44 mFbo->AddColorBuffer( w, h, ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_LINEAR, false, false);44 mFbo->AddColorBuffer(ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_LINEAR, false); 45 45 } 46 46 … … 112 112 GLuint normalsTex = fbo->GetColorBuffer(2)->GetTexture(); 113 113 114 if (1) 115 { 116 glEnable(GL_TEXTURE_2D); 117 // generate mip map levels for position texture 118 glBindTexture(GL_TEXTURE_2D, colorsTex); 119 glGenerateMipmapEXT(GL_TEXTURE_2D); 120 } 121 114 122 // read the second buffer, write to the first buffer 115 123 mFbo->Bind(); -
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/FrameBufferObject.cpp
r2866 r2867 50 50 FILTER_TYPE filterType, 51 51 bool useMipMap, 52 bool useMultiSampling,53 52 int attachment_idx) 54 53 { … … 81 80 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, color_attachment[attachment_idx], GL_TEXTURE_2D, mTexId, 0); 82 81 83 GLuint filterParam; 82 GLuint minfilterParam; 83 GLuint magfilterParam; 84 84 85 85 switch (filterType) 86 86 { 87 87 case FILTER_NEAREST: 88 filterParam = GL_NEAREST; break; 88 minfilterParam = GL_NEAREST; 89 magfilterParam = GL_NEAREST; break; 89 90 case FILTER_LINEAR: 90 filterParam = GL_LINEAR; break; 91 minfilterParam = GL_LINEAR; 92 magfilterParam = GL_LINEAR; break; 91 93 case FILTER_MIPMAP_LINEAR: 92 filterParam = GL_LINEAR_MIPMAP_LINEAR; break; 94 //minfilterParam = GL_LINEAR_MIPMAP_LINEAR; 95 minfilterParam = GL_NEAREST_MIPMAP_NEAREST; 96 //minfilterParam = GL_NEAREST_MIPMAP_LINEAR; 97 magfilterParam = GL_NEAREST; break; 93 98 default: 94 filterParam = GL_NEAREST; 99 minfilterParam = GL_NEAREST; 100 magfilterParam = GL_NEAREST; 101 95 102 cerr << "should not come here" << endl; 96 103 } … … 107 114 } 108 115 109 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterParam);110 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterParam);116 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magfilterParam); 117 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilterParam); 111 118 112 119 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapParam); 113 120 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapParam); 121 122 if (useMipMap) glGenerateMipmapEXT(GL_TEXTURE_2D); 114 123 115 124 // print status … … 178 187 179 188 180 int FrameBufferObject::AddColorBuffer(int w, int h, 181 ColorBufferObject::FORMAT col, 189 int FrameBufferObject::AddColorBuffer(ColorBufferObject::FORMAT col, 182 190 ColorBufferObject::WRAP_TYPE wrapType, 183 191 ColorBufferObject::FILTER_TYPE filterType, 184 bool useMipMap, 185 bool useMultiSampling) 192 bool useMipMap) 186 193 { 187 194 cout << "adding color buffer" << endl; … … 189 196 Bind(); 190 197 191 int idx = (int)mColorBuffers.size(); 198 const int idx = (int)mColorBuffers.size(); 199 192 200 ColorBufferObject *colorBuf = 193 new ColorBufferObject( w, h, col, wrapType, filterType, useMipMap, useMultiSampling, idx);201 new ColorBufferObject(mWidth, mHeight, col, wrapType, filterType, useMipMap, idx); 194 202 195 203 mColorBuffers.push_back(colorBuf); -
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/FrameBufferObject.h
r2866 r2867 25 25 FILTER_TYPE filterType, 26 26 bool useMipMap, 27 bool useMultiSampling,28 27 int attachment_idx); 29 28 … … 51 50 Returns the index that allows to retrieve the color buffer object. 52 51 */ 53 int AddColorBuffer(int w, int h, 54 ColorBufferObject::FORMAT col, 52 int AddColorBuffer(ColorBufferObject::FORMAT col, 55 53 ColorBufferObject::WRAP_TYPE wrapType, 56 54 ColorBufferObject::FILTER_TYPE filterType, 57 bool useMipMap, 58 bool useMultiSampling); 55 bool useMipMap); 59 56 60 57 /** Returns the color buffer object on position i. -
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/Shape.cpp
r2847 r2867 26 26 void Shape::Render(RenderState *state) 27 27 { 28 if (mMaterial) mMaterial->Render(state); 28 if (mMaterial) 29 mMaterial->Render(state); 29 30 30 31 mParent->GetTransform()->Load(state); -
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/SsaoShader.cpp
r2866 r2867 64 64 65 65 66 SsaoShader::SsaoShader(int w, int h, 67 Camera *cam, 68 float scaleFactor 69 ): 66 SsaoShader::SsaoShader(int w, int h, Camera *cam, float scaleFactor): 70 67 mWidth(w), mHeight(h), 71 68 mCamera(cam), … … 78 75 mNewFbo = new FrameBufferObject(w, h, FrameBufferObject::DEPTH_NONE); 79 76 // the diffuse color buffer 80 mNewFbo->AddColorBuffer( w, h, ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_LINEAR, false, false);77 mNewFbo->AddColorBuffer(ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_LINEAR, false); 81 78 82 79 mOldFbo = new FrameBufferObject(w, h, FrameBufferObject::DEPTH_NONE); 83 80 // the diffuse color buffer 84 mOldFbo->AddColorBuffer( w, h, ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_LINEAR, false, false);81 mOldFbo->AddColorBuffer(ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_LINEAR, false); 85 82 86 83 … … 167 164 cgGLSetMatrixParameterfc(sOldModelViewProjMatrixParam, (const float *)oldProjViewMatrix.x); 168 165 166 glPushAttrib(GL_VIEWPORT_BIT); 167 glViewport(0, 0, mWidth, mHeight); 168 169 glDrawBuffers(1, mymrt); 170 171 cgGLEnableProfile(RenderState::sCgFragmentProfile); 172 173 glDisable(GL_ALPHA_TEST); 174 glDisable(GL_TEXTURE_2D); 175 glDisable(GL_LIGHTING); 176 177 glMatrixMode(GL_PROJECTION); 178 glPushMatrix(); 179 glLoadIdentity(); 180 181 glMatrixMode(GL_MODELVIEW); 182 glPushMatrix(); 183 glLoadIdentity(); 184 185 const float offs = 0.5f; 186 glOrtho(-offs, offs, -offs, offs, 0, 1); 187 169 188 // switch roles of old and new fbo 170 189 // the algorihm uses two input fbos, where the one … … 177 196 //DisplayTexture(); 178 197 AntiAliasing(fbo); 198 199 glEnable(GL_LIGHTING); 200 glDisable(GL_TEXTURE_2D); 201 202 glMatrixMode(GL_PROJECTION); 203 glPopMatrix(); 204 205 glMatrixMode(GL_MODELVIEW); 206 glPopMatrix(); 207 208 glPopAttrib(); 209 210 cgGLDisableProfile(RenderState::sCgFragmentProfile); 179 211 } 180 212 … … 186 218 GLuint normalsTex = fbo->GetColorBuffer(2)->GetTexture(); 187 219 220 if (1) 221 { 222 // generate mip map levels for position texture 223 glBindTexture(GL_TEXTURE_2D, positionsTex); 224 glGenerateMipmapEXT(GL_TEXTURE_2D); 225 } 226 227 188 228 // read the second buffer, write to the first buffer 189 229 mNewFbo->Bind(); 190 230 GLuint oldTex = mOldFbo->GetColorBuffer(0)->GetTexture(); 191 231 192 glPushAttrib(GL_VIEWPORT_BIT);193 glViewport(0, 0, mWidth, mHeight);194 195 232 glDrawBuffers(1, mymrt); 196 233 197 glDisable(GL_ALPHA_TEST);198 glDisable(GL_TEXTURE_2D);199 glDisable(GL_LIGHTING);200 201 glMatrixMode(GL_PROJECTION);202 glPushMatrix();203 glLoadIdentity();204 205 glMatrixMode(GL_MODELVIEW);206 glPushMatrix();207 glLoadIdentity();208 209 const float offs = 0.5f;210 211 glOrtho(-offs, offs, -offs, offs, 0, 1);212 213 234 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 214 215 cgGLEnableProfile(RenderState::sCgFragmentProfile);216 235 217 236 cgGLBindProgram(sCgSsaoProgram); … … 265 284 cgGLDisableTextureParameter(sOldTexParam); 266 285 267 cgGLDisableProfile(RenderState::sCgFragmentProfile);268 269 glEnable(GL_LIGHTING);270 glDisable(GL_TEXTURE_2D);271 272 glMatrixMode(GL_PROJECTION);273 glPopMatrix();274 275 glMatrixMode(GL_MODELVIEW);276 glPopMatrix();277 278 glPopAttrib();279 280 286 FrameBufferObject::Release(); 281 287 … … 316 322 void SsaoShader::CreateNoiseTex2D() 317 323 { 318 GLubyte *randomNormals = new GLubyte[mWidth * mHeight * 3]; 324 //GLubyte *randomNormals = new GLubyte[mWidth * mHeight * 3]; 325 float *randomNormals = new float[mWidth * mHeight * 3]; 319 326 320 327 for (int i = 0; i < mWidth * mHeight * 3; i += 3) … … 324 331 const float theta = 2.0f * acos(sqrt(1.0f - rx)); 325 332 326 randomNormals[i + 0] = (GLubyte)((cos(theta) * 0.5f + 0.5f) * 255.0f); 327 randomNormals[i + 1] = (GLubyte)((sin(theta) * 0.5f + 0.5f) * 255.0f); 333 //randomNormals[i + 0] = (GLubyte)((cos(theta) * 0.5f + 0.5f) * 255.0f); 334 //randomNormals[i + 1] = (GLubyte)((sin(theta) * 0.5f + 0.5f) * 255.0f); 335 randomNormals[i + 0] = cos(theta); 336 randomNormals[i + 1] = sin(theta); 328 337 randomNormals[i + 2] = 0; 329 338 } … … 338 347 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 339 348 340 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, mWidth, mHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, randomNormals); 349 //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, mWidth, mHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, randomNormals); 350 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F_ARB, mWidth, mHeight, 0, GL_RGB, GL_FLOAT, randomNormals); 341 351 342 352 glBindTexture(GL_TEXTURE_2D, 0); … … 371 381 GLuint colorsTex = mNewFbo->GetColorBuffer(0)->GetTexture(); 372 382 GLuint normalsTex = fbo->GetColorBuffer(2)->GetTexture(); 373 374 glPushAttrib(GL_VIEWPORT_BIT); 375 glViewport(0, 0, mWidth, mHeight); 376 377 glDisable(GL_ALPHA_TEST); 378 glDisable(GL_TEXTURE_2D); 379 glDisable(GL_LIGHTING); 380 381 glMatrixMode(GL_PROJECTION); 382 glPushMatrix(); 383 glLoadIdentity(); 384 385 glMatrixMode(GL_MODELVIEW); 386 glPushMatrix(); 387 glLoadIdentity(); 388 389 const float offs = 0.5f; 390 391 glOrtho(-offs, offs, -offs, offs, 0, 1); 383 392 384 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 393 385 … … 422 414 cgGLDisableTextureParameter(sNormalsTexAntiAliasingParam); 423 415 424 cgGLDisableProfile(RenderState::sCgFragmentProfile); 425 426 glEnable(GL_LIGHTING); 427 glDisable(GL_TEXTURE_2D); 428 429 glMatrixMode(GL_PROJECTION); 430 glPopMatrix(); 431 432 glMatrixMode(GL_MODELVIEW); 433 glPopMatrix(); 434 435 glPopAttrib(); 436 437 PrintGLerror("deferred shading"); 416 PrintGLerror("antialiasing"); 438 417 } 439 418 -
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/chcdemo.cpp
r2866 r2867 303 303 //env.GetIntParam(string("numSssaoSamples"), numSsaoSamples); 304 304 305 305 306 cout << "*********** parameters ***************" << endl; 307 306 308 cout << "assumedVisibleFrames: " << assumedVisibleFrames << endl; 307 309 cout << "maxBatchSize: " << maxBatchSize << endl; … … 338 340 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE); 339 341 //glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); 340 341 342 //glutInitDisplayString("samples=2"); 343 344 SceneEntity::SetUseLODs(useLODs); 345 342 346 343 347 if (!useFullScreen) … … 531 535 // this fbo basicly stores the scene information we get from standard rendering of a frame 532 536 // we store colors, normals, positions (for the ssao) 533 fbo = new FrameBufferObject(texWidth, texHeight, FrameBufferObject::DEPTH_ 24);537 fbo = new FrameBufferObject(texWidth, texHeight, FrameBufferObject::DEPTH_32); 534 538 535 539 // the diffuse color buffer 536 fbo->AddColorBuffer( texWidth, texHeight, ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_LINEAR, false, false);540 fbo->AddColorBuffer(ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_NEAREST, false); 537 541 // the positions buffer 538 fbo->AddColorBuffer(512, 512, ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_NEAREST, false, false); 542 fbo->AddColorBuffer(ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_MIPMAP_LINEAR, true); 543 //fbo->AddColorBuffer(ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_NEAREST, true); 539 544 // the normals buffer 540 //fbo->AddColorBuffer(ColorBufferObject::BUFFER_UBYTE, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_NEAREST, false , false);541 fbo->AddColorBuffer( texWidth, texHeight, ColorBufferObject::BUFFER_FLOAT_32, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_NEAREST, false, false);545 //fbo->AddColorBuffer(ColorBufferObject::BUFFER_UBYTE, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_NEAREST, false); 546 fbo->AddColorBuffer(ColorBufferObject::BUFFER_FLOAT_16, ColorBufferObject::WRAP_CLAMP_TO_EDGE, ColorBufferObject::FILTER_NEAREST, false); 542 547 543 548 PrintGLerror("fbo"); … … 1035 1040 break; 1036 1041 case '+': 1037 maxBatchSize += 10; 1042 if (maxBatchSize < 10) 1043 maxBatchSize = 10; 1044 else 1045 maxBatchSize += 10; 1046 1038 1047 traverser->SetMaxBatchSize(maxBatchSize); 1039 1048 break; -
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/antialiasing.cg
r2866 r2867 10 10 }; 11 11 12 //uniform sampler2D s_distort; 13 uniform float4 e_barrier = float4(5e-5, 5e-5, 0, 0); 12 // the barrier for detecting a discontinuity 13 uniform float4 e_barrier = float4(5e-3, 5e-3, 0, 0); // x = normal, y = depth 14 // the weights for normal / depth discontinuity 14 15 uniform float4 e_weights = float4(1.0f, 1.0f, 1.0f, 1.0f); // x = normal, y = depth 15 uniform float4 e_kernel = float4(0.3 f, 1.0f, 1.0f, 1.0f); // x = normal, y = depth16 uniform float4 e_kernel = float4(0.35f, 1.0f, 1.0f, 1.0f); 16 17 17 18 … … 21 22 ): COLOR 22 23 { 24 //return tex2D(colors, IN.c.xy); 23 25 // normal discontinuity filter 24 26 float3 nc = (float3)tex2D(normals, IN.c.xy); … … 81 83 82 84 return (s0 + s1 + s2 + s3) / 4.0f; 83 //return float4(w);84 85 } -
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/deferred.cg
r2866 r2867 7 7 8 8 // rule of thumb: approx 1 / NUM_SAMPLES 9 #define SAMPLE_INTENSITY 0.1 79 #define SAMPLE_INTENSITY 0.15 10 10 //#define SAMPLE_INTENSITY 0.125f 11 11 … … 37 37 float2 rpt = pt - d * 2.0f * n; 38 38 39 //return pt;40 39 return rpt; 41 40 } … … 80 79 81 80 //sample noisetex; r stores costheta, g stores sintheta 82 float2 mynoise = tex2D(noiseTexture, IN.texCoord.xy * noiseMultiplier).xy * 2.0f - 1.0f; 81 //float2 mynoise = tex2D(noiseTexture, IN.texCoord.xy * noiseMultiplier).xy * 2.0f - 1.0f; 82 float2 mynoise = tex2D(noiseTexture, IN.texCoord.xy * noiseMultiplier).xy; 83 83 84 84 // rotation 85 85 //float2 offsetTransformed = offset; 86 float2 offsetTransformed = rotate(offset, mynoise);87 //float2 offsetTransformed = reflect(offset,noise);86 //float2 offsetTransformed = rotate(offset, mynoise); 87 float2 offsetTransformed = reflect(offset, mynoise); 88 88 89 89 // weight with projected coordinate to reach similar kernel size for near and far 90 90 float2 texcoord = IN.texCoord.xy + offsetTransformed * AREA_SIZE * w; 91 91 92 float3 sample_position = tex2D(positions, texcoord).xyz; 92 // sample downsampled texture in order to speed up texture accesses 93 float3 sample_position = tex2Dlod(positions, float4(texcoord, 0, 1)).xyz; 94 //float3 sample_position = tex2D(positions, texcoord).xyz; 93 95 94 96 float3 vector_to_sample = sample_position - centerPosition.xyz; … … 112 114 113 115 return (1.0f - total_ao); 114 //return float4(dot(currentViewDir, currentNormal));116 //return dot(currentViewDir, currentNormal); 115 117 } 116 118 … … 180 182 181 183 184 /** function for standard deferred shading 185 */ 182 186 float4 shade(fragment IN, 183 187 uniform sampler2D colors, … … 199 203 float3 light2 = normalize(lightDir2.xyz); 200 204 201 float diffuseLight = max(dot(normal, light), 0.0f);202 float diffuseLight2 = max(dot(normal, light2), 0.0f);205 float diffuseLight = saturate(dot(normal, light)); 206 float diffuseLight2 = saturate(dot(normal, light2)); 203 207 204 208 float diffuse = diffuseLight + diffuseLight2; 205 //float diffuse = diffuseLight;206 209 207 210 return (ambient + diffuse) * color * (1.0f - amb) + amb * color; … … 227 230 228 231 float4 normal = tex2D(normals, IN.texCoord.xy); 232 233 // the ambient term 229 234 float amb = normal.w; 230 235 231 236 // expand normal 232 normal = normalize(normal * 2.0f - 1.0f);237 normal = normalize(normal);// * 2.0f - 1.0f); 233 238 /// the current view direction 234 239 float3 viewDir = normalize(IN.view * 2.0f - float3(1.0f)); … … 263 268 if ((tex.x >= 0.0f) && (tex.x < 1.0f) && 264 269 (tex.y >= 0.0f) && (tex.y < 1.0f) && 265 (abs(depthDif) < 8e-5f))270 (abs(depthDif) < 1e-4f)) 266 271 { 267 272 OUT.color = attenuated_color * expFactor + col1 * float4(1.0f - expFactor); … … 292 297 293 298 float4 normal = tex2D(normals, IN.texCoord.xy); 299 300 // an ambient color term 294 301 float amb = normal.w; 295 302 296 303 // expand normal 297 normal = normalize(normal * 2.0f - float4(1.0f));304 normal = normalize(normal);// * 2.0f - float4(1.0f)); 298 305 299 306 float4 col = shade(IN, colors, positions, normal.xyz, amb); -
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/mrt.cg
r2866 r2867 77 77 // save color in first render target 78 78 pix.col = (ambient + diffuse) * tex2D(tex, IN.texCoord.xy); 79 79 80 // save world position in second rt 80 81 pix.pos = IN.worldPos * maxDepth; 81 82 // save normal in third rt 82 pix.norm.xyz = IN.normal * 0.5f + 0.5f; 83 //pix.norm.xyz = IN.normal * 0.5f + 0.5f; 84 pix.norm.xyz = IN.normal; 83 85 84 86 // hack: squeeze some information about ambient into the texture … … 107 109 pix.col = diffuse; 108 110 pix.pos = IN.worldPos * maxDepth; 109 pix.norm.xyz = IN.normal * 0.5f + float3(0.5f); 110 // hack: squeeze some information about ambient into the texture 111 //pix.norm.xyz = IN.normal * 0.5f + float3(0.5f); 112 pix.norm.xyz = IN.normal; 113 // hack: squeeze some information about the ambient term into the target 111 114 pix.norm.w = ambient.x; 112 115 pix.pos.w = IN.mypos.w;
Note: See TracChangeset
for help on using the changeset viewer.