
Microsoft Visual C++ 2008 Express Edition を使ってtgaファイルをテクスチャとして取り込んで表示するプログラムを作っております.
Openglのスポットライト機能を使ってテクスチャを照らしたいと考えています.
しかし,どこかのプログラミングがおかしいのか,テクスチャの張り付けに指定された座標4点付近にライトが当たったときでないとテクスチャが光りません.
方法がわからなかったので,テクスチャを大きな球体の内部に配置し,球体の内部からスポットライトでテクスチャ方向を照らすようにしました.
添付した図の左下にスポットライトが白っぽく見えているのは,この大きな球体の内部を照らした光となっています.
このように球体内部がスポットライトで照ったので,後はテクスチャさえ透明にすることができれば,間接的にテクスチャをスポットライトで照らしているような感じで見えるのではないかと考えています.
しかし肝心のテクスチャを透明にする方法が全くわかりません.(´・ω・)
アルファ値というのを使ったり,ブレンド?を使ったりしたらできるのでは,と思ったのですが,どこにどうプログラムしたらいいのかの具体的な説明がなかったので,わかりませんでした(´・ω・)
テクスチャを透かして,奥の大きな球体内部を照らすことができれば,その明るさで半透明の手前のテクスチャもうっすら光るのではないかと考えています.
わかる方,教えてください.
本当に困ってます;w;
今のプログラム内部のテクスチャの部分は以下に書きます.
よろしくお願いします><;
void initTexture(void)
{
FILE *fp;
int x, z;
/* texture file open */
if((fp=fopen("ougonzan.tga", "rb"))==NULL){
fprintf(stderr, "texture file cannot open\n");
return;
}
fseek(fp, 18, SEEK_SET);
for(x=0; x<TEX_HEIGHT; x++){
for(z=0; z<TEX_WIDTH; z++){
image[x][z][2]=fgetc(fp);/* B */
image[x][z][1]=fgetc(fp);/* G */
image[x][z][0]=fgetc(fp);/* R */
image[x][z][3]=fgetc(fp);/* alpha */
}
}
fclose(fp);
}
void displayTexPolygon(void)
{
glEnable(GL_TEXTURE_2D);
glBegin(GL_TRIANGLE_FAN);
glTexCoord2f(0.0, 0.0); glVertex3f(-16.0,-12.0, 5.0); //左下
glTexCoord2f(0.0, 1.0); glVertex3f(-16.0, 12.0, 5.0); //左上
glTexCoord2f(1.0, 1.0); glVertex3f( 16.0, 12.0, 5.0); //右上
glTexCoord2f(1.0, 0.0); glVertex3f( 16.0,-12.0, 5.0); //右下
glEnd();
glDisable(GL_TEXTURE_2D);
}
void display(void)
{
static const float floor_Color[] = { 1.0, 1.0, 1.0, 1.0 };
static GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 };
static GLfloat yellow[] = { 0.8, 0.8, 0.2, 0.0 };
static GLfloat white[] = { 1.0, 1.0, 1.0, 0.0 };
static float spin=0.0;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
//gluLookAt( 視点の位置x,y,z, 視界の中心位置の参照点座標x,y,z, 視界の上方向のベクトルx,y,z);
gluLookAt( 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0); // 内側から
//集中型スポットライト
//glLightfv(光源番号, パラメータ, パラメータの値);
glLightfv(GL_LIGHT0, GL_POSITION, SpotLight.pos); //光源の位置[pos]
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, SpotLight.spotDir);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, SpotLight.spotCutoff);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, SpotLight.spotExp);
//巨大な球体
glPushMatrix();
glTranslated(0.0, 0.0, 7);
glMaterialfv(GL_FRONT, GL_DIFFUSE, white);
glutSolidSphere(60, 10000, 10000);
glPopMatrix();
glPushMatrix();
glPopMatrix();
glPushMatrix();
glClearColor(0.0, 0.0, 1.0, 0.5);
glTranslatef(0.0, 0.0, 45.0); //テクスチャの位置設定
// glRotatef(spin, 0.0, 1.0, 0.0); //テクスチャの回転
glColor4f(1.0, 0.0, 0.0, 0.0); //テクスチャの色設定
displayTexPolygon();
}
spin+=1.0;
glPopMatrix();
glFlush();
glutSwapBuffers();
}

A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
static const float floor_Color[] = { 1.0, 1.0, 1.0, 1.0 };
static GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 };
static GLfloat yellow[] = { 0.8, 0.8, 0.2, 0.0 };
static GLfloat white[] = { 1.0, 1.0, 1.0, 0.0 };
static float spin=0.0;
glClearColor(0.0, 0.0, 1.0, 0.5);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
//gluLookAt( 視点の位置x,y,z, 視界の中心位置の参照点座標x,y,z, 視界の上方向のベクトルx,y,z);
gluLookAt( 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0); // 内側から
//集中型スポットライト
//glLightfv(光源番号, パラメータ, パラメータの値);
glLightfv(GL_LIGHT0, GL_POSITION, SpotLight.pos); //光源の位置[pos]
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, SpotLight.spotDir);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, SpotLight.spotCutoff);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, SpotLight.spotExp);
glPushAttrib(GL_ENABLE_BIT);
//巨大な球体
glPushMatrix();
glTranslated(0.0, 0.0, 7);
glMaterialfv(GL_FRONT, GL_DIFFUSE, white);
glutSolidSphere(60, 10000, 10000);
glPopMatrix();
glPushMatrix();
glTranslatef(0.0, 0.0, 45.0); //テクスチャの位置設定
// glRotatef(spin, 0.0, 1.0, 0.0); //テクスチャの回転
glColor4f(1.0, 1.0, 1.0, 0.0); //テクスチャの色設定
glDisable(GL_LIGHTING);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
displayTexPolygon();
glPopMatrix();
glPopAttrib();
テストしてないですが、多分大体こんな感じだと思います。
> テクスチャの張り付けに指定された座標4点付近にライトが当たったときでないとテクスチャが光りません.
OpenGLの標準の陰影計算では、ポリゴンの頂点ごとに色を計算し、面内部の色は頂点色の補間色になります。
したがって、今回の例ですと頂点は四角形の角4つしかないため、そのどれかにライトが当たった場合その点付近は明るくなりますが残り3点は暗いまま。
また、四角形の真ん中付近を照らしている場合は上記に従い4つの角すべてが真っ暗になるため、面内部も真っ暗になる、というわけです。
これについては、単に将棋板のように四角形を細かく区切って表示することで緩和することができます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
uwscについて、同一の画像(仮...
-
Excel VBAで他アプリケーション...
-
外付ディスプレイで AutoHotkey...
-
「ご処理進めて頂きますようお...
-
エクセルVBAで、MsgBox やInput...
-
UPS警告音を止めたい
-
CloseとDisposeの違い
-
メルカリのメルカードで買い物...
-
アクセスVBAのMe!と[ ]
-
フォームコントロールから作っ...
-
お家デートをしててハグを長い...
-
エクセルで、日付を入力すると...
-
Googleフォーム・複数人の申し...
-
オブジェクト名をVBAで指定...
-
VBAでCOPYを繰り返すと、処理が...
-
生活保護受給者は性欲をどんな...
-
Visual Basic 6.0 コンボボック...
-
VBの質問#if 0 then ってどう...
-
文字列で小数点以下の0を削除し...
-
【Excel】特定の文字を含むセル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C#で、画像の、指定した座標の...
-
VBでクリックイベントを発生さ...
-
Excel VBAで他アプリケーション...
-
マウスイベントが動かない
-
外付ディスプレイで AutoHotkey...
-
UWSファイルの編集?
-
エクセルVBAで画像を貼り付ける...
-
UWSC画像認識で座標の位置がず...
-
NoxPlayerとUWSCのadbの座標に...
-
uwscについて、同一の画像(仮...
-
ピクチャーボックスのスケール...
-
C言語でグラフ作成??
-
ひし形のあたり判定について
-
VBA HTML要素または文字の座標...
-
マウスカーソルの移動
-
PHPでエクセルのグラフを作成ま...
-
WindowsAPI ツリービューについて
-
画像中のある座標でマウスオー...
-
UWSCのプログラミングついて教...
-
元の比率で画像を切り抜きする方法
おすすめ情報