法線の計算方法とスムーズシェーディングについて

このQ&Aのポイント
  • 現在OpenGLを使用して物体の描画を行っています。ポリゴン数が100万を超える場合もあり、描画はフラットシェーディングで行っています。しかし、スムーズシェーディングに改良したいと考えています。法線をどのように計算すれば良いでしょうか?多少高速なアルゴリズムも教えていただけると助かります。
  • 法線の計算方法とスムーズシェーディングについて教えてください。現在OpenGLを使用していますが、ポリゴン数が100万を超えることもあります。フラットシェーディングではなく、スムーズシェーディングにするためにはどのように法線を計算すればいいでしょうか?
  • フラットシェーディングからスムーズシェーディングに改良したいと考えています。現在OpenGLを使用しており、ポリゴン数が100万を超える可能性もあります。スムーズシェーディングにするためにはどのように法線を計算すればいいでしょうか?高速なアルゴリズムも教えていただけると嬉しいです。
回答を見る
  • ベストアンサー

法線について。

どのカテゴリで質問しようか迷ったのですが、ここで質問することにしました。 現在OpenGLを使用して物体の描画を行うプログラムをC++6.0で作成しています。 特別な処理を行うため、結果としてポリゴン数が100万ポリゴンを超える場合もあります。 ポリゴンの描画としては単にそのポリゴンから求めた法線を割り当てているだけなので、フラットシェーディングとして描画しています。 しかしそれを改良して法線を計算しなおし、スムーズシェーディングでの描画を行えるようにしたいと考えています。 そこでスムーズシェーディングの描画にするためには、法線をどのように計算しなおせばよいでしょうか?先ほど述べたように100万ポリゴンを超えることもあるので、できたら多少高速なアルゴリズムがあればと思います。 ご存知の方がいたらご教授よろしくお願いします。

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

  • ベストアンサー
  • amru05
  • ベストアンサー率63% (33/52)
回答No.1

<スムーズシェーディングの法線>  多角形頂点の法線を使用します。  一般的には「多角形の頂点における法線ベクトルは、その頂点を含む多角形の法線ベクトルの平均値を用います」 <法線計算フロー>  1.面の法線を求める(終了していますね)。  2.頂点を共有する面の法線の平均値を計算する。 <高速化1>  上記2の「頂点を共有する面」のサーチが高速に行える事が重要なので、「頂点=>面」が簡単に求められるようなデータ構造にしておくことが重要です。  (元データがどのようになっているかですが、3d形式なら、大体そのようになっている事が多いのでは) <高速化?>  一般的に、ダイナミックに計算する必要が無ければ、最初に計算しておけば良いので、そんなに気にする必要も無いような気がしますが。。。

参考URL:
http://nis-lab.is.s.u-tokyo.ac.jp/~nis/CG/cgtxt/cg5/cg55.htm

関連するQ&A

  • リアルタイムで多数の3角形ポリゴン(2D)を描画したい

    リアルタイムでテクスチャを貼った多数の3角形ポリゴン(2D)をアルファブレンドを加味して描画したいのですが、OpenGL,DirectX等は使わずに自前のコードで実装したいのです。参考になるアルゴリズムを紹介したサイト、ソースコードなどを掲載しているサイトなどありましたら教えてください。検索のヒントになるワードでも結構です。お願いします。

  • 3次元の物体、例えば正四面体の頂点のデータを取得したとします。正四面体

    3次元の物体、例えば正四面体の頂点のデータを取得したとします。正四面体は1つの面は三角形ですので3つの点の(x,y,z)座標が得られていることになります。で、それが4面なので4セットあることになります。さて、質問ですが、その面に対する物体の”外向き”単位法線ベクトルを計算することを考えます。法線ベクトルは割りと簡単に計算できますが、外向きか、内向きかを判別するアルゴリズムにはどのようなものがあるでしょうか。その1つの面(3つの点)だけだったら物体の全体像がわからないのでその他の点(残り1つですが)を使うことになると思いますが。どのようになるでしょうか。 また、正n面体の物体ではどうなるのでしょうか。正でなくn面体ならどうなるかという問題があります。 面構成する頂点の座標が与えられているというのが基本の前提条件です。よろしくお願いします。

  • 3DCGの面の和集合の計算方法

    現在OpenGLを使って3DCGプログラムを作成しています. 何枚も重なるポリゴン,つまり同じ平面にある複数のポリゴンに対して,それらの和集合となるポリゴンの算出が必要となり困っています・・・ そこで質問なのですが, 同じ平面に存在する2つの多角形の和集合・積集合となる多角形を計算する方法って難しいのでしょうか? いろいろ考えて見たのですが,なかなか良い案が出ませんでした. 効率の良い方法は無いでしょうか? よろしくお願いします.

  • DirectXのポリゴンモデルの表示について。

    DirectXの勉強を始めたばかりの者です。 3Dポリゴンモデルの表示をさせたいと思いWeb上の解説記事を読んでいるのですが 何枚かの板ポリゴンで構成される「ポリゴンモデル」のデータを「プログラム内で記述」して描画させるにはどうしたら良いのか、ということが分かりません。 解説記事を読んでいて、まず、DrawPrimitive()等で一枚ずつポリゴンを描画させることを知りました。 それから「メッシュモデル」という単位で、3Dモデリングソフトで作成した「xファイル」からロードして描画できることを知りました。 (http://princess-tiara.biz/directx/?chapter=12)  ただし「メッシュモデル」のような単位のポリゴン群データを「xファイル」からロードするのでは無く、プログラム内での配列データのセットのような感じで記述したいと思っています。  こういう場合、頂点の繋がりや法線などのデータを全く自前の構造体で定義して、各ポリゴンをforループで一枚ずつDrawPrimitiveなどで描画するというのも、それも1つの手だとは思うのですが、それは何となく本筋という訳でも無いのではと思えます。  また、別のモデリングソフトで「xファイル」を作って、というのも例えば幾何学的な多面体モデルを作りたいと思う場合にはあまり適していないように思います。(その場合、頂点の座標値は是非コンピュータ自身に計算させてセットしたいものです。)  メッシュモデルのようなデータをプログラム上に記述したい場合、プログラム自身に座標値をセットさせたい場合、どうしたら良いのでしょうか?  何か特定の記述のフォーマットなどがあるのでしょうか。またそれを描画する方法はあるでしょうか。解説されているページなどありましたらリンクのみでも助かります。  

  • 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

  • どうして3D画像の計算にグラフィックアクセラレータが必要か?(ハードウェアの観点から)←初心者

    グラフィックを専門とする方に教えて頂きたいことがあります。 自分はGPGPUを研究分野にしようとしている学生です。GPUは多数の浮動小数点(単精度)ユニットから構成されていることは周知の事実だと思います。 教えて頂きたいのは、GPU上ではグラフィック処理のどの部分を計算させて高速化しているのか、ということです。 本やネット等で少し勉強したところによると、 1.3Dグラフィックに必要なポリゴンの頂点計算(平行移動、回転等)について (1)この計算は行列が主なので計算量が多い。しかし、行列は並列演算できるので、多数の演算ユニットを持つGPUを用いて高速化できる。 (2)物体A、物体Bというようにそれぞれの物体は基本的には独立に計算できることが多いので、並列計算させると高速化できる。 (3)3Dグラフィックを計算するには座標が整数値だと荒すぎるので、座標を小数点単位まで指定することで美しい画像を表現する。 2.ポリゴンに貼り付けるテクスチャの計算も、浮動少数点ユニットを使うために0~255の整数値RGBの値を0.0~1.0の少数値に変換して計算している。また、色の計算も基本的にRGBの組合せなので独立に計算できるから、GPUを用いると高速に計算できる。 以上、1と2の理由から、"多数の"、かつ、"浮動少数点"計算ユニットを持つアクセラレータが必要。従って、頂点計算も色(テクスチャ)の計算も全てGPU上で行なっているのではないか というように理解、推測しています。 しかし、色の計算はCPU上で行なって、頂点の計算のみGPU上で行なう、ということもあるような気がします。 いずれにしろ、初心者が予想できる範囲で述べてみました。多分ヘンなことを多数言っていると思うので、ご指摘いただけると有難いです。以上の点について(できればハードウェア寄りで)知識のある方がいれば、ご指摘並びに、御教授頂けると幸いです。 よろしくお願いいたします。

  • どうして3D画像の計算にグラフィックアクセラレータが必要か?(ハードウェアの観点から)←初心者

    グラフィックを専門とする方に教えて頂きたいことがあります。 GPUは多数の浮動小数点(単精度)ユニットから構成されていることは周知の事実だと思います。 教えて頂きたいのは、GPU上ではグラフィック処理のどの部分を計算させて高速化しているのか、ということです。 本やネット等で少し勉強したところによると、 1.3Dグラフィックに必要なポリゴンの頂点計算(平行移動、回転等)について (1)この計算は行列が主なので計算量が多い。しかし、行列は並列演算できるので、多数の演算ユニットを持つGPUを用いて高速化できる。 (2)物体A、物体Bというようにそれぞれの物体は基本的には独立に計算できることが多いので、並列計算させると高速化できる。 (3)3Dグラフィックを計算するには座標が整数値だと荒すぎるので、座標を小数点単位まで指定することで美しい画像を表現する。 2.ポリゴンに貼り付けるテクスチャの計算も、浮動少数点ユニットを使うために0~255の整数値RGBの値を0.0~1.0の少数値に変換して計算している。また、色の計算も基本的にRGBの組合せなので独立に計算できるから、GPUを用いると高速に計算できる。 以上、1と2の理由から、"多数の"、かつ、"浮動少数点"計算ユニットを持つアクセラレータが必要。従って、頂点計算も色(テクスチャ)の計算も全てGPU上で行なっているのではないか というように理解、推測しています。 しかし、色の計算はCPU上で行なって、頂点の計算のみGPU上で行なう、ということもあるような気がします。 いずれにしろ、初心者が予想できる範囲で述べてみました。多分ヘンなことを多数言っていると思うので、ご指摘いただけると有難いです。以上の点について(できればハードウェア寄りで)知識のある方がいれば、ご指摘並びに、御教授頂けると幸いです。 よろしくお願いいたします。

  • 数のサイズのO記法について

    代数学の勉強をしています。O記法についてわからないところがあります。 「a,b∈N,a,b≦nとしk:=[log(n)]+1とする。 加法a+bの計算に対するビット演算の数はO(k)で 乗法a・bに対してはO(k^2)である。 もし高速乗算アルゴリズムが使用されれば、乗法 はO(klog(k))にまで改良することができる。」 とあるのですが、加法がO(k)、乗法がO(k^2)と表せるのはO記法の考え方からわかりました。 しかし、「高速乗算アルゴリズムが使用されれば、乗法はO(klog(k))にまで改良することができる」 というところがどうしてそうなるのかがわかりません。 ※logの底は2です。

  • 数値計算を始めたいのですが・・・

    もうすぐ大学2年生になる物理を専攻している学生です。 大学での物理を学び、コンピュータを用いて数値計算をしたいと思うようになりました。 中学生のときにC言語を独学で学んで言語について入門書レベルの理解はあるのですが、 実際の数値計算となると、アルゴリズムを学んだり、グラフや図形にしたりという作業が必要です。 質問したいことは大きく分けて2つです。 (1)中学生のときはコマンドプロンプトとフリーのテキストエディタで勉強していました。 しかし、大学で物理の数値計算をするとなればVisual stdioなどを用いてプログラミングしたほうがよいのでしょうか? ダウンロードしてみたのですが、今のところいろんなコマンドが多くて難しいです・・・ どちらのスタイルでプログラミングした方がいいかとかはあるのでしょうか? どうもCUIだと図形描画はできないようなのですが・・・そうなのでしょうか? (2)数値計算をしたとき、グラフやアニメーションにしたいと思うのですが、 WindowsAPI、Gnuplot、OpenGL、他にも色々あるみたいなのですが、 どのようなツールを使えばよいのでしょうか・・・? 色々調べてはみたのですが・・・ どちらか1つでもよいのでご教授ください。 お願いします。

  • opengl vbaが使えない

    VS C++(2008) MFCベースでOpenglを使ってます。 描画処理高速化のためVBO(vertex buffer object)を試しているのですが intel HD搭載のビデオカードですと色の描画がうまくいきません。 質問1:これはビデオカードによる障害でしょうか?それともコード側の問題でしょうか? 質問2:VBOを用いる時はビデオカードの型番などハード側の環境を確認した上で使用しないと問題が発生するものでしょうか? ご回答お待ちしております。

専門家に質問してみよう