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();
}
お礼
ご回答ありがとうございます。 いろいろ調査したところ・・ data = (LPDWORD)((LPBYTE)rect.pBits + rect.Pitch * y); の部分の(LPDWORD)を(float*)にしたら解決しました。 >質問者さんに限ることではありませんが、質問する人が、 >どのような結果を期待して、どのような結果になったのかを >提示してもらわなければアドバイスのしようがありません。 確かにその通りですね。 次回からはもう少し具体的に投稿しようと思います。 わざわざソースを載せていただきありがとうございます。 aris-wizの書いていただいたものも1つの参考になりました。