00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 #include "QtBaseViewer.hh"
00056 #include <QStatusBar>
00057 #include <QToolButton>
00058
00059 #include <OpenFlipper/common/GlobalOptions.hh>
00060
00061 #include <QGLFramebufferObject>
00062
00063 #include <ACG/ShaderUtils/GLSLShader.hh>
00064 #include <ACG/GL/globjects.hh>
00065
00066 #include <ACG/ShaderUtils/gldebug.h>
00067
00068 #include "crc32.hh"
00069
00070
00071
00072
00073
00074
00075 static const char* customAnaglyphProg = {
00076 "!!ARBfp1.0"
00077 "TEMP left, right, lmul, rmul;"
00078 "TEX left, fragment.texcoord[0], texture[0], RECT;"
00079 "TEX right, fragment.texcoord[0], texture[1], RECT;"
00080 "DP3 lmul.r, left, program.env[0];"
00081 "DP3 lmul.g, left, program.env[1];"
00082 "DP3 lmul.b, left, program.env[2];"
00083 "DP3 rmul.r, right, program.env[3];"
00084 "DP3 rmul.g, right, program.env[4];"
00085 "DP3 rmul.b, right, program.env[5];"
00086 "ADD result.color, lmul, rmul;"
00087 "END"
00088 };
00089
00090
00091
00092
00093 void
00094 glViewer::setStereoMode(bool _b)
00095 {
00096 stereo_ = _b;
00097
00098 if (!stereo_) {
00099 makeCurrent();
00100 glDrawBuffer(GL_BACK);
00101 }
00102
00103 updateProjectionMatrix ();
00104
00105 updateGL();
00106 }
00107
00108
00109
00110
00111 void
00112 glViewer::drawScene_glStereo()
00113 {
00114 double l, r, t, b, w, h, a, radians, wd2, ndfl, zerop, xrange;
00115
00116 w = glWidth();
00117 h = glHeight();
00118 a = w / h;
00119
00120 radians = fovy_ * 0.5 / 180.0 * M_PI;
00121 wd2 = near_ * tan(radians);
00122 zerop = near_ + ((far_ - near_) * OpenFlipperSettings().value("Core/Stereo/FocalDistance").toDouble() );
00123 ndfl = near_ / zerop ;
00124 xrange = a * wd2 * 2 * zerop / near_;
00125
00126 l = -a*wd2;
00127 r = a*wd2;
00128 t = wd2;
00129 b = -wd2;
00130
00131 double offset = 0.5 * OpenFlipperSettings().value("Core/Stereo/EyeDistance").toDouble() * xrange;
00132 double offset2 = offset * ndfl;
00133
00134
00135 glMatrixMode(GL_PROJECTION);
00136 glLoadIdentity();
00137 glFrustum(l+offset2, r+offset2, b, t, near_, far_);
00138 glTranslatef(+offset, 0.0, 0.0);
00139 glMatrixMode(GL_MODELVIEW);
00140 glDrawBuffer(GL_BACK_LEFT);
00141 glstate_->clearBuffers ();
00142 glClear(GL_DEPTH_BUFFER_BIT);
00143 drawScene_mono();
00144
00145
00146
00147 glMatrixMode(GL_PROJECTION);
00148 glLoadIdentity();
00149 glFrustum(l-offset2, r-offset2, b, t, near_, far_);
00150 glTranslatef(-offset, 0.0, 0.0);
00151 glMatrixMode(GL_MODELVIEW);
00152 glDrawBuffer(GL_BACK_RIGHT);
00153 glstate_->clearBuffers ();
00154 glClear(GL_DEPTH_BUFFER_BIT);
00155 drawScene_mono();
00156 glDrawBuffer(GL_BACK);
00157 }
00158
00159
00160 void glViewer::drawScenePhilipsStereo() {
00161
00162 updateScenePhilipsStereo();
00163
00164 if (!philipsStereoInitialized_)
00165 return;
00166
00167 int vp_l, vp_b, vp_w, vp_h;
00168 glstate_->get_viewport(vp_l, vp_b, vp_w, vp_h);
00169
00170
00171
00172
00173 pDepthStencilTexture_.disable();
00174 pColorTexture_.disable();
00175
00176
00177
00178
00179 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
00180 drawScene_mono();
00181
00182
00183
00184
00185 pColorTexture_.enable();
00186 pColorTexture_.bind();
00187
00188 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, vp_l, vp_b, vp_w, vp_h);
00189
00190 pColorTexture_.disable();
00191
00192 pDepthStencilTexture_.enable();
00193 pDepthStencilTexture_.bind();
00194
00195 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, vp_l, vp_b, vp_w, vp_h);
00196
00197 pDepthStencilTexture_.disable();
00198
00199
00200 pProgram_->use();
00201
00202
00203
00204
00205 glActiveTextureARB(GL_TEXTURE0_ARB);
00206 pColorTexture_.enable();
00207 pColorTexture_.bind();
00208
00209 glActiveTextureARB(GL_TEXTURE1_ARB);
00210 pDepthStencilTexture_.enable();
00211 pDepthStencilTexture_.bind();
00212
00213 pProgram_->setUniform("ColorTexture", 0);
00214 pProgram_->setUniform("DepthStencil", 1);
00215
00216
00217
00218
00219 glDisable(GL_LIGHTING);
00220 glDisable(GL_COLOR_MATERIAL);
00221 glDisable(GL_DEPTH_TEST);
00222
00223
00224
00225
00226 glstate_->push_projection_matrix();
00227 glstate_->push_modelview_matrix();
00228
00229 glstate_->reset_projection();
00230 glstate_->reset_modelview();
00231
00232 glstate_->ortho(0, vp_w, 0, vp_h, 0, 1);
00233
00234
00235
00236
00237 glColor3f(1.0, 1.0, 1.0);
00238
00239
00240
00241
00242 glClearColor(.0, .0, .0, 0);
00243 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00244
00245
00246
00247
00248 glBegin(GL_QUADS);
00249 glTexCoord2f(0.0f, 1.0f);
00250 glVertex2i(0, vp_h);
00251 glTexCoord2f(1.0f, 1.0f);
00252 glVertex2i(vp_w, vp_h);
00253 glTexCoord2f(1.0f, 0.0f);
00254 glVertex2i(vp_w, 0);
00255 glTexCoord2f(0.0f, 0.0f);
00256 glVertex2i(0, 0);
00257 glEnd();
00258
00259 pProgram_->disable();
00260
00261 glBindTexture(GL_TEXTURE_2D, 0);
00262
00263
00264
00265
00266 pDepthStencilTexture_.del();
00267 pColorTexture_.del();
00268
00269
00270
00271
00272 uchar *header = new uchar[6];
00273
00274
00275
00276 header[0] = 241;
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288 header[1] = OpenFlipperSettings().value("Core/Stereo/Philips/Content").toInt();
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299 header[2] = OpenFlipperSettings().value("Core/Stereo/Philips/Factor").toInt();
00300
00301
00302
00303
00304
00305
00306
00307
00308 header[3] = OpenFlipperSettings().value("Core/Stereo/Philips/Offset").toInt();
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 header[4] = OpenFlipperSettings().value("Core/Stereo/Philips/Select").toInt();
00320
00321
00322 header[5] = 0;
00323
00324
00325
00326
00327
00328
00329 unsigned long checksum = CalcCRC32(&header[0], 6);
00330
00331
00332 std::vector<uchar> bitVector;
00333
00334
00335 for (int i = 0; i < 6; i++) {
00336
00337
00338 for (int j = 7; j >= 0; --j) {
00339
00340
00341 bitVector.push_back(0);
00342 bitVector.push_back(0);
00343
00344
00345
00346 if (header[i] & (1 << j)) {
00347 bitVector.push_back(255);
00348 } else {
00349 bitVector.push_back(0);
00350 }
00351
00352
00353
00354 bitVector.push_back(0);
00355 bitVector.push_back(0);
00356 bitVector.push_back(0);
00357 }
00358 }
00359
00360
00361
00362 for (int i = 31; i >= 0; i--) {
00363
00364
00365 bitVector.push_back(0);
00366 bitVector.push_back(0);
00367
00368 if (checksum & (1 << i))
00369 bitVector.push_back(255);
00370 else
00371 bitVector.push_back(0);
00372
00373
00374
00375 bitVector.push_back(0);
00376 bitVector.push_back(0);
00377 bitVector.push_back(0);
00378 }
00379
00380
00381
00382 glRasterPos2i(0, glHeight() - 1);
00383 glDrawPixels(bitVector.size() / 3, 1, GL_RGB, GL_UNSIGNED_BYTE, &bitVector[0]);
00384
00385
00386
00387
00388 glstate_->pop_projection_matrix();
00389 glstate_->pop_modelview_matrix();
00390
00391 }
00392
00393
00394
00395 void
00396 glViewer::updateScenePhilipsStereo()
00397 {
00398 int vp_l, vp_b, vp_w, vp_h;
00399 glstate_->get_viewport (vp_l, vp_b, vp_w, vp_h);
00400
00401
00402 if (!pProgram_) {
00403
00404
00405
00406
00407 GLSL::PtrVertexShader vertexShader;
00408 GLSL::PtrFragmentShader fragmentShader;
00409
00410 QString vshaderFile = OpenFlipper::Options::shaderDirStr() + QDir::separator() + "Philips/Vertex.glsl";
00411 QString fshaderFile = OpenFlipper::Options::shaderDirStr() + QDir::separator() + "Philips/Fragment42.glsl";
00412
00413 vertexShader = GLSL::loadVertexShader(vshaderFile.toStdString().c_str());
00414 fragmentShader = GLSL::loadFragmentShader(fshaderFile.toStdString().c_str());
00415 pProgram_ = GLSL::PtrProgram(new GLSL::Program());
00416
00417 if ((vertexShader == 0) || (fragmentShader == 0) || (pProgram_ == 0)) {
00418 std::cerr << "Unable to load shaders for philips display rendering!";
00419 philipsStereoInitialized_ = false;
00420 return;
00421 }
00422
00423 pProgram_->attach(vertexShader);
00424 pProgram_->attach(fragmentShader);
00425 pProgram_->link();
00426 }
00427
00428
00429 if (!pColorTexture_.is_valid()) {
00430
00431
00432
00433
00434 pColorTexture_.enable();
00435 pColorTexture_.bind();
00436 GLenum texTarget = GL_TEXTURE_2D;
00437 GLenum texInternalFormat = GL_RGBA;
00438 GLenum texFormat = GL_RGBA;
00439 GLenum texType = GL_UNSIGNED_BYTE;
00440 GLenum texFilterMode = GL_NEAREST;
00441 glTexImage2D(texTarget, 0, texInternalFormat, vp_w, vp_h, 0, texFormat, texType, NULL);
00442
00443 glTexParameterf(texTarget, GL_TEXTURE_MIN_FILTER, texFilterMode);
00444 glTexParameterf(texTarget, GL_TEXTURE_MAG_FILTER, texFilterMode);
00445 glTexParameterf(texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
00446 glTexParameterf(texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
00447 glTexParameteri(texTarget, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
00448
00449 if(!pColorTexture_.is_valid()) {
00450 philipsStereoInitialized_ = false;
00451 }
00452 }
00453
00454
00455 if (!pDepthStencilTexture_.is_valid()) {
00456
00457
00458
00459
00460 pDepthStencilTexture_.enable();
00461 pDepthStencilTexture_.bind();
00462 GLenum texTarget = GL_TEXTURE_2D;
00463 GLenum texInternalFormat = GL_DEPTH24_STENCIL8_EXT;
00464 GLenum texFormat = GL_DEPTH_STENCIL_EXT;
00465 GLenum texType = GL_UNSIGNED_INT_24_8_EXT;
00466 GLenum texFilterMode = GL_NEAREST;
00467 glTexImage2D(texTarget, 0, texInternalFormat, vp_w, vp_h, 0, texFormat, texType, NULL);
00468
00469 glTexParameterf(texTarget, GL_TEXTURE_MIN_FILTER, texFilterMode);
00470 glTexParameterf(texTarget, GL_TEXTURE_MAG_FILTER, texFilterMode);
00471 glTexParameterf(texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
00472 glTexParameterf(texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
00473 glTexParameteri(texTarget, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
00474
00475 if(!pDepthStencilTexture_.is_valid()) {
00476 philipsStereoInitialized_ = false;
00477 }
00478 }
00479
00480
00481 if (glstate_->viewport_width() != pTexWidth_ ||
00482 glstate_->viewport_height() != pTexHeight_) {
00483
00484
00485 pColorTexture_.bind();
00486 glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGB, glstate_->viewport_width(), glstate_->viewport_height(), 0,
00487 GL_RGB, GL_UNSIGNED_BYTE, 0);
00488
00489
00490 pDepthStencilTexture_.bind();
00491 glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGB, glstate_->viewport_width(), glstate_->viewport_height(), 0,
00492 GL_RGB, GL_UNSIGNED_BYTE, 0);
00493
00494 glBindTexture(GL_TEXTURE_RECTANGLE_NV, 0);
00495
00496 pTexWidth_ = glstate_->viewport_width();
00497 pTexHeight_ = glstate_->viewport_height();
00498 }
00499
00500 philipsStereoInitialized_ = true;
00501 }
00502
00503
00504
00505
00506 void
00507 glViewer::drawScene_anaglyphStereo()
00508 {
00509 double l, r, t, b, w, h, a, radians, wd2, ndfl, zerop, xrange;
00510
00511 w = glWidth();
00512 h = glHeight();
00513 a = w / h;
00514
00515 radians = fovy_ * 0.5 / 180.0 * M_PI;
00516 wd2 = near_ * tan(radians);
00517 zerop = near_ + ((far_ - near_) * OpenFlipperSettings().value("Core/Stereo/FocalDistance").toDouble() );
00518 ndfl = near_ / zerop ;
00519 xrange = a * wd2 * 2 * zerop / near_;
00520
00521 l = -a*wd2;
00522 r = a*wd2;
00523 t = wd2;
00524 b = -wd2;
00525
00526 double offset = 0.5 * OpenFlipperSettings().value("Core/Stereo/EyeDistance").toDouble() * xrange;
00527 double offset2 = offset * ndfl;
00528
00529
00530 glMatrixMode(GL_PROJECTION);
00531 glLoadIdentity();
00532 glFrustum(l+offset2, r+offset2, b, t, near_, far_);
00533 glTranslatef(offset, 0.0, 0.0);
00534
00535 glMatrixMode(GL_MODELVIEW);
00536 glstate_->clearBuffers ();
00537 glClear(GL_DEPTH_BUFFER_BIT);
00538
00539
00540 glColorMask(GL_TRUE,GL_FALSE,GL_FALSE,GL_TRUE);
00541 drawScene_mono();
00542 glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
00543
00544
00545
00546 glMatrixMode(GL_PROJECTION);
00547 glLoadIdentity();
00548 glFrustum(l-offset2, r-offset2, b, t, near_, far_);
00549 glTranslatef(-offset, 0.0, 0.0);
00550 glMatrixMode(GL_MODELVIEW);
00551 glClear(GL_DEPTH_BUFFER_BIT);
00552
00553
00554 glColorMask(GL_FALSE,GL_TRUE,GL_TRUE,GL_TRUE);
00555 drawScene_mono();
00556 glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
00557
00558 }
00559
00560
00561
00562 void
00563 glViewer::updateCustomAnaglyphStereo()
00564 {
00565 if (!customAnaglyphSupported_)
00566 return;
00567
00568 if (!agProgram_)
00569 {
00570 GLint errorPos;
00571
00572 glGenProgramsARB (1, &agProgram_);
00573
00574 glGetError ();
00575 glBindProgramARB (GL_FRAGMENT_PROGRAM_ARB, agProgram_);
00576 glProgramStringARB (GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
00577 strlen (customAnaglyphProg), customAnaglyphProg);
00578
00579 glGetIntegerv (GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
00580 if (glGetError () != GL_NO_ERROR || errorPos != -1)
00581 {
00582 printf("Error loading program %d %s\n",errorPos, glGetString(GL_PROGRAM_ERROR_STRING_ARB));
00583 glDeleteProgramsARB (1, &agProgram_);
00584 customAnaglyphSupported_ = false;
00585 return;
00586 }
00587 }
00588
00589 if (!agTexture_[0])
00590 glGenTextures (2, agTexture_);
00591
00592 if (!agTexture_[0])
00593 {
00594 finiCustomAnaglyphStereo ();
00595 customAnaglyphSupported_ = false;
00596 return;
00597 }
00598
00599 if (glstate_->viewport_width () != agTexWidth_ ||
00600 glstate_->viewport_height () != agTexHeight_)
00601 {
00602 glBindTexture (GL_TEXTURE_RECTANGLE_NV, agTexture_[0]);
00603 glTexImage2D (GL_TEXTURE_RECTANGLE_NV, 0, GL_RGB, glstate_->viewport_width (),
00604 glstate_->viewport_height (), 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
00605 glBindTexture (GL_TEXTURE_RECTANGLE_NV, agTexture_[1]);
00606 glTexImage2D (GL_TEXTURE_RECTANGLE_NV, 0, GL_RGB, glstate_->viewport_width (),
00607 glstate_->viewport_height (), 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
00608 glBindTexture (GL_TEXTURE_RECTANGLE_NV, 0);
00609
00610 agTexWidth_ = glstate_->viewport_width ();
00611 agTexHeight_ = glstate_->viewport_height ();
00612 }
00613 }
00614
00615
00616
00617 void
00618 glViewer::finiCustomAnaglyphStereo()
00619 {
00620 if (!customAnaglyphSupported_)
00621 return;
00622
00623 if (agProgram_)
00624 glDeleteProgramsARB (1, &agProgram_);
00625
00626 if (agTexture_[0])
00627 glDeleteTextures (2, agTexture_);
00628 }
00629
00630
00631
00632 void
00633 glViewer::drawScene_customAnaglyphStereo()
00634 {
00635 updateCustomAnaglyphStereo ();
00636
00637 if (!customAnaglyphSupported_)
00638 return;
00639
00640 double l, r, t, b, w, h, a, radians, wd2, ndfl, zerop, xrange;
00641
00642 w = glWidth();
00643 h = glHeight();
00644 a = w / h;
00645
00646 radians = fovy_ * 0.5 / 180.0 * M_PI;
00647 wd2 = near_ * tan(radians);
00648 zerop = near_ + ((far_ - near_) * OpenFlipperSettings().value("Core/Stereo/FocalDistance").toDouble() );
00649 ndfl = near_ / zerop ;
00650 xrange = a * wd2 * 2 * zerop / near_;
00651
00652 l = -a*wd2;
00653 r = a*wd2;
00654 t = wd2;
00655 b = -wd2;
00656
00657 double offset = 0.5 * OpenFlipperSettings().value("Core/Stereo/EyeDistance").toDouble() * xrange;
00658 double offset2 = offset * ndfl;
00659
00660 int vp_l, vp_b, vp_w, vp_h;
00661 glstate_->get_viewport (vp_l, vp_b, vp_w, vp_h);
00662
00663 std::vector<float> le = OpenFlipper::Options::anaglyphLeftEyeColorMatrix();
00664 std::vector<float> re = OpenFlipper::Options::anaglyphRightEyeColorMatrix();
00665
00666
00667 glMatrixMode(GL_PROJECTION);
00668 glLoadIdentity();
00669 glFrustum(l+offset2, r+offset2, b, t, near_, far_);
00670 glTranslatef(offset, 0.0, 0.0);
00671 glMatrixMode(GL_MODELVIEW);
00672 glstate_->clearBuffers ();
00673 glClear(GL_DEPTH_BUFFER_BIT);
00674 drawScene_mono();
00675
00676 glBindTexture (GL_TEXTURE_RECTANGLE_NV, agTexture_[0]);
00677 glCopyTexSubImage2D (GL_TEXTURE_RECTANGLE_NV, 0, 0, 0, vp_l, vp_b, vp_w, vp_h);
00678 glBindTexture (GL_TEXTURE_RECTANGLE_NV, 0);
00679
00680
00681 glMatrixMode(GL_PROJECTION);
00682 glLoadIdentity();
00683 glFrustum(l-offset2, r-offset2, b, t, near_, far_);
00684 glTranslatef(-offset, 0.0, 0.0);
00685 glMatrixMode(GL_MODELVIEW);
00686 glstate_->clearBuffers ();
00687 glClear(GL_DEPTH_BUFFER_BIT);
00688 drawScene_mono();
00689
00690 glBindTexture (GL_TEXTURE_RECTANGLE_NV, agTexture_[1]);
00691 glCopyTexSubImage2D (GL_TEXTURE_RECTANGLE_NV, 0, 0, 0, vp_l, vp_b, vp_w, vp_h);
00692 glBindTexture (GL_TEXTURE_RECTANGLE_NV, 0);
00693
00694 glActiveTexture (GL_TEXTURE0);
00695 glBindTexture (GL_TEXTURE_RECTANGLE_NV, agTexture_[0]);
00696 glEnable (GL_TEXTURE_RECTANGLE_NV);
00697
00698 glActiveTexture (GL_TEXTURE1);
00699 glBindTexture (GL_TEXTURE_RECTANGLE_NV, agTexture_[1]);
00700 glEnable (GL_TEXTURE_RECTANGLE_NV);
00701
00702 glEnable (GL_FRAGMENT_PROGRAM_ARB);
00703 glBindProgramARB (GL_FRAGMENT_PROGRAM_ARB, agProgram_);
00704
00705 glProgramEnvParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 0, le[0], le[3], le[6], 0.0);
00706 glProgramEnvParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 1, le[1], le[4], le[7], 0.0);
00707 glProgramEnvParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 2, le[2], le[5], le[8], 0.0);
00708
00709 glProgramEnvParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 3, re[0], re[3], re[6], 0.0);
00710 glProgramEnvParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 4, re[1], re[4], re[7], 0.0);
00711 glProgramEnvParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 5, re[2], re[5], re[8], 0.0);
00712
00713 glMatrixMode(GL_PROJECTION);
00714 glLoadIdentity();
00715 glOrtho(0, vp_w, vp_h, 0, 0, 1.0);
00716 glMatrixMode(GL_MODELVIEW);
00717 glLoadIdentity();
00718
00719 glDisable (GL_DEPTH_TEST);
00720
00721 glBegin (GL_QUADS);
00722 glMultiTexCoord2f (GL_TEXTURE0, 0, vp_h);
00723 glMultiTexCoord2f (GL_TEXTURE1, 0, vp_h);
00724 glVertex2i(0, 0);
00725 glMultiTexCoord2f (GL_TEXTURE0, 0, 0);
00726 glMultiTexCoord2f (GL_TEXTURE1, 0, 0);
00727 glVertex2i(0, vp_h);
00728 glMultiTexCoord2f (GL_TEXTURE0, vp_w, 0);
00729 glMultiTexCoord2f (GL_TEXTURE1, vp_w, 0);
00730 glVertex2i(vp_w, vp_h);
00731 glMultiTexCoord2f (GL_TEXTURE0, vp_w, vp_h);
00732 glMultiTexCoord2f (GL_TEXTURE1, vp_w, vp_h);
00733 glVertex2i(vp_w, 0);
00734 glEnd ();
00735
00736 glEnable (GL_DEPTH_TEST);
00737
00738 glBindProgramARB (GL_FRAGMENT_PROGRAM_ARB, 0);
00739 glDisable (GL_FRAGMENT_PROGRAM_ARB);
00740
00741 glActiveTexture (GL_TEXTURE1);
00742 glBindTexture (GL_TEXTURE_RECTANGLE_NV, 0);
00743 glDisable (GL_TEXTURE_RECTANGLE_NV);
00744
00745 glActiveTexture (GL_TEXTURE0);
00746 glBindTexture (GL_TEXTURE_RECTANGLE_NV, 0);
00747 glDisable (GL_TEXTURE_RECTANGLE_NV);
00748
00749 }
00750
00751
00752
00753