ページ 11

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

Posted: 2010年12月05日(日) 04:06
by ぬっち
いつもお世話になっています。

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

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

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

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

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

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

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

Posted: 2010年12月05日(日) 21:34
by ぬっち
すいません、自己解決しました。
後ほど同じ悩みを持ってしまう人もいる可能性もあるので、ここに解決法を書いておきます。

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

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

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

Posted: 2010年12月06日(月) 02:15
by ISLe
glEnable(GL_TEXTURE_2D)する前にWM_PAINTが呼ばれているとかではないのですね。
Win32APIのUpdateWindowの中からWM_PAINTがSendされますけど。

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

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

Posted: 2010年12月06日(月) 03:50
by ぬっち
>glEnable(GL_TEXTURE_2D)する前にWM_PAINTが呼ばれているとかではないのですね。
>Win32APIのUpdateWindowの中からWM_PAINTがSendされますけど。

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