0

私はJavaを使用して、1995年の3Dゲームプログラミングのブラックアートに基づいた非常に原始的な3Dグラフィックエンジンを作成しています。画面に単色のポリゴンを描画し、カメラを「シーン」内で動かすことができるようになりました。一度に表示する半透明のピクセルが多すぎない限り、これらのピクセルをZで並べ替えることで、半透明のオブジェクトを適切に処理するZバッファーもあります。照明を追加したいところです。シンプルにしたいと思います。周囲光は十分にシンプルに見えますが、指向性ライトもかなりシンプルである必要があります。しかし、光源を動かして非常に原始的な影を落とす機能を備えたポイントライティングが本当に必要です(ほとんどの場合、壁を通して光が当たることは望ましくありません)。

私の問題は、これに取り組む最善の方法がわからないことです。一定の角度で光線を投じる点光源を想像します。これらの光線がポリゴンと交差すると、そのポリゴンを照らし、前進を停止します。ただし、複数の光源と複数のポリゴンがあり、それらすべての光線があるシーンについて考えると、非常に遅くなると思います。また、ポリゴンが光源から十分に離れていて、2つの光線の間にある場合の処理​​方法もわかりません。各光源に最大距離を与えます。十分な光線を与えた場合、その距離内に2つの光線が離れすぎてポリゴンを見逃すポイントはないはずですが、それはポリゴンの数に関する問題を増やすだけです。実行する計算。

あなたへの私の質問は:それらをスピードアップするために、または単にそれをより良く整理するために光源を指すためのいくつかのトリックがありますか?ネストされたforループの悪夢に見舞われるのではないかと心配しています。自分で書きたいので、openGLやDirect3Dなどのチートを使用できません。

これまでの私の結果をご覧になりたい場合は、こちらのYouTubeビデオをご覧ください。私はすでに悪いカメラの回転を修正しました。http://www.youtube.com/watch?v=_XYj113Le58&feature=plcp

4

1 に答える 1

0

リアルタイム 3D アプリケーションのライティングは、非常に単純な近似によって行われます (または、過去には一般的に行われていました) 。 http://en.wikipedia.org/wiki/Shadingを参照してください。シャドウは高価です。一般に、3D エンジンのラスタライズでは、シャドウ マップシャドウ ボリュームを使用して実現されています。ポイント ライトは、シャドウをさらに高価にします。

動的なリアルタイム光源がゲームで一般的な機能になったのはごく最近のことです。これは、レンダリング システムに非常に大きな負荷をかけるという単純な理由によるものです。また、これらのゲームは専用のグラフィックス カードを利用します。したがって、ダイナミック - シャドウ キャスティング - ポイント ライトを含めることにした場合、エンジンから良好なパフォーマンスを得るのに苦労する可能性があると思います。

今日、照明は次の 2 つの方法で適用されるのが一般的です。

  1. 従来、これは「フォワード レンダリング」でした。この方法では、すべての頂点 (頂点ごとにライティングを行っている場合) またはフラグメント (ピクセルごとにライティングを行っている場合) について、各光源の寄与を計算します。
  2. 最近では、「ディファード」ライティングが一般的になりました。この場合、ジオメトリと、法線や色情報などの追加データがすべて中間バッファーにレンダリングされます。これは、ライティングの寄与を計算するために使用されます。このように、ライティングの計算はジオメトリの数に依存しません。ただし、他にも多くのオーバーヘッドがあります。

多くのオプションがあります。ただし、過去数年にわたって専用グラフィックス カードで使用されてきたいくつかの基本モデルよりもはるかに複雑なものを実装することは困難です。

私の提案は、単純なものから始めることです。つまり、影のない基本的な照明です。そこから、拡張して最適化できます。


光線と三角形の交差テストは何のために行っていますか? 光が届く三角形だけを照らそうとしていませんか?すべてのライトとすべてのポリゴンの光線と三角形の交差は、非常にコストがかかると思います。影のない照明の場合、通常、すべての面を反復処理し (または、頂点ごとに行う場合はすべての頂点を介して)、光ごとの照明の影響を計算して追加します。これは、ラスタライズを開始する直前に行う必要があります。とにかくすべてのポリゴンを通過します。

任意のイルミネーション モデルを使用してライティングを計算できます。これは、 ランベルト反射率のような非常に単純なものです。これは、サーフェスの法線とサーフェスからライトへの方向ベクトルの内積に基づいてサーフェスをシェーディングします。ベクトルが同じ空間にあることを確認してください! これがおそらく、あなたが奇妙な結果を得ている理由です。サーフェス法線がワールド空間にある場合は、必ずワールド空間のライト ベクトルを計算してください。特定の空間で照明を計算することには多くの利点があります。それについては後で確認できます。今のところ、基本的なことだけを実行することをお勧めします。また、 Blinn-phongも見てください。これは、長年使用されているシェーディング モデル グラフィックス カードです。

影のある照明については、私が投稿したリンクを調べてください。現実的な照明は計算に非常にコストがかかるため、開発されました。

ところで、LaMothe には、3D ゲーム プログラミングの達人 - 高度な 3D グラフィックスとラスタライズのトリック というフォローアップの本がありました。
これにより、3D エンジンのプログラミングのすべてのステップを実行できます。ブラックアートの本が何をカバーしているのかわかりません。

于 2012-09-18T21:43:29.223 に答える