• ベストアンサー

OpenGLで陰面消去処理をデプス・バッファについての質問です。

OpenGLで陰面消去処理をデプス・バッファについての質問です。 OpenGLで陰面消去処理をデプス・バッファを使って行っています。 このとき、 glEnable関数の引数としての GL_DEPTHとGL_DEPTH_TESTの違いが分りません。 よろしくお願いします。

noname#210749
noname#210749

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

glEnable/glDisalbe に、GL_DEPTH_TEST を指定することによって、デプスバッファ使用の有無を設定します。 一方、GL_TEST は、glCopyPixels で、カラーバッファ(GL_COLOR)/デプスバッファ(GL_DEPTH)/ステンシルバッファ(GL_STENCIL)のどれをコピーするのか、を指定するのに使う定数です。 glEnable/glDisable に「GL_DEPTH」という設定は存在しません。 「glEnable(GL_TEST)」といったコードは無意味です。 何を参考にされたのかわかりませんが、そのコードが間違えているのだと思います。 http://www.opengl.org/sdk/docs/man/xhtml/glEnable.xml これは、OpenGL の正式なドキュメントです。 英語で書かれていますが、指定できる定数がアルファベット順に並んでいますので、 英語が読めなくても「GL_DEPTH_TEST」は有るけど「GL_TEST」は無いことは確認できると思います。

noname#210749
質問者

お礼

ありがとうございました。 参考にしたコードに問題があったみたいですね。 これからはGL_DEPTH_TESTを使います。

関連するQ&A

  • openGLでの隠面消去処理について

    OpenGLの隠面消去処理について質問です. 2つの物体のある面どうしが完全にきれいに重なるような場合, カメラの角度によって,添付した画像のように 隠面処理が汚くなってしまいます. 重なってしまうのは仕様なのですが,こういった場合も どちらかの面だけをきれいに表示するということは無理なのでしょうか.

  • OpenGLでのプログラミングについて質問です

    http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#7.2 上記URLのソースについて幾つか質問です。 1.以下の用に記述すると、何故以前のラバーバンドを消去することになるのでしょうか? if (rubberband) { /* 以前のラバーバンドを消す */ glVertex2iv(point[pointnum - 1]); glVertex2iv(savepoint); } 2.以下の部分の、staticはどういう役割をしているのでしょうか? void motion(int x, int y) { static GLint savepoint[2]; /* 以前のラバーバンドの端点 */ 3.メインは、以下のように記述されているのですが、OpenGLは通常のCプログラミングと違い、上から下に順次処理されて行っているだけでなく、見えない部分でも何か処理をやっているようなのですが、どういう順序でこのmainは処理されているのでしょうか? int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(320, 240); glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutReshapeFunc(resize); glutMouseFunc(mouse); glutMotionFunc(motion); init(); glutMainLoop(); return 0; } あと、 http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#6.1 に書かれている、 glOrtho(-w / 200.0, w / 200.0, -h / 200.0, h / 200.0, -1.0, 1.0); という関数の意味がよく分かりません。 どなたか、どれか一つだけでも良いので解答をお願いします。

  • こんにちは。

    こんにちは。 現在WindowsのコンソールプログラムにopenGLで球体を描画するプログラムを書いています。 言語はc++です。(Visual Studio 2005) ですが、以下のような状況が発生してしまいました。 1.glEnable(GL_DEPTH_TEST) を使用するとライトを用いて描画したオブジェクトが真っ黒になる。 2.glEnable(GL_DEPTH_TEST) を使わないと、ライトを当てて問題なく描画されるが、やはり深度は変になる。 3.ライトを用いずに glEnable(GL_DEPTH_TEST) を用いると正常に描画される。 以上の球体の描画は glutSolidSphere もしくは gluSphere を用いました。 初期化としては、 glClearDepth(1.0f); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_DIFFUSE, white); glColorMaterial(GL_FRONT, GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); このようにしています。 以上の状況が発生する原因として考えうることは、どのようなことがあるでしょうか。 ご教授いただけると幸いです。

  • CG

    隠線消去・隠面消去でスキャニング法とZバッファ法とレイトレーシング法の違いが分からないのですが?宜しくお願い致します。

  • 引数の値がない場合に自動入力

    お世話になります。 VBAで下記の「関数A」があります。 親ソースで、下記2パターン記載した時に (1)は、test=1で処理が進む (2)は、test=999で処理が進むようにしたいのですが どのように関数Aを記載したら良いでしょうか? ※引数を指定しない時は、999の値が自動で入るように したいのです。 (1)call 関数A(1) (2)call 関数A ※何も引数を指定しない ------関数A---- sub 関数A(test as Long) 'testを使って色々 end sub -----------------

  • Emacs Lisp: 関数に引数が渡せない?

    お世話になります。 ----------------------------------------- ; -*- lisp-interaction -*- ; このファイルはtest.elisというファイル名で、そのファイルを開いたバッファで実行 (buffer-name) ;;; ミニバッファに以下のように表示される ;;; "test.elis" (buffer-name "test.elis") ;;; ★引数を与えるとそのバッファ名を返すはず ;;; エラーになる ;;; Debugger entered--Lisp error: (wrong-type-argument bufferp "test.elis") (get-buffer "test.elis") ;;; ミニバッファに以下のように表示される ;;; #<buffer test.elis> (buffer-file-name) ;;; ミニバッファに以下のように表示される ;;; "/home/userName/test.elis" (buffer-file-name "test.elis") ;;; ★引数を与えるとそのバッファのファイル名を返すはず ;;; エラーになる ;;; Debugger entered--Lisp error: (wrong-type-argument bufferp "test.elis") ----------------------------------------- Emacs Lispの勉強として、上のようなファイルを開いて、各関数の括弧綴じ)の後ろでC-x C-eとタイプして実行し、挙動を調べています。 ★をつけたbuffer-nameおよびbuffer-file-name関数は、それぞれ引数を渡したバッファ名、および、そのバッファのファイル名が返ると思われるのですが、実際には上記のようにエラーになります。 これはどうしてでしょうか。 Emacsは23.4.1を使っています。 よろしくお願いします。

  • OpenGLでの描画のタイミング

     OpenGLの使い方について疑問があったので質問しました.  OpenGLを用いて3Dのゲームを作っています.しかし, どうも処理が遅くカクカクした動きになってしまいます. 描画の量が多くなるにつれて遅くなっているので,原因は 描画の時に原因があるようです.ダブルバッファリング を用いて描画しているのですが,描画のときは… 1「描画関数の実行」(glVertex3f()などの実行) 2「裏に描画」(見えていないバッファに描画) 3「裏表入れ替え」(2つのバッファを交換) 0「一定時間待機して自分自身を呼び出す」            (60FPSなら1/60秒程度) を繰り返すものと考えています.  「1230」と繰り返せば通常通り動くのですが, 「1」に計算がかかりすぎると,「2」と「3」が遅れてしまい, カクカクしてしまうのだろうと考えました. (↑これがそもそも間違っていたらすいません><)  そこで,対策を2つ考えたのですが,これでいいでしょうか? それとも,もっと良い方法はないでしょうか?(「1」を 速くするしか方法はないでしょうか?) 【1】一定時間待機する秒数を可変的にする  現在のところ,「0」では,1/60秒待機させています.  しかし,1に1/30秒かかったとすると,「1230」を 1回繰り返すのに,3/60秒かかってしまうことになり, 結局FPSは20止まりです.  そこで,「123」でかかった時間を記録し,その秒数 を1/60から引いた分だけ「0」で待機すれば,1/60秒になる だろう,という方法です. 【2】描画のタイミングを変える  現在のところ,「1230」の順番で繰り返しています. しかし,これでは描画の関数を呼び出した時,「1」に 1/30秒かかったとすると,実際に表示できるのは1/30秒後 ということになります.よって,プログラムの始めに 「1232」を実行しておき,描画の関数の中身は 「3120」とする,という方法です. (そもそも,「2」と「3」のタイミングを   離せるのかどうかもよくわかりません><)  もちろん【1】と【2】の方法は併用もできると思っています. 「2」はOpenGLに入っているglFlush() 「3」はOpenGLに入っているglutSwapBuffers() 「0」はOpenGLに入っているglutTimerFunc() を用いています. 質問が長くなってしまいましたが,よろしくお願いします. 参考までに… 【OS】Mac OS10.7(Lion) 【開発環境】Xcode3 【言語】c++ 【プログラミング歴】6年(c++2年,OpenGL1年) 【CPU】2.66 GHz Intel Core 2 Duo 【メモリ】4 GB 1067 MHz DDR3

  • あるマクロ処理の処理内容についての質問

    閲覧して頂いてありがとうございます。 C言語を勉強中なのですが、あるプログラムの中に どんな『処理』をしているかわからないマクロ関数があります。 下記Sampleコードの『#define test(n,a,k)』ですが、 一体どのような処理をしているか、ご教授頂けないでしょうか。 漠然とした質問で申し訳ありませんが、よろしくお願い致します。 [Sampleコード] #include <stdio.h> #define UL unsigned long #define UC unsigned char #define test(n,a,k) \ { \ (n) = ((UL)a[k]) \ | ((UL)a[k + 1] << 8) \ | ((UL)a[k + 2] << 16) \ | ((UL)a[k + 3] << 24); \ } int main(void){ UC hoge[] = {"1234567890_1234567890_1234567890_1234567890_1234567890"}; UL buf[4]; UL i; UC *p; p = hoge; test(buf[0], p, 0); test(buf[1], p, 4); test(buf[2], p, 8); test(buf[3], p, 12); for(i = 0; i < sizeof(buf)/sizeof(buf[0]); i++){ printf("%d\n",buf[i]); } return 0; }

  • 入れ子関数の引数について

    引数を与えられた関数の中で、更に別の関数を呼び出した場合の動作について、 勘違いしていたのか、理解できない動作をしたので、 その理由について教えていただきたく、投稿しました。 下記のようなテストを行いました。 ---------- &TEST1("test1"); sub TEST1{ my($test) = @_; print "$test\n"; &TEST2; &TEST2(); &TEST2("test2"); } sub TEST2{ my($test) = @_; $test = !$test?"noooooooo!":$test; print "$test\n"; } ---------- すると、下記のような結果が出ました。 ---------- test1 test1 noooooooo! test2 ---------- これまで、関数を呼び出す時に()を付けなかったら 引数がないものとして扱われる物と思っていたのですが、 どうやら()を付けなければ、引数が引き継がれているようなのです。 (私が知らなかっただけで、当たり前のことと思うのですが・・・。) なぜこのようなことが起こるのでしょう? 特定の条件下ではなく、常にこのような動作をするものなのでしょうか? 回答しずらい質問ですが、よろしくお願いします。

    • ベストアンサー
    • CGI
  • char型とstring型について

    char型とstring型について質問があります。 言語はC++です。 以下の関数があったとします。 void test(string a, string b string c){ 処理 } この関数を下記のように利用した場合について質問があります。 a.引数に直接文字列を挿入したケース test("aaa","bbb","ccc") b.変数に文字列を設定し、変数を引数にしたケース string a="aaa" string b="bbb" string c="ccc" test(a,b,c) (1)はコンパイルエラーになり、(2)は成功しました。 同じ様に見えるのですが、何が違うのでしょうか? また、関数の引数の型をchar*にした場合、(1)(2)のケースでコンパイルが通りました。char*型だと何が違うのでしょうか?

専門家に質問してみよう