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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

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

#1

投稿記事 by ぬっち » 13年前

いつもお世話になっています。

今回はOpenGLのテクスチャマッピングについてお聞きしたいことがありまして、トピックを立てました。
OpenGLでテクスチャマッピングを行おうと、
http://wisdom.sakura.ne.jp/system/opengl/gl23.html
のサイトを参考にして、クラスを作ってみたのですが、どうもうまく行きませんでした。
それで、ホームページに掲載されているサンプルが動くかどうか調べてみると、なんとただ真っ白な四角形が描画されただけでした。
使ったのは上のサンプルです。
実行結果を示します。
opengl.jpg
opengl.jpg (20.86 KiB) 閲覧数: 4406 回
また、開発環境は
統合開発環境 : Visual C++ 2010 Express
OS : Windows 7 64bit Home Premium
です。

テクスチャマッピングがサポートされていないのかと疑ってみましたが、DirectXではテクスチャマッピングは出来ていましたし・・・。
正直原因がわかりません。
よろしくお願いします。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: OpenGLでのテクスチャマッピング

#2

投稿記事 by ISLe » 13年前

リンク先のソースコードの場合だと、disp関数のglBindTextureのすぐ後に
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
の2行を追加してください。
テクスチャのフィルタリング指定です。
#パラメータはお好みで変更してください。

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

Re: OpenGLでのテクスチャマッピング

#3

投稿記事 by ぬっち » 13年前

ISLeさんの仰るとおり、その2行を入れてみたところ、ホームページにのっている実行結果と一致しました。
しかし、私が行っている環境(glutを使用せずWin32APIでの実装)では、やはりうまくいきませんでした。
それで、ちょっと調べたのですが、glGenTexturesの第2引数が、サンプルでは1を返していたのですが、私の環境では0でした。
これが起こってしまう原因は何なのでしょうか?

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

Re: OpenGLでのテクスチャマッピング

#4

投稿記事 by ぬっち » 13年前

すいません、自己解決しました。
後ほど同じ悩みを持ってしまう人もいる可能性もあるので、ここに解決法を書いておきます。

OpenGL+Win32APIで開発を行う場合、専用のデバイスコンテキストの扱いに注意する必要がある。
特にglGenTexturesはこのデバイスコンテキストが作成されていない時に呼んでしまうと第2引数に与えられる値が0となってしまう。
そのため、必ずデバイスコンテキストが作成された後にglGenTexturesを呼ぶ必要がある。
私の場合、描画処理をウィンドウプロシージャのWM_PAINTで行っているため、この中でglGenTexturesを呼び出していたのだが、ウィンドウが表示されるとともにWM_PAINTが発行されてしまい、結局のところ初期化する前にglGenTexturesを呼び出していたことになる。

まあ、何とか解決できました^^;
ISLeさんありがとうございました。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: OpenGLでのテクスチャマッピング

#5

投稿記事 by ISLe » 13年前

glEnable(GL_TEXTURE_2D)する前にWM_PAINTが呼ばれているとかではないのですね。
Win32APIのUpdateWindowの中からWM_PAINTがSendされますけど。

むかしSMPEGのglmovieサンプルをCygwinでコンパイルして動かしたら画面が出ないことがあって、Windowsではスレッドコンテキストが異なるとOpenGLのコンテキストも異なってしまうらしいというのはあるのですが。

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

Re: OpenGLでのテクスチャマッピング

#6

投稿記事 by ぬっち » 13年前

>glEnable(GL_TEXTURE_2D)する前にWM_PAINTが呼ばれているとかではないのですね。
>Win32APIのUpdateWindowの中からWM_PAINTがSendされますけど。

あ、確かに。
glEnable( GL_TEXTURE_2D )を呼び出す前に、WM_PAINTが発行されてますね。。。
その処理も含めてまとめて、初期化完了の合図がきたらWM_PAINTを処理出来る形を取ったので、その可能性は高いかもしれません。

閉鎖

“C言語何でも質問掲示板” へ戻る