/*! Generate a normal random variable using the Box-Muller generator. Generate a normal random variable with mean 0 and standard deviation of 1. To adjust to some other distribution, multiply by the standard deviation and add the mean. Box-Muller method */ double vpGaussRand::gaussianDraw() { static bool AlreadyDone = false; static double x2; if (AlreadyDone) { AlreadyDone=false; return x2; } else { double v1=0, v2=0, rsq=0; do { v1=2*draw1()-1; v2=2*draw1()-1; rsq=v1*v1+v2*v2; } while (rsq >= 1); double fac=sqrt(-2*log(rsq)/rsq); x2=v2*fac; AlreadyDone=true; return v1*fac; } }
//----------------------------------------------------------------------------- void drawShadow() { //計算は平行光線に対する影 //オブジェクトごとに光源の方向を変え、疑似的に点光源に対する影を作る float mat[16]; //影行列の要素 flagShadow = true; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glDepthMask(GL_FALSE); //影の描画 CalcShadowMat(0, mat); glPushMatrix(); glMultMatrixf(mat);//マトリクスの乗算 draw0();//オブジェクトの描画 glPopMatrix(); CalcShadowMat(1, mat); glPushMatrix(); glMultMatrixf(mat);//マトリクスの乗算 draw1();//オブジェクトの描画 glPopMatrix(); //影の描画終了 glDepthMask(GL_TRUE); glDisable(GL_BLEND); flagShadow = false; }
//-------------------------------------------------------------- void ofApp::update(){ fbo.begin(); //begin the frame buffer for(int i = 0; i < 200; i++){ draw1(); } fbo.end(); }
void drawScoreboard(paddle *p1, paddle *p2){ uint32_t gold = 0xffff00; //white = 0xffffff; if ( p1->score == 0 ) draw0(gold,P1_SCORE_X,P1_SCORE_Y); else if ( p1->score == 1 ) draw1(gold,P1_SCORE_X,P1_SCORE_Y); else if ( p1->score == 2 ) draw2(gold,P1_SCORE_X,P1_SCORE_Y); else if ( p1->score == 3 ) draw3(gold,P1_SCORE_X,P1_SCORE_Y); if ( p2->score == 0 ) draw0(gold,P2_SCORE_X,P2_SCORE_Y); else if ( p2->score == 1 ) draw1(gold,P2_SCORE_X,P2_SCORE_Y); else if ( p2->score == 2 ) draw2(gold,P2_SCORE_X,P2_SCORE_Y); else if ( p2->score == 3 ) draw3(gold,P2_SCORE_X,P2_SCORE_Y); }
// private set ups void Animation::setupEnter(){ Point* p1 = new Point(-9.75, -5.0); Point* p2 = new Point(-9.25, -5.0); Point* p3 = new Point(-8.75, -5.0); Point* p4 = new Point(-8.25, -5.0); Point* p5 = new Point(-7.75, -5.0); Point* p6 = new Point(-7.25, -5.0); Point* p7 = new Point(-6.75, -5.0); Point* p8 = new Point(-6.25, -5.0); Point* p9 = new Point(-5.75, -5.0); Point* p10 = new Point(-5.25, -5.0); Point* p11 = new Point(-4.75, -5.0); Point* p12 = new Point(-4.25, -5.0); Point* p13 = new Point(-3.75, -5.0); Point* p14 = new Point(-3.25, -5.0); Point* p15 = new Point(-2.75, -5.0); Point* p16 = new Point(-2.25, -5.0); Point* p17 = new Point(-1.75, -5.0); Point* p18 = new Point(-1.25, -5.0); Rectangle1 nostep(5.0, 5.0, Point(-10.75, -5.0), "data/character/nostep",UserManager::getProfile().getColor()); Rectangle1 step(5.0, 5.0, Point(-10.25, -5.0), "data/character/step",UserManager::getProfile().getColor()); Rectangle1 draw1(5.0, 5.0, Point(-1.25, -5.0), "data/character/draw1",UserManager::getProfile().getColor()); Rectangle1 draw2(5.0, 5.0, Point(-1.25, -5.0), "data/character/draw2",UserManager::getProfile().getColor()); Rectangle1 draw3(5.0, 5.0, Point(-1.25, -5.0), "data/character/draw3",UserManager::getProfile().getColor()); Rectangle1 defense(5.0, 5.0, Point(-1.25, -5.0), "data/character/defensivestance",UserManager::getProfile().getColor()); enter.push_back(nostep); enter.push_back(step); nostep.setPoint(p1); step.setPoint(p2); enter.push_back(nostep); enter.push_back(step); nostep.setPoint(p3); step.setPoint(p4); enter.push_back(nostep); enter.push_back(step); nostep.setPoint(p5); step.setPoint(p6); enter.push_back(nostep); enter.push_back(step); nostep.setPoint(p7); step.setPoint(p8); enter.push_back(nostep); enter.push_back(step); nostep.setPoint(p9); step.setPoint(p10); enter.push_back(nostep); enter.push_back(step); nostep.setPoint(p11); step.setPoint(p12); enter.push_back(nostep); enter.push_back(step); nostep.setPoint(p13); step.setPoint(p14); enter.push_back(nostep); enter.push_back(step); nostep.setPoint(p15); step.setPoint(p16); enter.push_back(nostep); enter.push_back(step); nostep.setPoint(p17); step.setPoint(p18); enter.push_back(nostep); enter.push_back(step); enter.push_back(draw1); enter.push_back(draw2); enter.push_back(draw3); enter.push_back(defense); Rectangle1 monster(5.0, 5.0, Point(10.5, -6), "data/monster/" + mon); enemyEnter.push_back(monster); Point* point = new Point(10.0, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(9.5, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(9.0, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(8.5, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(8.0, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(7.5, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(7.0, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(6.5, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(6.0, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(5.5, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(4.0, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(3.5, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(3.0, -6); monster.setPoint(point); enemyEnter.push_back(monster); point = new Point(2.5, -6); monster.setPoint(point); enemyEnter.push_back(monster); enemyEnter.push_back(monster); enemyEnter.push_back(monster); enemyEnter.push_back(monster); enemyEnter.push_back(monster); enemyEnter.push_back(monster); enemyEnter.push_back(monster); enemyEnter.push_back(monster); enemyEnter.push_back(monster); enemyEnter.push_back(monster); }
void display(void) { //時間計測 static double time1, time2, drawTime, frame; if(ang <= 0.001) time1 = timeGetTime(); //カラーバッファ,デプスバッファのクリア glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();//視点を変えるときはこの位置に必要 if(cos(M_PI * view.theta /180.0) >= 0.0)//カメラ仰角90度でビューアップベクトル切替 gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, 1.0, 0.0); else gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, -1.0, 0.0); //光源設定//'l'を押した後光源位置可変 glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_3D, texName[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_3D, texName[1]); // シェーダプログラムの適用 glUseProgram(shaderProg); GLint scaleLoc = glGetUniformLocation(shaderProg, "scale"); glUniform1f(scaleLoc, scaleTex); GLint coordLoc = glGetUniformLocation(shaderProg, "coord"); if(coord == OBJECT) glUniform1i(coordLoc, 0); else glUniform1i(coordLoc, 1); GLint texLoc = glGetUniformLocation(shaderProg, "smpl3D"); glUniform1i(texLoc, 0);//GL_TEXTURE0を適用 draw0(); glUniform1i(texLoc, 1);//GL_TEXTURE1を適用 draw1(); // シェーダプログラムの適用を解除 glUseProgram(0); drawFloor0(10.0, 10.0, 10, 10); //影 drawShadow(); //回転角度更新 ang += dang; if(ang >= 360.0) { time2 = timeGetTime(); drawTime = (time2 - time1) * 0.001;//1回転当たりの描画時間 printf("描画時間 = %4.4f[s] \n", drawTime); frame = (360.0 / dang) / drawTime; printf("フレーム数 = %4.4f[fps] \n", frame); ang = 0.0; } if(flagHelp) { printf("矢印キーによるアフィン変換/光源移動 \n"); printf(" →,←:x軸 \n"); printf(" ↑,↓:y軸 \n"); printf(" [Shift]+↑,↓:z軸 \n"); printf(" 'r'を押した後:回転 \n"); printf(" 't'を押した後:平行移動 \n"); printf(" 's'を押した後:スケーリング \n"); printf(" 'l'を押した後、光源位置の移動可 \n"); printf("マウス操作で視点変更可 \n"); printf(" dolly:中央付近を左ボタンクリックで近づき,右ボタンクリックで遠ざかる \n"); printf(" pan:左横および右横を右ボタンクリックで注視点が左右に変化する \n"); printf(" tilt:真上および真下を右ボタンクリックで注視点が上下に変化する \n"); printf(" tumble:左右にドラッグすると視点が左右に変化する \n"); printf(" crane:上下にドラッグすると視点が上下に変化する \n"); printf(" zoom:左下を右ボタンクリックでズームイン \n"); printf(" 右下を右ボタンクリックでズームアウト \n"); printf("[Shift]+'r'でリセット \n"); printf("[F1]キー:テクスチャの倍率調整 \n"); printf("[F2]キー:座標系の切り替え \n"); flagHelp = false; } //終了 glutSwapBuffers(); }
void gendrawop(Image *dst, Rectangle r, Image *src, Point p0, Image *mask, Point p1, Drawop op) { draw1(dst, &r, src, &p0, mask, &p1, op); }
void gendraw(Image *dst, Rectangle r, Image *src, Point p0, Image *mask, Point p1) { draw1(dst, &r, src, &p0, mask, &p1, SoverD); }
void display(void) { //時間計測 static double time1, time2, drawTime, frame; if(ang <= 0.001) time1 = timeGetTime(); //step1:textureの作成 glClearColor( 0.7, 0.6, 0.6, 1.0 );//背景色 //framebuffer objectを有効化 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fbName ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glViewport( 0, 0, TEX_WIDTH, TEX_HEIGHT ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective(fb_view.fovY, (double)TEX_WIDTH/(double)TEX_HEIGHT, fb_view.nearZ, fb_view.farZ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); gluLookAt(fb_view.pos[0], fb_view.pos[1], fb_view.pos[2], fb_view.cnt[0], fb_view.cnt[1], fb_view.cnt[2], 0.0, 1.0, 0.0); glUseProgram(shaderProg2); draw1(); drawFloor(10.0, 10.0, 10, 10); glUseProgram(0); drawShadow(1); //framebuffer objectの無効化 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); //step2:通常にrendering resize(width, height); glClearColor(0.2, 0.2, 0.3, 1.0);//背景色 //カラーバッファ,デプスバッファのクリア glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();//視点を変えるときはこの位置に必要 if(cos(M_PI * view.theta /180.0) >= 0.0)//カメラ仰角90度でビューアップベクトル切替 gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, 1.0, 0.0); else gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, -1.0, 0.0); //光源設定//'l'を押した後光源位置可変 glLightfv(GL_LIGHT0, GL_POSITION, lightPos); //描画 glBindTexture(GL_TEXTURE_2D, texName); glUseProgram(shaderProg1); GLint samplerLoc = glGetUniformLocation(shaderProg1, "sampler"); glUniform1i(samplerLoc, 0);//GL_TEXTURE0を適用 draw0(); drawFloor(10.0, 10.0, 10, 10); glUseProgram(0); glBindTexture(GL_TEXTURE_2D, 0); //影 drawShadow(0); //回転角度更新 ang += dang; if(ang >= 360.0) { time2 = timeGetTime(); //1回転当たりの描画時間 drawTime = (time2 - time1) * 0.001; frame = (360.0 / dang) / drawTime; printf("フレーム数 = %4.2f[fps] \n", frame); //フレームあたりの描画時間 drawTime = 1.0 / frame; printf("描画時間 = %4.5f[spf] \n", drawTime); ang = 0.0; } if(flagHelp) { printf("矢印キーによるアフィン変換/光源移動 \n"); printf(" →,←:x軸 \n"); printf(" ↑,↓:y軸 \n"); printf(" [Shift]+↑,↓:z軸 \n"); printf(" 'r'を押した後:回転 \n"); printf(" 't'を押した後:平行移動 \n"); printf(" 's'を押した後:スケーリング \n"); printf(" 'l'を押した後、光源位置の移動可 \n"); printf("マウス操作で視点変更可 \n"); printf(" dolly:中央付近を左ボタンクリックで近づき,右ボタンクリックで遠ざかる \n"); printf(" pan:左横および右横を右ボタンクリックで注視点が左右に変化する \n"); printf(" tilt:真上および真下を右ボタンクリックで注視点が上下に変化する \n"); printf(" tumble:左右にドラッグすると視点が左右に変化する \n"); printf(" crane:上下にドラッグすると視点が上下に変化する \n"); printf(" zoom:左下を右ボタンクリックでズームイン \n"); printf(" 右下を右ボタンクリックでズームアウト \n"); printf("[Shift]+'r'でリセット \n"); printf("[Page Up]キー:回転角度+0.1 \n"); printf("[Page Dn]キー:回転角度-0.1 \n"); flagHelp = false; } //終了 glutSwapBuffers(); }
void display(void) { //時間計測 static double time1, time2, drawTime, frame; if(ang <= 0.001) time1 = timeGetTime(); //カラーバッファ,デプスバッファのクリア glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();//視点を変えるときはこの位置に必要 if(cos(M_PI * view.theta /180.0) >= 0.0)//カメラ仰角90度でビューアップベクトル切替 gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, 1.0, 0.0); else gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, -1.0, 0.0); //光源設定//'l'を押した後光源位置可変 glLightfv(GL_LIGHT0, GL_POSITION, lightPos); if(flagWireframe)//'w'でwireframeとsolid model切り替え { glPolygonMode(GL_FRONT,GL_LINE); glPolygonMode(GL_BACK,GL_POINT); } else glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texName); //fragment shaderのユニフォーム変数texのインデックスを取得 GLint texLoc = glGetUniformLocation(shaderProg, "sampler"); glUniform1i(texLoc, 0);//GL_TEXTURE0を適用 // シェーダプログラムの適用 glUseProgram(shaderProg); //描画 draw0(); draw1(); drawFloor0(5.0, 5.0, 5, 5); // シェーダプログラムの適用を解除 glUseProgram(0); //影 drawShadow(); //回転角度更新 ang += dang; if(ang >= 360.0) { time2 = timeGetTime(); drawTime = (time2 - time1) * 0.001; frame = (360.0 / dang) / drawTime; printf("フレーム数 = %4.2f[fps] \n", frame); //フレームあたりの描画時間 drawTime = 1.0 / frame; printf("描画時間 = %4.5f[spf] \n", drawTime); ang = 0.0; } if(flagHelp) { printf("矢印キーによるアフィン変換/光源移動 \n"); printf(" →,←:x軸 \n"); printf(" ↑,↓:y軸 \n"); printf(" [Shift]+↑,↓:z軸 \n"); printf(" 'r'を押した後:回転 \n"); printf(" 't'を押した後:平行移動 \n"); printf(" 's'を押した後:スケーリング \n"); printf(" 'l'を押した後、光源位置の移動可 \n"); printf("マウス操作で視点変更可 \n"); printf(" dolly:中央付近を左ボタンクリックで近づき,右ボタンクリックで遠ざかる \n"); printf(" pan:左横および右横を右ボタンクリックで注視点が左右に変化する \n"); printf(" tilt:真上および真下を右ボタンクリックで注視点が上下に変化する \n"); printf(" tumble:左右にドラッグすると視点が左右に変化する \n"); printf(" crane:上下にドラッグすると視点が上下に変化する \n"); printf(" zoom:左下を右ボタンクリックでズームイン \n"); printf(" 右下を右ボタンクリックでズームアウト \n"); printf("[Shift]+'r'でリセット \n"); printf("[F1]キー:ラップモードの変更 \n"); printf("[F2]キー:透視投影マッピングの視野角の変更 \n"); printf("[F3]キー:投影中心の切り替え \n"); printf("[F4]キー:テクスチャの回転ON/OFF \n"); printf("[Page Up]キー:回転角度+0.1 \n"); printf("[Page Dn]キー:回転角度-0.1 \n"); flagHelp = false; } //終了 glutSwapBuffers(); }
void display(void) { //時間計測 static double time1, time2, drawTime, frame; if(ang <= 0.001) time1 = timeGetTime(); //カラーバッファ,デプスバッファのクリア glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();//視点を変えるときはこの位置に必要 if(cos(M_PI * view.theta /180.0) >= 0.0)//カメラ仰角90度でビューアップベクトル切替 gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, 1.0, 0.0); else gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, -1.0, 0.0); if(flagWireframe)//'w'でwireframeとsolid model切り替え { glPolygonMode(GL_FRONT,GL_LINE); glPolygonMode(GL_BACK,GL_POINT); } else glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); setLight(); glUseProgram(shaderProg); //描画 draw0(); draw1(); drawFloor(20.0, 20.0, 20, 20); glUseProgram(0); //影 drawShadow(0);//光源0に対する影 drawShadow(1);//光源1に対する影 //光源描画 drawLight(); drawSpotlight(); //回転角度更新 ang += dang; if(ang >= 360.0) { time2 = timeGetTime(); //1回転当たりの描画時間 drawTime = (time2 - time1) * 0.001; frame = (360.0 / dang) / drawTime; printf("フレーム数 = %4.4f[fps] \n", frame); //フレームあたりの描画時間 drawTime = 1.0 / frame; printf("描画時間 = %4.4f[spf] \n", drawTime); ang = 0.0; } if(flagHelp) { printf("矢印キーによるアフィン変換/光源移動 \n"); printf(" →,←:x軸 \n"); printf(" ↑,↓:y軸 \n"); printf(" [Shift]+↑,↓:z軸 \n"); printf(" 'r'を押した後:回転 \n"); printf(" 't'を押した後:平行移動 \n"); printf(" 's'を押した後:スケーリング \n"); printf(" 'l'を押した後、光源位置の移動可 \n"); printf("'w'でワイヤーフレームとソリッドモデル切り替え \n"); printf("マウス操作で視点変更可 \n"); printf(" dolly:中央付近を左ボタンクリックで近づき,右ボタンクリックで遠ざかる \n"); printf(" pan:左横および右横を右ボタンクリックで注視点が左右に変化する \n"); printf(" tilt:真上および真下を右ボタンクリックで注視点が上下に変化する \n"); printf(" tumble:左右にドラッグすると視点が左右に変化する \n"); printf(" crane:上下にドラッグすると視点が上下に変化する \n"); printf(" zoom:左下を右ボタンクリックでズームイン \n"); printf(" 右下を右ボタンクリックでズームアウト \n"); printf("[Shift]+'r'でリセット \n"); printf("[Page Up]キー:回転角度+0.1 \n"); printf("[Page Dn]キー:回転角度-0.1 \n"); printf("[F1]:光源の減衰モード切りかえ \n"); printf("[F2]キー:スポットライト指数調整 \n"); printf("[F3]キー:スポットライトのカットオフ角度調整 \n"); flagHelp = false; } //終了 glutSwapBuffers(); }
void display(void) { //時間計測 static double time1, time2, drawTime, frame; if(ang <= 0.001) time1 = timeGetTime(); //ステップ1:デプスマップの作成 glClear(GL_DEPTH_BUFFER_BIT);// デプスバッファをクリアする // ビューポートをテクスチャのサイズに設定する glViewport(0, 0, SHD_WIDTH, SHD_HEIGHT); // 透視変換行列を単位行列に設定する glMatrixMode(GL_PROJECTION); glLoadIdentity(); //光源位置を視点とするモデルビュー変換行列を設定 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluPerspective(fov, (float)SHD_WIDTH / (float)SHD_HEIGHT, 1.0, farZ); gluLookAt(lightPos[0], lightPos[1], lightPos[2], 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); //設定したモデルビュー行列を保存しておく(setTextureMatrixで使用する) glGetFloatv(GL_MODELVIEW_MATRIX, modelview); //デプスバッファの内容だけを取得するので //フレームバッファには書き込まない glColorMask(0, 0, 0, 0); //デプスバッファには背面の奥行きを記録する glCullFace(GL_FRONT); //デプスマップ作成のためにシーンを描画 draw0(); draw1(); drawGround(); // デプスバッファの内容をテクスチャメモリに転送 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, SHD_WIDTH, SHD_HEIGHT, 0); //ステップ2 //通常の描画設定に戻す resize(width, height); glColorMask(1, 1, 1, 1); //フレームバッファへ書き込み許可 glCullFace(GL_BACK);//背面は描画しない //カラーバッファのクリア glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity();//視点を変えるときはこの位置に必要 if(cos(view.theta*M_PI/180.0) >= 0.0)// <= 90.0)//カメラ仰角90度でビューアップベクトル切替 gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, 1.0, 0.0); else gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, -1.0, 0.0); //光源設定//'l'を押した後光源位置可変 glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texName[0]); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, texName[1]); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, texName[2]); glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, texName[3]); glActiveTexture(GL_TEXTURE5); glBindTexture(GL_TEXTURE_2D, texName[4]); glActiveTexture(GL_TEXTURE6); glBindTexture(GL_TEXTURE_2D, texName[5]); //描画 glUseProgram(shaderProg); // シェーダプログラムの適用 glActiveTexture(GL_TEXTURE0); GLint texLoc = glGetUniformLocation(shaderProg, "shadowMap"); glUniform1i(texLoc, 0);//GL_TEXTURE0を適用 GLint texColorLoc = glGetUniformLocation(shaderProg, "colorMap"); GLint texNormalLoc = glGetUniformLocation(shaderProg, "normalMap"); glUniform1i(texColorLoc, 1);//GL_TEXTURE1を適用 glUniform1i(texNormalLoc, 4);//GL_TEXTURE4を適用 draw0(); glUniform1i(texColorLoc, 2);//GL_TEXTURE2を適用 glUniform1i(texNormalLoc, 5);//GL_TEXTURE5を適用 draw1(); glUniform1i(texColorLoc, 3);//GL_TEXTURE3を適用 glUniform1i(texNormalLoc, 6);//GL_TEXTURE6を適用 drawGround(); // シェーダプログラムの適用を解除 glUseProgram(0); drawLight();//光源の描画 //回転角度更新 ang += dang; if(ang >= 360.0) { time2 = timeGetTime(); drawTime = (time2 - time1) * 0.001; frame = (360.0 / dang) / drawTime; printf("フレーム数 = %4.2f[fps] \n", frame); //フレームあたりの描画時間 drawTime = 1.0 / frame; printf("描画時間 = %4.5f[spf] \n", drawTime); ang = 0.0; } if(flagHelp) { printf("矢印キーによるアフィン変換/光源移動 \n"); printf(" →,←:x軸 \n"); printf(" ↑,↓:y軸 \n"); printf(" [Shift]+↑,↓:z軸 \n"); printf(" 'r'を押した後:回転 \n"); printf(" 't'を押した後:平行移動 \n"); printf(" 's'を押した後:スケーリング \n"); printf(" 'l'を押した後、光源位置の移動可 \n"); printf(" マウス操作で視点変更可 \n"); printf(" dolly:中央付近を左ボタンクリックで近づき,右ボタンクリックで遠ざかる \n"); printf(" pan:左横および右横を右ボタンクリックで注視点が左右に変化する \n"); printf(" tilt:真上および真下を右ボタンクリックで注視点が上下に変化する \n"); printf(" tumble:左右にドラッグすると視点が左右に変化する \n"); printf(" crane:上下にドラッグすると視点が上下に変化する \n"); printf(" zoom:左下を右ボタンクリックでズームイン \n"); printf(" 右下を右ボタンクリックでズームアウト \n"); printf("[Shift]+'r'でリセット \n"); printf("[F1]キー:凹凸反転 \n"); printf("[F2]キー:勾配強調 \n"); printf("[F3]キー:シャドウマッピングの視野角調整 \n"); printf("[F4]キー:シャドウマッピングの後方クリップ面調整 \n"); printf("[Page Up]キー:回転角度+0.1 \n"); printf("[Page Dn]キー:回転角度-0.1 \n"); flagHelp = false; } //終了 glutSwapBuffers(); }
//------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, g_winSz[0], g_winSz[1]); //SwapBuffers( g_hDC ); //return; // // setup the block1 with base matrices // // g_transfBlock1.m4_Proj already done vec3 up(0,1,0); look_at(g_transfBlock1.m4_View, g_camera.curEyePos, g_camera.curFocusPos, up); //g_transfBlock1.m4_ViewIT = ...todo g_transfBlock1.m4_ViewProj = g_transfBlock1.m4_Proj * g_transfBlock1.m4_View; g_transfBlock1.eyePos = g_camera.curEyePos; // copy the block to OGL if(fx_transfBlock1) { void* p; fx_transfBlock1->mapBuffer(&p); memcpy(p, &g_transfBlock1, sizeof(transfBlock1)); fx_transfBlock1->unmapBuffer(); } //----------------------------------------------------------------- // // Render a basic floor // //glBeginQuery(GL_TIME_ELAPSED, timerQueries[tqOffset]); #define U 1.0f #define DU 0.1f struct Grid { Grid() { Elts = 0; for(float i=-U; i<=(U+DU); i+=DU) { vtx[Elts++] = vec3(-U, 0, i); vtx[Elts++] = vec3( U, 0, i); vtx[Elts++] = vec3(i, 0,-U); vtx[Elts++] = vec3(i, 0, U); } glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vec3)*(10*10+2), vtx[0].vec_array, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); } int Elts; GLuint vbo; vec3 vtx[10*10+2]; }; static Grid sgrid; if(fx_TechFloor) { fx_pass = fx_TechFloor->getPass(0); fx_pass->execute(); } glEnableVertexAttribArray(0); glDisableVertexAttribArray(1); glDisableVertexAttribArray(2); glDisableVertexAttribArray(3); glDisableVertexAttribArray(4); glBindBuffer(GL_ARRAY_BUFFER, sgrid.vbo); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); glDrawArrays(GL_LINES, 0, sgrid.Elts); glDisableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); if(fx_pass) fx_pass->unbindProgram(); fx_pass = NULL; //glEndQuery(GL_TIME_ELAPSED); // // Mesh rendering // //glBeginQuery(GL_TIME_ELAPSED, timerQueries[tqOffset+1]); if(fx_Tech) { fx_pass = fx_Tech->getPass(0); fx_pass->execute(); } //===========> Draw the generated mesh draw1(); //==================================== if(fx_pass) fx_pass->unbindProgram(); fx_pass = NULL; //glEndQuery(GL_TIME_ELAPSED); #ifdef NOGLUT SwapBuffers( g_hDC ); #else glutSwapBuffers(); #endif // // Timer Query results // //tqOffset = tqOffset ? 0 : 2; // alternate between 2 groups //if(tqStart) // special case of the first render // tqStart = false; //else //{ // int available = 0; // while (!available) // { // glGetQueryObjectiv(timerQueries[tqOffset+1], GL_QUERY_RESULT_AVAILABLE, &available); // } // GLuint64 timeElapsed; // for (int i = 0; i < 2; i++) // { // // See how much time the rendering of object i took in nanoseconds. // glGetQueryObjectui64v(timerQueries[tqOffset+i], GL_QUERY_RESULT, &timeElapsed); // } //} }