問題タブ [cg]
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.
opengl - フレーム バッファ オブジェクトを 8 ビットの内部フォーマットで 3D テクスチャにアタッチするのは正しいですか?
基本的に、私のプログラムはフレーム バッファ オブジェクトを使用して 3D テクスチャにレンダリングします。fbo にアタッチする 3D テクスチャが 1 テクセルあたり 24 ビットの GL_RGB8 形式である場合、問題はありません。それらの 8 ビットのみが使用されます。この問題は、3D テクスチャの内部フォーマットとして GL_ALPHA8 (テクセルあたり 8 ビット) を使用しようとすると発生し、レンダリング結果が空白になります。fbo にレンダリングするために使用した cg フラグメント シェーダーは次のようになります。
何か間違っているのでしょうか、それとも fbo が 8 ビット テクセル テクスチャへのレンダリングをサポートしていないのでしょうか? フラグメント シェーダーの出力形式が正しいかどうかは、主に不明です。フレームバッファは8ビットですが、出力は24ビットです。フラグメント シェーダーからの出力形式を変更する必要がありますか? その場合、どの形式を使用すればよいですか?
ご意見ありがとうございます。
c++ - C ++NvidiaCgの質問
Nvidia Cg
最近シェーダーを使い始めましたが、 Nvidia GPU
(GTS250
私の場合)で使用すると、すべてが正常に表示され、機能します。
同じ(自分のテストアプリケーション)をで起動しようとしATI HD4650
ましたが、出力が表示されませんでした。その直後に、テスト例(で提供Nvidia Cg 3.0
)と6/7の作業を試し始めましたが、最初の例(最も単純なようです)はそうではありません。
シェーダーコードは次のとおりです。
この単純なシェーダーが機能しない理由はわかりませんが、たとえば、次のパススルーシェーダーと組み合わせNvidia Cg SDK
た同じシェーダーが機能します(の例2 )。
誰かが同じ問題に直面しましたか?何か案は?
ありがとうございました。
ここで更新:最大デバッグ出力をオンにすると、問題が明らかになりました。
そのパッケージの最初の例は、(単純なパススルーでさえ)ピクセルシェーダーがなく、頂点シェーダーのみが含まれている唯一の例でした。この場合、なぜNvidia Cgランタイムが互換性のないシェーダーを生成するのかわかりませんが、明らかに古いGPUでのみ失敗しました(ATI HD4650
)。
とにかく、私はデバッグ出力をオンにせずに作業するのに十分愚かでした。
2 Alex Farber:ダミーの回答を投稿して、デバッグをオンにするのを忘れたことに気付いてくれたので、賞金を授与できると思います。ありがとうございました。
c++ - Cgを使用してオフスクリーンフレームバッファオブジェクトにレンダリングする例
nVidiaCgを使用してオフスクリーンフレームバッファオブジェクトにレンダリングする例を見てみたいと思います。
私がアクセスできるコンピューターにはグラフィックカードがありますが、モニター(またはXサーバー)はありません。だから私は自分のものをレンダリングしてディスク上の画像として出力したいと思います。グラフィックカードはGTX285です。
opengl - Cg: 浮動小数点テクスチャからの書き込み/読み取りの適切な方法
現在、R8G8B8 浮動小数点レンダー ターゲットがあり、R24 ターゲットとして使用したいと考えています。コード
0と1の間でクランプアウトするようです。
Cg で浮動小数点テクスチャを読み書きする適切な方法は何ですか?
opengl - シェーダーと OpenGL 変換
opengl プログラムに (cg で) シェーダーを追加すると、すべてのローカル変換 (glRotatef、glTranslatef、および glPushMatrix と glPopMatrix の間の glScalef) が機能しなくなります。ただし、プッシュ/ポップの外での変換は引き続き機能します。では、ここで何が問題になるのでしょうか?
更新:シーンの中心に回転する立方体があります:
その後、worldview と worldviewprojection マトリックスをシェーダーに送信します。
頂点シェーダー コード:
したがって、最終的にはキューブは回転しませんが、書き込みを行う場合 (プッシュ/ポップなし)
すべて正常に動作します。どうすれば修正できますか?
c++ - Flex/Bison に他の言語を埋め込む
要点:
Flex/Bison を使用して C++ に非常に小さな機能を 1 つ追加したい場合、どのようにしますか? たとえば、void xxx()
構文で関数を宣言する機能: foo%%: xxx
?
一部始終:
すぐに使用できる Cg/GLSL ピクセル シェーダーと頂点シェーダーを多数のブロックから構築するカスタム シェーダー処理プログラムをコーディングしたら、主に静的コンパイルに関連するいくつかの機能を追加しました (「より良いプリプロセッサ」のようなもの)。
たとえば、次のようになります
純粋なマクロを使用すると、次のようになります
私の「言語」で。ご覧のとおり、さまざまなライト/マテリアル タイプに対して「関数」を提供できます。他の関数を「呼び出し」、特定のシェーダーに必要な均一/可変属性をマークする可能性もあります。
なぜこのすべての努力?(特に SM 2.0 のような初期のカードでは) 属性には多数の制限があり、私の「コンパイラ」は、必要な属性/変数のリストを備えたすぐに使用できるシェーダーを生成し、ピクセル シェーダーと頂点シェーダー間のパラメーターを管理し、いくつかの静的要素を最適化しました ( Cgコンパイラは後でそれを最適化するため、読みやすくするためだけに)。
わかりましたが、私は自分自身や何かを称賛するためにこれをすべて書いているわけではありません.
私はこの「コンパイラ」を C# で書きましたが、最初は非常に小さなプログラムでした。しかし、時が経つにつれて多くの機能が追加され、今ではプログラムは完全に混乱しており、リファクタリングのオプションはありません。また、C# でコーディングされているということは、このコンパイラを C++ ゲームに直接埋め込むことができないことを意味し、シェーダーをコンパイルするプロセスを生成する必要があります (これには多くの時間がかかります)。
C++ と Flex/Bison ツールキットを使用して言語/コンパイラを書き直したいと考えています。私はすでに Flex/Bison で効率的な数学パーサーをコーディングしているので、この問題についてある程度の経験があります。ただし、自分で解決できないことが 1 つあります。これは私の質問の非常に重要なトピックです。
どうすれば GLSL を自分の言語に埋め込むことができますか? C# コンパイラでは、行ごとに行って、行が特殊文字 (% や [) など) で始まるかどうかを確認し、後で string_replace や正規表現を使用して多くのトリックとハックを行いました。
ここで、きれいな Bison 文法を書き留めて、適切に実行したいと思います。しかし、GLSL の構文全体を含めるのは恐ろしいことです。非常に大きく複雑な言語であり、常に進化しています。とにかく、この GLSL コードをすべてパススルーすることです。
GLSL/Cg/グラフィックス プログラミングの経験がまったくない場合、これはあまり重要ではありません。質問は「結論」に書き直すことができます。
では、Flex/Bison を使用して C++ に非常に小さな機能を 1 つ追加したい場合、どのようにしますか? たとえば、void xxx()
構文で関数を宣言する機能: foo%%: xxx
?
opengl - Cg を使用した OpenGL ライティング
私はすでに OpenGL のネイティブ ライトに精通しています。
私の質問は、Cg でライトをレンダリングするにはどうすればよいですか? 通常の OpenGL ライトを宣言してから、Cg を使用してライトをレンダリングする必要がありますか?それとも、すべて Cg で行われますか?
Cg を使用した照明についての読み物を教えていただければ、それも素晴らしいでしょう。
opengl - 頂点シェーダーとフラグメントシェーダー
Cgに関するチュートリアルをいくつか読んだことがありますが、はっきりしないことが1つあります。頂点シェーダーとフラグメントシェーダーの違いは正確には何ですか?そして、どのような状況で一方が他方よりも適していますか?
opengl - Cg を使用した OpenGL スポットライト
Cg でスポットライト効果を実現しようとしています。私はすでに、通常のアンビエント ライティングとディフューズ ライティングを行うことができました。
スポットライトの基本的な機能 (位置、方向、カットオフ角度) は理解していますが、これらを Cg で処理することはまだできません。
これは、スポットライト パラメータを計算する方法です。
directionは、スポットライトが向けられているピクセルです (例: (0, 0, 0) )
lightPositionはライトの位置です
Pは、私が照らそうとしているポイントです。IN.position は頂点シェーダーから取得され、既に modelViewProj で乗算されています。
angleは、光の方向と光からの方向の間の角度の余弦であり、私が照らそうとしている点までです。
問題は、ライトの方向を変更してもスポットライトにまったく影響がないことです。スポットライトは常に 0,0,0 を中心に配置されます。lightPosition を変更すると、スポットライトが変更されますが、それでも 0,0,0 から始まり、ライトの位置の反対側に拡大します
もう 1 つのことは、方向ベクトルを計算するときに、lightP の代わりに lightPosition を使用することです。lightP を使用すると、スポットライトがまったく機能しなくなります。
また、スポットライトはシーンの半分だけを照らします。
これに関する私の主なリファレンスは、 The Cg Tutorial のChapter 5(Lighting)でした。
macos - MacOSX スクリーンセーバーと CG.framework
Mac (10.6) 用の openGL ベースのスクリーンセーバーを開発していますが、CG.framework へのリンクに問題があります。
上記のフレームワークがプロジェクトにリンクされると、スクリーンセーバーが無効になります。警告もエラーもありません。スクリーンセーバーのリストでグレー表示されました。
アップデート:
再現方法は非常に簡単ですが、NVidia の CG.framework が必要です。
- XCode で空のスクリーンセーバー プロジェクトを作成する
- コンパイルしてインストールし、問題がないことを確認します
- CG.framework を追加してプロジェクトを再構築する
- もう一度インストールしてみてください。その後、「このコンピューターでは「xxx」スクリーンセーバーを使用できません。新しいバージョンについては、このスクリーンセーバーの開発者に連絡してください。」メッセージ