//----------------------------------------------------------------------------- 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; }
virtual void onDraw(SkCanvas* canvas) { // this->drawSizeBounds(canvas, 0xFFCCCCCC); static SkImageFilter* (*gFilterProc[])() = { make0, make1, make2, make3, make4, make5, make6, make7 }; const SkRect bounds = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT); const SkScalar dx = bounds.width() * 8 / 7; const SkScalar dy = bounds.height() * 8 / 7; canvas->translate(SkIntToScalar(8), SkIntToScalar(8)); for (int i = 0; i < (int)SK_ARRAY_COUNT(gFilterProc); ++i) { int ix = i % 4; int iy = i / 4; SkAutoCanvasRestore acr(canvas, true); canvas->translate(ix * dx, iy * dy); SkPaint p; p.setStyle(SkPaint::kStroke_Style); canvas->drawRect(bounds, p); SkPaint paint; paint.setImageFilter(gFilterProc[i]())->unref(); canvas->saveLayer(&bounds, &paint); draw0(canvas); } }
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); }
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 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(); }