Openglでテクスチャを透明にする方法について
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();
}
お礼
返答ありがとうございます。 僕は真っ黒にはならなかったんですが、もしなった場合仰られた通りに すれば直るのですね。 質問投稿を出した後、いろいろサイトを見回り、 http://www.c-unit.com/portfolio/cvxporter/ のサイトのcvExporterというのを試してみたり(maya6.5のせいなのか 使用できませんでした)、 http://www.gamedev.net/community/forums/topic.asp?topic_id=383794 のサイトの通りにSDKのファイルをコピペしてみましたが、 逆に、File>ExportSelectionで出てくるオプション設定が 出てこなくなり、ファイルの名前と作成場所を指定したら 即座に作られてしまうようになってしまいました。 とはいえ一時しのぎな解決策は見つかりました。 maya上でobjファイルでエクスポートし、フリーソフトのメタセコイア でobj->Xファイルに変換する方法、 仰られたようにXファイルをテキスト編集で、 TextureFilenameブロックにテクスチャ名を書き込む、という方法で テクスチャ貼られた状態でmayaのオブジェクトデータをXファイルエクスポートできました。 これらの方法が正しくエクスポート出来ているのか、 ちゃんとMaya上でのExportオプションで設定しないと 出せない情報があるんじゃないか、という問題点は残りましたが 問題が起こり次第また質問させていただこうと思います。