예제 #1
0
/*!
  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;
  }
}
예제 #2
0
//-----------------------------------------------------------------------------
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();

}
예제 #4
0
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);
}
예제 #5
0
파일: Animation.cpp 프로젝트: baens/SchooGL
// 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);
}
예제 #6
0
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();
}
예제 #7
0
파일: draw.c 프로젝트: grobe0ba/plan9front
void
gendrawop(Image *dst, Rectangle r, Image *src, Point p0, Image *mask, Point p1, Drawop op)
{
	draw1(dst, &r, src, &p0, mask, &p1, op);
}
예제 #8
0
파일: draw.c 프로젝트: grobe0ba/plan9front
void
gendraw(Image *dst, Rectangle r, Image *src, Point p0, Image *mask, Point p1)
{
	draw1(dst, &r, src, &p0, mask, &p1, SoverD);
}
예제 #9
0
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();
}
예제 #10
0
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();
}
예제 #11
0
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();
}
예제 #12
0
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();
}
예제 #13
0
//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
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);
    //    }
    //}
}