問題タブ [zbuffer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - Three.js/WebGL-背後にある他の平面を隠す透明な平面
Three.js / WebGLに2つの平面があり、それらの一方または両方が透明である場合、背後の平面が上の透明な平面によって隠されることがあります。どうしてこれなの?
actionscript-3 - AS3: Z バッファリング
Z バッファリングは、交差する 3D オブジェクトをレンダリングできるため、Z 並べ替えよりも優れたレンダリング手法です。
たとえば、次のように 2 つのインスタンスをArray
含むObject
とします。
これらは 2 つのObject
インスタンスで、それぞれVector3D
に三角形の 3 つの頂点を表す 3 つのインスタンスが含まれています。
と を使用Matrix3D.transformVector()
して、ステージのプロパティでVector3D.project()
三角形を描画します。graphics
このような状況でスプライトが作成されていない場合、Z バッファリングを使用して各ピクセルを描画するにはどうすればよいですか?
xna - XNA 4.0 と解決不可能な (私による) 深さの好奇心旺盛なレンダリング
深さの問題に関する XNA 4.0 の大きな頭痛の種:
私はすでに同様の問題に対する多くの答えを見つけましたが、誰も私のために働きません...
デバイスは次のように設定されています。
残忍な問題解決者として、私はほとんどの DepthStencilFormat と DepthStencilState の可能性を試しました...誰も私が望むようには機能しません。
射影行列に関して、私は多くのnearclipとfarclipの値も試しました。(立方体の幅: 10f) ですが、正しい結果が得られません。
これをさまざまなテクスチャでテストしましたが、すべて不透明です。
BasicEffect ではなく、テクスチャ + 法線マップを使用したエフェクトを使用していますが、それが原因でしょうか?
CubeEffect.fx
編集: BasicEffect で試しましたが、問題は同じです...
だから...助けてくれてありがとう;)
javascript - ソフトウェアレンダラーにZバッファリングを実装する最速の方法は?
私はjavascriptソフトウェアレンダラーを実装しています(学術目的で)。3Dオブジェクトを三角形として表現し、3D空間から2D空間へのパースペクティブプロジェクションを処理します。
これまで、 画面上の頂点と線を表すためにlineTo
とを使用していました。fillRect
私lineTo
はスキャンラインの三角形の塗りつぶしを行ったことさえあります。(ここでプロジェクトをチェックできます)
これまでのところ、FPSは非常に良好です。ただし、割り当ての最後の部分は、z-Buffering:Pを実装することです。私の知る限り、これを行う唯一の方法は、を使用して三角形をlineTo
塗りつぶすのをやめ、1pxの線の配列または1pxの正方形の配列のいずれかで三角形を塗りつぶすことです。(各「ピクセル」を描画する前に、深度バッファーをチェックして、実際に描画する必要があるかどうかを確認する必要があるためです。)
問題は、三角形を小さな長方形や線で塗りつぶすのが遅いことです。すべてを2FPSまで取得します。だから私の質問は、小さな線の代わりに1つのピクセルを描く方法はありますか(より速いかもしれません)?
あるいは、物事をスピードアップするために他に何ができますか?私の目標は、原理をデモするのに十分な速さで回転させることです。(6-10fpsで十分です)
乾杯。
[編集]答えを待つ間、三角形の塗りつぶし機能を変更して、1pxではなく4pxサイズの「ピクセル」を描画します。しかし、それはギザギザに見えます...
c++ - Z バッファの計算の何が問題になっていますか?
三角形で満たされた単純なシーンでどのピクセルを描画する必要があるかを判断するために、Z バッファーを実装しています。三角形、頂点、ベクトル (もちろん数学的な (x、y、z) の種類) の構造表現と、個々のピクセルを画面に描画する関数があります。ここに私が持っている構造があります:
残念ながら、三角形を画面にスキャン変換すると、深さの計算に依存して表示されるものと描画されるものを決定するため、不正確/非現実的な Z 値が得られます (たとえば、三角形のある点の深さが3 つの頂点すべての深さの境界)! 私は自分のコードを何度も見直してきましたが、数学が間違っているのか、不注意な間違いがあるのか わからないので、他の誰かが何かを見ることができることを期待して、私がやろうとしていることを正確に提示しようとします.私はしません。(そして、浮動小数点値が浮動小数点値のままであること、引数を正しく渡していることなどを注意深く調べたので、これは本当に不可解です!)
全体として、私のスキャン変換アルゴリズムは、次のようにスキャン ライン全体にピクセルを塗りつぶします (疑似コード):
各スキャン ラインの zInit の値を取得するには、平面方程式 Ax + By + Cz + D = 0 を考慮し、それを並べ替えて z = -1*(Ax + By + D)/C を取得します。ここで、x と y はそれぞれ、スキャン ライン全体の現在の x 値と現在のスキャン ライン値自体としてプラグインされます。
スキャン ラインを横切る後続の z 値については、zk+1 = zk - A/C として補間します。ここで、A と C は平面方程式から得られます。
これらの z 計算の A、B、および C を取得するにvertex v[3]
は、現在の三角形の 3 つの頂点 (配列 ) によって定義される平面の法線ベクトルが必要です。この法線 (コードでは planeNormal と名付けました) を取得するために、クロス積関数を定義しました。
平面方程式/my z 計算の D 値を取得するには、平面方程式 A(x-x1) + B(y-y1) + C(z-z1) = 0 を使用します。ここで、(x1, y1, z1)平面内の基準点にすぎません。参照点として三角形の頂点 v[0] を選択し、再配置しました。
Ax + By + Cz = Ax1 + By1 + Cz1 したがって、D = Ax1 + By1 + Cz1
最後に、z 計算の A、B、C、D を取得するために、三角形ごとにこれを行いました。ここで、trianglelist[nt]
はシーンの三角形配列全体の現在のインデックス nt にある三角形です。
ここから、説明したスキャン変換アルゴリズム内で、zs を計算しました。
残念ながら、慎重に作業した結果、何かがおかしくなっています。一部の三角形では、深さの値がリアルになります (記号を除く)。頂点 (200, 10, 75)、(75, 200, 75)、および (15, 60, 75) によって与えられる三角形では、すべての深さは -75 になります。すべての頂点が同じ深さの他の三角形でも同じことが起こりました。しかし、頂点 (390, 300, 105)、(170, 360, 80)、(190, 240, 25) では、すべての z 値が 300 を超えています! 最初のものは 310.5 になり、残りは大きくなり、最大値は約 365 になります。これは、最も深い頂点が z = 105 にある場合には発生しません!!! それで、とりとめのないすべての後、誰かがこれを引き起こした可能性のあるものを見ることができますか? それが記号に関連するものである場合、私は驚かないでしょうが、どこで(結局のところ、絶対値は一定の深さの場合に正しいのですか)?
sprite - Corona SDKでZ深度を制御する適切な方法は何ですか?
Corona SDKでZ深度を制御する適切な方法は何ですか?
スプライトには本質的にZ情報が格納されているようには見えません。
glsl - gl_FragCoord.x、y、z はすべてのピクセルで 1、w は深さ
シェーダーで THREE.js を使用しています。zbuffer 情報を取得しようとしています。
頂点シェーダー:
フラグメント シェーダー:
シーン内の位置が異なるオブジェクトがあるため、zbuffer の値は異なるはずです。
とがすべてのフラグメントに当てはまるように見えるのにgl_FragCoord.x
、フラグメントごとに異なるように見えるのは奇妙です。gl_FragCoord.y
gl_FragCoord.z
1.0
gl_FragCoord.w
私が使用する場合gl_FragCoord.w
:
zbuffer イメージのようです:
では、常にすべてのフラグメントgl_FragCoord.w
に対して が深度情報を表しているのはなぜでしょうか?gl_FragCoord.z
1.0
opengl - glReadPixels() を使用して Z バッファを読み取ると、Z バッファの値が常に 0 になるのはなぜですか?
glReadPixels() を使用して z バッファを読み取ると、z バッファの値が常に 0 になるのはなぜですか?
opengl-es - Cocos2d 2.x: z バッファリングの有効化と vertexz の使用
前提: OpenGL 2.0 ES を使用する Cocos2D 2.0 を使用しています。
私のゲームには、すべてのレベル アセット(背景、敵、雲など) 用に 1 つのスプライトシートがあり、プレイヤー キャラクターのスプライトと HUD 要素用に 1 つ (通常、両方とも残りのアセットより上の z レベルにあります) があります。これは、ユーザーがプレーヤー スプライトを変更できるようにして、すべてのアセットを 1 つのスプライト シートに収めることができなかったためです。
2 つのスプライト シートと pvr.ccz 圧縮テクスチャ ファイルにも CCSpriteBatchNode を使用しています。問題は、状況によっては、異なるスプライト シート(レベル スプライト シート、プレイヤースプライト シート) にある一部のアセット(雲、プレイヤー、ボスの位置など)の絶対 Z レベルを変更する必要があることです。
2 つの実際的なケース シナリオ:
- one : プレーヤーを雲の下に移動させたいので、レベル アセット スプライト バッチ ノードに関しても、プレーヤーのスプライトの絶対 z 位置を動的に変更します。
- two : レベルのボスが到着したら、ボスをプレイヤーの上に飛ばしたいと思います (したがって、プレイヤーのスプライトの z レベルと比較して、絶対的な z レベルは +1 にする必要があります)。これには、z-buffering を有効にして vertexz を使用する必要があるようです。
現在、これを行う方法について混乱しています。私が知る限り、各スプライト シートは異なるノードと見なされ、したがって異なる OpenGL 呼び出しと見なされるためです ( z-buffering と vertexz を有効にすると、パフォーマンスが低下し、より多くの呼び出しが必要になりますか? )私を助けるかもしれないいくつかのチュートリアル/リファレンスがあるかどうか、および/または誰かが同様のケースシナリオの経験を共有できるかどうか疑問に思っています.
c++ - glm::project の出力から z-buffer を計算する
glm::project の出力からオブジェクト位置の z バッファを計算したいと思います。以下のコードの z-buffer の計算は、https://en.wikipedia.org/wiki/Z-bufferingからのものです。
私が試したこと
問題
モデルをどのように回転させても、どのポイントを使用しても、zBufferValue の値は 1 です。wiki ページによると、値は -1 (近い面) から 1 (遠い面) の間である必要があります。
計算で何が間違っていますか?