タグ付けされた質問 「deferred-rendering」

ジオメトリとマテリアルプロパティが照明の計算から明示的に分離されているレンダリングテクニックのクラスの名前。これは、さまざまなオブジェクトのマテリアルプロパティをいくつかのバッファにレンダリングし、それらの "g-バッファ"を介したパスを使用して、一度に画面全体でライティング計算を実行することによって行われます。この手法は多くの帯域幅を使用しますが、照明が多い状況では強力な最適化になる場合があります。

3
遅延レンダリングとは何ですか?
遅延レンダリングについて聞いたことがあり、それを使用するとパフォーマンスに大きな影響を与えずにシーン内のライトの「ロット」をどのように許容できるかを聞いたことがありますが、それは何であり、(高レベルから)どのように実装されていますか?

1
ゲームエンジンの設計-Ubershader-シェーダー管理設計[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 2年前に閉店しました。 遅延シェーディングを備えた柔軟なUbershaderシステムを実装したい。私の現在のアイデアは、FlatTexture、BumpTexture、Displacement Mappingなどの特定の機能を処理するモジュールからシェーダーを作成することです。色をデコードしたり、トーンマッピングなどを行う小さなモジュールもあります。これには、 GPUがサポートしていない場合、特定のタイプのモジュールを交換します。そのため、現在のGPU機能に適応できます。このデザインが良いかどうかはわかりません。私は今、悪いデザインを選択し、後でそれを支払うことができるのではないかと恐れています。 私の質問は、シェーダー管理システムを効果的に実装する方法に関するリソース、例、記事はどこにありますか?ビッグゲームエンジンがこれを行う方法を知っている人はいますか?

2
遅延シェーディングレンダラーのジオメトリパスの一般的なレンダリング最適化手法は何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 6年前に閉鎖されました。 OpenGL 3とC ++(およびウィンドウ管理用のglfw)を使用してゲームエンジンを開発しています。私はこれまでに進めてきましたが、サウンドエンティティと最適化以外のほとんどのことは完了しています。エンジンは遅延シェーディングを使用しているため、遅延シェーディング自体は平均的なGPUにとって疲れるプロセスなので、レンダリングプロセスを可能な限り最適化したいと思います。 現在のシステムは、レンダラーと現在のワールドを含むシーンで構成され、ワー​​ルドはエンティティとライティングエンティティを別々に保持しstd::vectorsます。 そのため、基本的にSceneが呼び出されるたびに->render()、Rendererを呼び出し、ワールドをパラメーターとして渡し、ワールドからエンティティイテレーターを取得し、FBOにそれらを描画してから、2番目のパスのライティングエンティティを通過します。そして、これは十分ではないと思います。 現在のアルゴリズムは、エンティティが画面スペースにない場合でもすべてを繰り返し処理します。現在のレンダリングアルゴリズムを最適化して、可視オブジェクトに対してのみAPI関数を呼び出す方法を考えています。そのようなレンダラーを最適化する一般的な手法は何ですか?

1
SSAO実装で望ましい結果が得られない
遅延レンダリングを実装した後、このチュートリアルを使用してSSAO実装を試してみました。残念ながら、SSAOのように見えるものは何も得られません。私の結果を以下で見ることができます。 奇妙なパターンが形成されており、オクルージョンシェーディングが必要な場所(つまり、オブジェクト間および地面)がないことがわかります。私が実装したシェーダーは次のとおりです。 #VS #version 330 core uniform mat4 invProjMatrix; layout(location = 0) in vec3 in_Position; layout(location = 2) in vec2 in_TexCoord; noperspective out vec2 pass_TexCoord; smooth out vec3 viewRay; void main(void){ pass_TexCoord = in_TexCoord; viewRay = (invProjMatrix * vec4(in_Position, 1.0)).xyz; gl_Position = vec4(in_Position, 1.0); } #FS #version 330 core uniform …

2
遅延レンダリングは未来ですか?
遅延レンダリングは、(少なくともレイトレーシングが実行可能になるまで)PCハードウェアでのリアルタイム3Dレンダリングの未来ですか?利点(ライトが多く、状態の変化が少ない)と、アンチエイリアシング、半透明のアイテム、より高いメモリ帯域幅などのトラブルスポットも認識しています。 しかし、次世代エンジンはすべて遅延を使用しますか?フォワードレンダリングは過去のものですか?

2
遅延レンダリングのシャドウ
遅延レンダリングに関する資料を読んだので、その要点は理解できたと思います。しかし、私が理解していないのは、それがどのように影を達成するかです。私が知る限り、Gバッファは各ライトのシャドウマップの作成を含まないため、ライティングパスが各ピクセルがオクルードされているかどうかをどのように認識するかについて混乱しています。結局のところ、カメラの視点から見える特定のピクセルは実際には特定の光の視点からは見えない可能性があり、そのオクルージョンジオメトリはカメラの視点からは見えない可能性があるため、Gバッファーに何も書き込まれません。 。 シャドウマップのレンダリングを開始すると、フォワードレンダリングとほぼ同じように見えます。シャドウマップをレンダリングするために、すべてのライトに対してシーン内のすべてのジオメトリをレンダリングします。 では、遅延レンダリングは、フォワードレンダリングと同等のシャドウをどのように実現するのでしょうか。

2
OpenGLでの遅延タイルシェーディング、タイルフラスタ計算
OpenGLで計算シェーダーを使用して遅延タイルシェーディングを実行しようとしていますが、各タイルの錐台を作成しようとしたときに障害が発生しています。AMDのForward +デモ(D3Dで記述)をガイドとして使用していますが、ライトがカリングされるべきではないときにカリングされているようです。 更新 更新については以下をお読みください。 これは私の(完全な)計算シェーダーです: #version 430 core #define MAX_LIGHTS 1024 #define MAX_LIGHTS_PER_TILE 40 #define WORK_GROUP_SIZE 16 struct PointLight { vec3 position; float radius; vec3 color; float intensity; }; layout (binding = 0, rgba32f) uniform writeonly image2D outTexture; layout (binding = 1, rgba32f) uniform readonly image2D normalDepth; layout (binding = …

1
据置デカールの通常の問題
私は延期デカールシステムに取り組んできました。ここまでで、投影パーツを完成しました。つまり、シーン内の何かをクリックすると、デカールがオブジェクトの表面に適切に投影されます。 このシステムに追加したいことが他にいくつかあります。通常のクリッピングと通常のマップされたデカールです。通常のクリッピングは、鋭角に引き伸ばされたフラグメントを破棄するときです。見てここに。これを解決する方法は、Gバッファの法線とデカールの法線との間に大きな差があるフラグメントを破棄することです。これには、Gバッファの通常のテクスチャを読み取る必要があります。 デカール法線マッピングを行うには、デカールの法線(法線マップからの)をGバッファの法線とブレンドする必要があります。では、Gバッファの通常のテクスチャに書き込む必要があります。 これら2つの機能をサポートするために、同じシェーダーパスで通常のテクスチャを読み書きする必要があることは明らかです。残念なことに、これは未定義の動作なので、これらの機能を実装する他の方法があるかどうか疑問に思っています。

1
同じビットサイズのレンダーターゲットが重要なのはなぜですか?
現在、遅延シェーディングに必要なGBufferのタイプを考えているので、最も一般的なものとそのフォーマットについてオンラインでドキュメント化しようとしました。 私が見たほとんどのGBufferは、各レンダーターゲットに同じビットサイズを使用しており、多くの場合、未使用のチャネルにもつながります。しかし、私のGBufferの最初の推測として、紙の上では、2つの24ビットターゲットと2つの32ターゲット、または3つの24と1 32が必要です。 各添付ファイルを同じ「サイズ」にするとより適切に位置合わせできることを理解していますが、実際には、チャネルを無駄にして(または将来の使用のために予約して)すべてのRTを同じサイズにするか、必要なものだけを使用する方が良いですか?前者の場合、なぜそのような利点があるのか​​、とにかく24ビットのものは32にパディングされるのでしょうか?

2
射影テクスチャと遅延照明
で、私の前の質問、私は延期照明と投影テクスチャリングを行うことが可能であるかどうかを尋ねました。現在(半年以上後)、同じものの実装に問題があります。私はこのテクニックをライトパスに適用しようとしています。(私のプロジェクターはアルベドに影響しません)。私はこのプロジェクターを持っています投影マトリックスを見る: Matrix projection = Matrix.CreateOrthographicOffCenter(-halfWidth * Scale, halfWidth * Scale, -halfHeight * Scale, halfHeight * Scale, 1, 100000); Matrix view = Matrix.CreateLookAt(Position, Target, Vector3.Up); どこhalfWidthとhalfHeightテクスチャーの幅と高さの半分です、Positionプロジェクターの位置で、targetプロジェクターのターゲットです。これは問題ないようです。私はこのシェーダーでフルスクリーンクワッドを描画しています: float4x4 InvViewProjection; texture2D DepthTexture; texture2D NormalTexture; texture2D ProjectorTexture; float4x4 ProjectorViewProjection; sampler2D depthSampler = sampler_state { texture = <DepthTexture>; minfilter = point; magfilter = point; mipfilter …

2
遅延照明設定での二重放物面ポイントライトシャドウ
私はこのチュートリアル/サンプルコードをいじってみました。このサンプルコードは、遅延照明設定の一種であるlight-pre-passの簡単な実装を示しています。 デュアル放物面シャドウマップを使用して、ポイントライトシャドウを実装しているところです。このDPMの説明に従っています:http : //gamedevelop.eu/en/tutorials/dual-paraboloid-shadow-mapping.htm シャドウマップを作成できましたが、見栄えが良いようです。 私が現在抱えている問題は、ポイントライトをレンダリングするときにシャドウマップで深度値を検索するピクセルシェーダーにあると思います。 これが私のポイントライトシェーダーコードです:http : //olhovsky.com/shadow_mapping/PointLight.fx 対象のピクセルシェーダー関数はですPointLightMeshShadowPS。 誰かがその関数に目立ったエラーを見ていますか? うまくいけば、誰かが前にこの問題に取り組みました:) 上の画像からわかるように、投稿の影は投稿の位置と一致していないため、変換がどこかで間違っています... これは、ポイントライトが地面に非常に近い(ほとんど地面に触れている)場合の外観です。 ポイントライトが地面に近づくと、シャドウが集まり、2つのシャドウマップが交わる線に沿って(つまり、ライトカメラが反転して2つのシャドウマップをキャプチャした平面に沿って)影が接触します。 編集: さらに詳しい情報: ポイントライトを原点から遠ざけると、ライトカメラの「右」のベクトルに平行な線が影を切り取ります。上の画像は、ポイントライトを左に移動した結果を示しています。ポイントライトを右に移動すると、代わりに右側に同等のクリッピングラインがあります。だから、これは私が思ったように、ピクセルシェーダーで何かを間違って変換していることを示していると思います。 編集:この質問をより明確にするために、ここにいくつかのコードを示します。 これが、シャドウスポットライトを描画するために現在使用しているコードです。これは機能し、期待どおりにシャドウマッピングを使用します。 VertexShaderOutputMeshBased SpotLightMeshVS(VertexShaderInput input) { VertexShaderOutputMeshBased output = (VertexShaderOutputMeshBased)0; output.Position = mul(input.Position, WorldViewProjection); //we will compute our texture coords based on pixel position further output.TexCoordScreenSpace = output.Position; return output; } ////////////////////////////////////////////////////// …

3
遅延シェーディング-複数のライトを組み合わせる方法は?
私はGLSLから始めて、位置、法線、およびアルベドでGバッファーを出力する単純な遅延シェーディングを実装しました。 簡単なポイントライトシェーダーも作成しました。 次に、ポイントライトの球を描画し、出力をライティングバッファーに入れます。 問題は、複数のライトを描画するときに、ライティングバッファの結果をどのように組み合わせるかです。 たとえば、ポイントライトシェーダーを使用して2番目のライトをライトバッファーに描画する場合、最初のライトをライティングバッファーの2番目のライトに追加するにはどうすればよいですか。つまり、同じ出力バッファから読み書きすることはできませんか?

1
分散シャドウマップは適切にレンダリングしたくない
エンジンにVSM(およびESM)を実装しましたが、ネットワークで公開されている多くの例で期待した結果が得られませんでした。 シャドウマップのフィルタリングをGL_LINEARに設定しましたが、結果を通常のシャドウマップと比較すると、明らかに悪くなります。 ほとんどのチュートリアルと同じように、ポイントライトシェーダーで直接モーメントを計算するか、テクスチャから取得しましたが、結果は同じです。 コード: uniform samplerCubeShadow shadowMap; ... vec4 worldSpace=inverse(ViewMatrix)*vec4(pos,1); vec4 coord=LightViewMatrix*worldSpace; vec4 abs_coord=abs(coord); float fs_z=-max(abs_coord.x, max(abs_coord.y, abs_coord.z)); vec4 clip=LightProjectionMatrix*vec4(0.0,0.0,fs_z,1.0); float d2=(clip.z / clip.w)*0.5+0.5; // clamp to [0..1] ... float shadowTexel=texture(shadowMap,vec4(coord.xyz,d2)); // VSM (Variance Shadow Map) // get partial derivatives float dx = dFdx(d2); float dy = dFdy(d2); vec2 moments …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.