• 締切済み

OpenGLでのテクスチャ貼り付け方法

OpenGLでbmpファイルをテクスチャとして貼りたいのですが、方法が全く分かりません。 方法、または方法が分かるサイトのURLを教えてください。

みんなの回答

  • rigidbody
  • ベストアンサー率60% (20/33)
回答No.1

(1) bmpをメモリ上に展開。この時、OpenGLがサポートするピクセルフォーマット及び画素の並び方にしておく。 (2) 貼り付け対象のメッシュを描画前に、glTexture2D()を呼ぶ。 大雑把に言ってこんな感じです。詳細を知るには、 (A) glTexture2Dをキーワードに検索 (B) OpenGL関連の本を買う が良いと思います。特に(B)はお勧めです。 因みにOpenGL Programming Guideという本が公式の解説書です。が、\11000もする上、誤植も多いです。

gyantz30
質問者

お礼

OpenGLの本を買ってなんとか解決しました。 ありがとうございました。

関連するQ&A

  • OPENGLでOBJファイルのフォーマットによるテクスチャマッピングの方法

    私は大学で情報分野を専攻している者です。 最近は研究でコンピュータグラフィックを学習しなくてはならなくなりました。 具体的に、OBJファイル,mtlファイル,そして画像(bmp形式)のデータを用いてOPENGLでグラフィックを描写しなくてはならないのですが、 OBJファイルのフォーマットに従ってテクスチャマッピングする方法(テクスチャ座標値vtのUV座標の使い方)がどうしてもわかりません。グーグルなどで関連するサイトを調べたり赤本を読んだりしたのですが、いまいち理解できませんでした。 もしどなたがご存知であるならば、OPENGLでOBJファイルのフォーマットに従ったテクスチャマッピングの方法を教えていただけないでしょうか? OSはWindows XP,開発環境はVC++2005です。 OBJファイルのデータ数はv,vn,vtが65000ほど、fが130000ほどです。 OBJファイルの構造は理解しています。 どうかよろしくお願いします。

  • 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(); }

  • OpenGLのテクスチャマッピング

    芝や木の幹といった同じ画像を境界が分からないように違和感なくくっ付けてマッピングすることって、OpenGLで出来るのでしょうか。 2次元テクスチャマッピングと検索しても、それらしいものが見当たりません。

  • OpenGLの3Dテクスチャ

     最近OpenGLの勉強を始めました。Windows XP + Visual C++6.0の環境で幾つかのサンプルプログラムは通りました。そこで3Dテクスチャを試したところ以下のエラーが出ました。  ・   ・ ModelMatrix ( 1.00 0.00 ・・・ ) VolumeSize(Compressed) 160 160 34 finished reading data!Assertion failed: 0, file ファイル名、行番号 メッセージから見るとボリュームデータのヘッダは読めたが、以下のglTexImage3Dのアドレス取得に失敗したようです。原因と対処の方法をお教え下さい。  void *extproc;  extproc = (void *) wglGetProcAddress( "glTexImage3D" );  if ( extproc == NULL )    {    _ASSERT(0);    return;    }

  • OpenGLで描いて画像ファイル出力

    OpenGLで作成したアニメーションを動画ファイルとして保存したいと考えています。 調べると、連続画像を生成して他ソフト(AVI Maker等)で結合する方法があるということなんですが、OpenGLで描いたものを画像ファイル(BMPファイル等)に出力するには、どうしたら良いのでしょうか。 参考になるサイト等ありましたら、お願いします。

  • C言語のOpenGLで複数のテクスチャをロード方法

    こんにちは、 よく探してたが、 C言語のOpenGLで一つだけじゃなくて複数のテクスチャをロードする方法は? 見つかったコードは 「一つだけのテクスチャをロードする」 ーーーーーーーーーーー void LoadGLTextures() { // Load Texture Image *image1; // allocate space for texture image1 = (Image *) malloc(sizeof(Image)); if (image1 == NULL) { printf("Error allocating space for image"); exit(0); } if (!ImageLoad("Data/01.bmp", image1)) { exit(1); } // Create Texture glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); // 2d texture (x and y size) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // scale linearly when image bigger than texture glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // scale linearly when image smalled than texture // 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image, // border 0 (normal), rgb color data, unsigned byte data, and finally the data itself. glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data); }; ーーーーーーーーーーー お願いします

  • Lightwave8.0のテクスチャーデータについて

    はじめまして LightWave8.0(以下LW)のテクスチャーデータについて質問させていただきます. 現在進めている作業として, LWのモデラーでUVマッピングも使ったテクスチャ付モデリングデータ をOpenGLプログラミングで呼び出す,ということをやっております. しかしながら,LWで作ったモデリングデータを他のソフト(Deep Exploration, メタセコイヤなど) で表示するとUVマッピングで貼り付けたテクスチャーが反映されません. 当然,それらのソフトで他の形式に変換するとテクスチャーが失われてしまいます. テクスチャマッピングはフォーマット間で互換性がないのでしょうか? LW上で施したUVマッピングがOpenGLで呼び出したそのモデルどうやって反映させるのか, いい方法を知っている方がいましたら教えてください. OpenGLプログラミングで再度テクスチャマッピングをするしかないのでしょうか? それと基本的なことをお聞きしますが, 一般的なモデリングデータにはどれぐらいのテクスチャ情報が入っているのでしょうか. サーフェイスのRGB値はどの表示ソフトを使っても同様に再現されるので含まれているとは思いますが,画像ファイルのリンク,またはテクスチャー画像そのものが含まれているフォーマットというのもあるのでしょうか? ちなみにLWOファイルからCppファイルに変換するのはRight Hemisphere製のDeep Explorationというソフトを使用しています. いろいろと質問してしまいましたが, よろしくお願いします.

  • SAIペイントツールのテクスチャ問題

    SAIペイントツール、テクスチャについて質問です。 (説明が下手かもしれないです、申し訳ありません。) SAI初心者です・・・少し前に夫がSAIを買ってくれました。 少し慣れてきて、もっと新しい筆やテクスチャが欲しい!という欲が出てきました。 とりあえず手動で何度か導入を頑張ってみる。 チュートリアル等(主にSAI WIKI)を検索して、頑張ってみる。 にもかかわらず上手くテクスチャをSAIに導入する事がかなわず 最終的にはSAI Conf Editの力を借りる事にしました。 (こちらから頂いてきました>http://www6.atpages.jp/~gurimiso/confdl.html) これでテクスチャを導入する事は出来ました。 その後にSAIを使用した時に生じた問題についての質問です。 ↓とりあえず今までの過程です。 1)SAIペイントツールフォルダを開ける>blotmapフォルダを開ける>bmpを入れる 2)SAI Conf Editを開ける>ファイル>開く>にじみ・筆形状ファイル 3)テクスチャbmpをクリック>使うをクリック>ファイル>保存>設定をSAIに適用する 4)SAIを起動>新規作成>テクスチャbmpが入っている事を確認! 5)筆設定の中で、テクスチャbmpを選択>試し描き  ←今ここ 画像添付にもあるような画像が出来上がりました。 タイルのようなテクスチャbmpが使えるようになって嬉しいと思った矢先に問題発生。 タイルの間に、筆線が残ってる・・・! 他のテクスチャbmpでも同じでした。全く違うファイルなのに・・・ 線を消しゴムで消す事は出来ます。気の遠くなるような緻密な作業ですが(汗 出来るのは出来ても、無駄な作業な気がしてなりません。 何故こんな事が起こるのでしょう? タイルだけを描く方法、あるいはこの線を簡単に消す方法はあるのでしょうか? どなたかご存知でしたら、是非教えて下さい。 長文失礼しました。 質問を読んでいただき、ありがとうございます。

  • OpenGL テクスチャを縮小表示すると縞模様が…

    こんにちは。お知恵をお借りしたく質問致します。 OpenGLのglTexImage2D関数でテクスチャを作り、Windowsフォームアプリケーション上に表示する際に起きた問題です。 なお、GLSLフラグメントシェーダでテクスチャは編集されています。 そのシェーダを利用した結果を表示すると、dot by dotで表示した際は正常に表示されるのですが、縮小して表示するとモアレと言いますか、縞模様が出てしまいます。※画像参照 また、縮小と言いますのはWindowsFormアプリ内のOpenGL描画用コントロール(glControl)そのものをリサイズするという意味で、テクスチャを作成する際に何か縮小操作を行ったというわけではありません。 テクスチャの貼付は以下のように行っています。 GL.Viewport(0, 0, glControl.Width, glControl.Height); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.Enable(EnableCap.Texture2D); GL.Begin(BeginMode.Quads); { GL.TexCoord2(0, 0); GL.Vertex2(-1, 1); GL.TexCoord2(1, 0); GL.Vertex2(1, 1); GL.TexCoord2(1, 1); GL.Vertex2(1, -1); GL.TexCoord2(0, 1); GL.Vertex2(-1, -1); } GL.End(); GL.Disable(EnableCap.Texture2D); glControl.SwapBuffers(); テクスチャ(1920x1080、RGBA)自体の作成が(理由は不明ですが)縮小時のみおかしくなっている、又はテクスチャの貼り方やビューポート周りの設定不足のように思って居るのですが、原因が掴めていない状況です。 参考までに、補間方法を変えた際の違いも一応スクリーンショットに撮りましたのでよろしければご覧ください。 たった今、glGetTexImageという関数で、作成したテクスチャを取得できるらしいということが分かり、これを用いて縮小表示している際もテクスチャそのものが正常に作成されているかどうかを確認しようと思っています。(が、環境が手元に無く、この確認は明日の朝となります。) この原因及び対処法など、解決の手助けとなるようなことがありましたら何でも構いませんので教えていただきたいです。 その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。 どうかよろしくお願いいたします。

  • OpenGLでBMP画像を出力するには?

    現在アニメーションの作成にOpenGLを使っています. この動画をきれいに保存したいのでBMP出力を考えています. 画面のキャプチャではなくBMPをプログラムにより 出力する方法を教えてください. よろしくお願いします.

専門家に質問してみよう