
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で質問しましょう!
似たような質問が見つかりました
- その他(IT・Webサービス) MCreatorについての質問です。MODを作っているのですが 腕のテクスチャがバクります。 これっ 1 2022/04/02 17:37
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- 一戸建て 現在、新築の照明計画をしているところです。 住宅メーカーからの照明計画の図面がこれでいいのかさっぱり 4 2022/10/01 22:05
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- サッカー・フットサル 日本代表がカタール大会最後にやるべきことは 3 2022/11/27 23:25
- リフォーム・リノベーション 2種の電球の調光について 1 2023/06/07 23:21
- 建築士 石膏ボードGL工法 ボンド乾燥とする水分計の値 2 2023/08/27 22:28
- デスクトップパソコン Geforceのグラボってradeonと比較して画質が劣ります、解決策はないでしょうか? 2 2022/11/14 20:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UWSCでPEEKCOLORを使い指定ウィ...
-
UWSC 用のマクロコードを教え...
-
アプリケーションについて
-
ピクチャーボックスのスケール...
-
マウスカーソルの移動
-
外付ディスプレイで AutoHotkey...
-
エクセルVBAで画像を貼り付ける...
-
UWSCのPEEKCOLORについての質問
-
マルチディスプレイ環境のとき...
-
UWSCのCHKIMG関数について
-
マウスストーカーのようにカー...
-
コントロール名とそのプロパテ...
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
CloseとDisposeの違い
-
【Excel】特定の文字を含むセル...
-
【Excel VBA】マクロボタンを表...
-
エクセルVBAで、MsgBox やInput...
-
switch の範囲指定
-
アクセスVBA フォームのス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C#で、画像の、指定した座標の...
-
UWSC画像認識で座標の位置がず...
-
C言語でグラフ作成??
-
Excel VBAで他アプリケーション...
-
VBA HTML要素または文字の座標...
-
uwscについて、同一の画像(仮...
-
VBでクリックイベントを発生さ...
-
エクセルVBAで画像を貼り付ける...
-
マウスイベントが動かない
-
UWSCのプログラミングついて教...
-
PostScriptについて
-
VBでデスクトップ上のアイコン...
-
UWSCのCHKIMG関数について
-
LineTo,MoveToについて
-
マウスカーソルの移動
-
UWSファイルの編集?
-
DirectX テクスチャの拡大
-
VBAで ScreenToClient を使いたい
-
高さのあるクォータービューの...
-
UWSCでPEEKCOLORを使い指定ウィ...
おすすめ情報