問題タブ [geometry-shader]
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.
directx-11 - ジオメトリ シェーダー クワッド ポスト プロセッシング
directx 11 を使用して、ジオメトリ シェーダーを使用してワールド空間でクワッドを構築するグラフィックス エフェクト システムに取り組んでいます。これらのクワッドは、メイン テクスチャがレンダリングされたシーン テクスチャであるフラグメント シェーダを使用します。qorld スペース クワッドでポスト プロセス エフェクトを効果的に生成します。最も単純なものは色合い効果です。
頂点シェーダーは、データをジオメトリ シェーダーに渡すだけです。
ジオメトリ シェーダーは、法線に基づいて追加の頂点を計算します。外積を使用して、x 軸と z 軸を見つけ、元の位置から各対角線方向に 4 つの新しい頂点を持つトライストリームを追加します (指定された位置とサイズからクワッドを生成します)。
ピクセル シェーダー (ティント効果) は、シーン テクスチャの色に色変数セットを乗算するだけです。
クワッドが生成され、画面に正しく表示されます。でも;
私が直面している問題は、UV 座標のマッピングがバック バッファーの画像と一致しないことです。つまり、指定された色としてハーフ アルファのティント シェーダーを使用すると、クワッドがカメラの方を向いていない限り、クワッドに表示された画像がバック バッファーの画像に完全にオーバーレイされないことがわかります。四角形の法線がカメラの y 軸と一致するほど、画像の歪みが大きくなります。
現在、以下の式を使用して UV 座標を計算しています。
以下の式も使用しましたが、その結果、(IMO) uv が考慮に入れられませんでした。
質問: ジオメトリ シェーダーで生成された頂点位置に基づいてスクリーン スペースの UV 座標を取得するにはどうすればよいですか?
もし私にどんな点でも詳しく説明してほしいなら、尋ねてください、そして私は最善を尽くします:)
前もって感謝します。
shader - ジオメトリ シェーダー、MaxVertexCount を認識できません
私は現在、頂点の量が三角形の量によって定義されていないシェーダーに取り組んでいます。私のシェーダーは、X 単位ごとにキューブを配置します。
これは、作成される立方体の数と必要な頂点の数を事前に知ることができないことを意味します。
ただし、maxvertexcount[x]
. には何を入れx
ますか?
これを回避するにはどうすればよいですか?
注: 私はジオメトリ シェーダーの初心者であり、ほとんど何も知りません。
opengl - OpenGL: 多数のキューブを使用したジオメトリ シェーダーのパフォーマンス
そこで、ジオメトリ シェーダーを使用して立方体として描画される 100x100x100 ポイントを描画する、非常に単純な OpenGL プログラムを作成しました。DirectX11を使用して現在できることと比較してベンチマークするためにそれをやりたかった.
DirectX11 を使用すると、これらのキューブを 60fps (vsync) で簡単にレンダリングできます。ただし、OpenGL では 40fps にとどまっています。
両方のアプリケーションで、私は:
- ポイント トポロジを使用して立方体の位置のみを表します (ストライド = 12 バイト)。
- 初期化関数で Vertex Buffer にマッピングするのは一度だけです。
- 合計で 2 つの描画呼び出しのみを使用します。1 つはキューブをレンダリングするため、もう 1 つはフレームタイムをレンダリングするためです。
- バック フェース カリングと深度テストの使用。
- キューブを描画するために必要な最小限の状態変更を制限します (VBO/シェーダー プログラム)。
ここに私のドローコールがあります:
この関数は、glBindVertexArray と glUseProgram を呼び出します。
そして残りは簡単です。My Update 関数は、カメラの位置とビュー マトリックスを更新するだけで、DirectX/OpenGL バージョンでも同じです。
頂点シェーダーはパススルーで、フラグメント シェーダーは一定の色を返します。これは私のジオメトリ シェーダーです。
インスタンス化やその他のレンダリング方法について人々が話しているのを見てきましたが、私が主に興味を持っているのは、OpenGL から DirectX と同じパフォーマンスを得ることができない理由を理解することです。私とほとんど同じようです。同一のデータ、同一のシェーダー。ヘルプ?
更新 だから私はgDEBuggerをダウンロードしました.1フレームのコールスタックは次のとおりです。
hlsl - HLSL: Triangle-2-Points/Lines ジオメトリ シェーダーの問題
Geometry Shader を使用して (TressFX 用の) レンダラーを拡張しようとしています。したがって、三角形に対しては機能するシンペル パススルー ジオメトリ シェーダーを作成しましたが、出力が表示されないため、何らかの理由で線または点 (三角形を線と点に変換) に対しては機能しません。結果リンク
線や点でうまくいかない理由を誰かが指摘してくれたらうれしいです。
コード
ASetPrimitiveTopology が D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST に設定されている
頂点シェーダー
三角形のジオメトリ シェーダー(機能します)
点と線のジオメトリ シェーダー(これは機能しません)
ただし、ポイント/ライン パススルー ジオメトリ シェーダーで output.Position をハード コーディングすると、画面に表示される出力を取得できます。
c++ - ジオメトリ シェーダーでの memoryBarrier() の予期しない動作
OpenGL 4.4 で memoryBarrier() がどのように機能するかを把握しようとしています。テクスチャ イメージで 1 回、Shader Storage Buffer Object (SSBO) で 1 回、次のことを試しました。基本的な考え方は、シーンでレンダリングする必要がある多くのオブジェクトに対してフラグの配列を作成し、ジオメトリ シェーダーで簡単なテストを実行することです。
GS の各プリミティブについて、少なくとも 1 つの頂点がテストに合格すると、このプリミティブのオブジェクト ID で指定された位置に配列内の対応するフラグが設定されます (オブジェクト ID は頂点属性として GS に渡されます)。
次に、memoryBarrier() を実行して、すべてのスレッドが値を書き込んだことを確認します。
- 次に、フラグ配列からすべてのプリミティブを読み取り、フラグが設定されている場合にのみ頂点を出力します。
説明するシェーダーのコードを次に示します。
そして、これは単純な Geometry シェーダーで、lineID に基づく単純なテストのみを使用します (このテストは共有データ構造を必要としないことは理解していますが、これはプログラムの動作をテストするためのものです)。
500 の代わりにどんな値を入れても、このコードは常に 2 つのオブジェクトしかレンダリングしません。GS でレンダリングの条件を if( flag > = 0) に変更すると、すべてのオブジェクトがレンダリングされるように見えます。これは、これらの ID がシェーダーによって読み戻されるまでに -1 が書き込まれないことを意味します。memoryBarrier() にもかかわらず、すべてのシェーダー呼び出しに対して書き込みが首尾一貫して表示されない理由と、これを機能させるための最も効率的な回避策は何かを説明してもらえますか?
ありがとう。
macos - Mac 10.9.3 で OpenGL コンテキストを 3.2 に変更するにはどうすればよいですか
OpenGL 2.1 と GLSL 1.2 を使用していることに気付いたとき、シェーダーに問題がありました。ジオメトリ シェーダーは 1.5 までサポートされていないため、別の OpenGL、GLSL バージョンを使用する必要があります。しかし、どのように?最大 15 のスレッドを読んだと思いますが、何もうまくいきませんでした。
私の Mac は 10.9.3 で PyOpenGL 3.0.2 を実行しています。サポートされているバージョンと拡張機能を確認するために、OpenGL 拡張ビューアーをダウンロードしました。Intel HD Graphics 4000 と NVIDIA GeForce 650M は、コア プロファイルで OpenGL 3.2 をサポートしますが、互換性プロファイルではサポートしません。
互換性プロファイルが、ジオメトリ シェーダーをコンパイルできない理由だと思います。2.1までのOpenGLのみをサポートしています。
プロファイルを次のように変更しようとしました。
しかし、両方の関数は未定義です。また、GL_SHADING_LANGUAGE_VERSION (1.2) と GL_VERSION 2.1 は同じままです。
ジオメトリ シェーダーで使用した別のスレッド#version 150 core
が原因でしたが、これも効果がありませんでした。
ジオメトリ シェーダーを使用するためにコンテキスト/バージョンを変更するにはどうすればよいですか?
c++ - opengl 円ではなく楕円を描く
関数 DrawFilledCircleo() を呼び出すと、glBegin(GL_LINE_LOOP); を入れても、円ではなく楕円になります。それは常に楕円形になります
円を描くためにさまざまな機能を試しましたが、常に Oval になります。
私はそれを入れました:
アップデート :
幅X = 800; 高さ Y = 400;