問題タブ [render-to-texture]
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 - DirectX 11 でテクスチャをレンダリングし、テクスチャを通常のメモリに転送する方法は?
DirectX アクセラレーションを利用して、イメージをテクスチャにレンダリングしたいと考えています。しかし、その画像を画面に表示する代わりに、この画像をビットマップとして通常のメモリに戻し、結果を処理したいと考えています。テクスチャを通常のメモリに転送するにはどうすればよいですか? DirectX 11 を使用しています。
c# - Texture2Dレンダリング画像
Texture2Dを画像で埋める最速の方法は何ですか?
/Images/image.pngの下に目的の画像があります。
私の既存のコードは、テクスチャを白い色で塗りつぶすだけです。画像をレンダリングするにはどうすればよいですか?
たぶん私はそれを間違った方法で行いますが、画面に画像を動的に表示するための最も簡単/最速の方法は何ですか?
アップデート
ContentManagerを使用するようにコードを変更しました。
「ファイルが見つかりません」をスローします。
「"\Images\block.png"の読み込み中にエラーが発生しました。ファイルを開くことができません。」をスローします。
directx - テクスチャにレンダリングしますが、DirectXを使用して透明度で保存するにはどうすればよいですか?
私はDirectX11SDKを使用していて、テクスチャに何かをレンダリングしています(そしてそれは機能します)。D3DX11SaveTextureToFileを使用して、出力をPNGテクスチャに保存するよりも。すべてが機能しますが、透明性が得られません。
背景(要素がレンダリングされていないスペース)を透明にしたい。これの代わりに、私はいくつかの背景を取得します。
float ClearColor[4]
関数のforをに変更しようとしたのは、最後のClearRenderTargetView
関数がアルファで1.0fであり、透明性が得られると思ったためですが、それはうまくいきませんでした(0.0fでも同じです)。{ 0.0f, 0.0f, 0.0f, 1.0f }
これが私のコードの役に立つかもしれない部分です:
ブレンド状態(これは良いと思います。画面上に透明な要素をレンダリングするために機能します。もちろん、モニターの画面には常に「背景」がありますが、PNGファイルにはありません):
と:
opengl - OpenGL 深度テクスチャ アーティファクト
小さな 3D エンジンにシャドウ マッピングを実装しています。ただし、深度テクスチャにアーティファクトがあるようです。これは、テクスチャを使用して影を観察するか、クワッドに深度テクスチャを描画することで確認できます。
クワッドに描画されたときの深度テクスチャは次のようになります。
はい、それらの小さな白い四角形はそこにあるべきではありません。
それで、それを引き起こしている可能性があるのは何ですか?
glfw ウィンドウを開く:
深度フレーム バッファとテクスチャの作成:
深度テクスチャへのレンダリング:
directx - Direct3D 11 はオフスクリーンのみのレンダリング (スワップ チェーンなし) を実行できますか?
Direct3D 11 を使用して、テクスチャのみにレンダリングすることはできますか?つまり、スワップ チェーンを作成せず、ウィンドウを作成せずにレンダリングすることはできますか? 私はそれを試しましたが、すべての API 呼び出しが成功しました。唯一の問題は、ステージング テクスチャからダウンロードしている画像が黒いことです。
最終的に、PIX を使用して完全なストリームをキャプチャすることができました (Parallel Nsight はまったく機能していないようです)。PIX は、私のレンダー ターゲットも黒であることを示していますが、青にクリアしています。
私がやろうとしていることはまったく可能ですか?もしそうなら、どのようにそれを行うでしょうか?
c++ - テクスチャにレンダリングするときの DX11 アルファ ブレンディング
最終編集:
解決済み...アルファブレンディングがどのように機能するかを詳しく学ぶ必要がありました。私が持っていたはずです: oBlendStateDesc.RenderTarget[a].DestBlendAlpha = D3D11_BLEND_ZERO; ...アルファを維持するには、D3D11_BLEND_ONE に設定します。
一度バックバッファにレンダリングすると、色が正常にブレンドされ、それが最終出力になるため、問題は認識されません。テクスチャにレンダリングするときも同じことが当てはまります。テクスチャをバックバッファにレンダリングすると、正しくないアルファがテクスチャをバックバッファに誤ってブレンドする役割を果たします。
その後、アルファが減少しているように見える別の問題に遭遇しました。これは、たとえば、色が 2 回ブレンドされているためです...
テクスチャにレンダリング...
今...
バックバッファにレンダリング...
これを解決するには、テクスチャをバックバッファーにレンダリングするときに同じブレンド状態を使用しますが、SrcBlend を D3D11_BLEND_ONE に変更して、色が 2 回ブレンドされないようにします。
うまくいけば、これは同様の問題を抱えている他の誰かに役立ちます....
編集終了
パフォーマンスを向上させるために、テクスチャに変化しないテキストの文字列をレンダリングして、毎回個々の文字のレンダリングを節約しようとしています。
私は厳密に 2D でレンダリングしているので、アルファ ブレンディングを有効にしながら深度とステンシルのテストを無効にしました。
問題は、アルファ ブレンディングが発生していないように見えることです。最後に描画されたものは、現在のピクセルを独自のデータで上書きします...ブレンディングはありません。
変わらないシングルブレンド状態を使用しています。バックバッファにレンダリングすると、ブレンディングは正常に機能します。最終的なテクスチャをバックバッファにレンダリングするとき、ブレンディングも正常に機能します。ブレンドが失敗したように見えるのは、テクスチャにレンダリングしたときだけです。
単一のブレンド状態を設定する方法は次のとおりです。
テクスチャにレンダリングする際にブレンドを有効にするために欠けている追加の手順はありますか?
編集: AlphaToCoverageEnable を true に設定すると、ブレンドされますが、ひどく見えます。少なくとも、同じブレンド状態を使用していることを確認します...バックバッファまたはテクスチャにレンダリングするタイミングに応じて、動作が異なります:/これが私のテクスチャの説明です...
編集:ここにいくつかの視覚化があります...
- バックバッファへのレンダリング - AlphaBlending が有効になっています。
- テクスチャへのレンダリング - AlphaBlending が有効になっています。
- バックバッファへのレンダリング - AlphaBlending が無効になっています。
- フォント ファイルから取得した文字 T
*AB を無効にしてレンダリングすると、文字が完全に一致します (4 と 3 を比較)
*AB を有効にしてバックバッファにレンダリングすると、文字はわずかに (ほとんど目立たない) 色あせてレンダリングされますが、それでもブレンドされます (4 と 1 を比較)
*AB を有効にしてテクスチャにレンダリングすると、まったくブレンドされずに、文字がさらに著しく色あせてレンダリングされます。(4 と 2 を比較)
アルファ ブレンディングを有効にすると色が白っぽくなる理由はわかりませんが、手がかりになるのではないでしょうか?
編集: レンダー ターゲット テクスチャをクリアすると... 0.0f、0.0f、1.0f、1.0f (RGBA、青)... これが結果です:
アルファ > 0.0f & < 1.0f のピクセルのみが色とブレンドされます。別の手がかりですが、この問題を解決する方法がわかりません...
opengl - glClear()は、Intel HD 4000(GL 4.0)ではGL_OUT_OF_MEMORYを提供しますが、GeForce(GL 4.2)では提供しません...なぜですか?
さて、これは非常に奇妙な振る舞いです。
TL; DR-テクスチャへのレンダリング設定で、ウィンドウ(フレームバッファ0)のサイズを変更すると、バインドされたフレームバッファ0(ウィンドウのクライアント領域)に対するglClear(GL_COLOR_BUFFER_BIT)の次の呼び出しのみが、2つのうちの1つでのみGL_OUT_OF_MEMORYを生成します。ただし、GPUは、レンダリングが適切かつ正しく進行します。
さて、すべてのザラザラした詳細:
したがって、これは2つのGPUを備えたVaio Z上にあります(マシンの物理的なトグルボタンで切り替えることができます):
OpenGL 4.2.0 @ NVIDIA Corporation GeForce GT 640M LE / PCIe / SSE2(GLSL:4.20 NVIDIA、Cgコンパイラ経由)
OpenGL4.0.0-ビルド9.17.10.2867@Intel Intel(R)HD Graphics 4000(GLSL:4.00-ビルド9.17.10.2867)
私のプログラムは、GLFW64ビットを使用するWin764ビットの下でGo1.0.364ビットになっています。
私はかなりシンプルでわかりやすいテクスチャへのレンダリング「ミニパイプライン」を持っています。まず、通常の3Dジオメトリは、最も単純なシェーダー(照明なし、何もない、キューブとプレーンの数であるテクスチャ付き三角形メッシュのみ)を使用して、深度/ステンシルアタッチメントとしての深度/ステンシルレンダーバッファーとカラーアタッチメントとしてのtexture2D。テクスチャの場合、ミップマップと同様にすべてのフィルタリングが無効になります。
次に、texelFetch(tex、gl_FragCoord.xy、0)を使用してフレームバッファテクスチャ(カラーアタッチメント)からサンプリングするだけで、フルスクリーンクワッド(実際には単一の「特大」フルスクリーントライ)をレンダリングするため、ラッピングは使用されません。
コアプロファイルを強制する場合と強制しない場合の両方で、両方のGPUがこれを適切にレンダリングします。これについてGLエラーが報告されることはなく、すべてが期待どおりにレンダリングされます。Intel HD 4000GPUのGL4.0レンダラー(コアプロファイルとコンププロファイルの両方)を使用しているときにウィンドウのサイズを変更した場合を除きます。その場合にのみ、1回のサイズ変更でフレームバッファ0(画面)での次のglClear(GL_COLOR_BUFFER_BIT)呼び出しの直後にGL_OUT_OF_MEMORYエラーが記録されますが、サイズ変更後は1回だけであり、後続のループの反復ごとではありません。
興味深いことに、私は実際にはサイズ変更の割り当てさえしていません!ウィンドウのサイズ変更で発生するすべてのロジックを一時的に無効にしました。つまり、現在、ウィンドウのサイズ変更イベントを完全に無視しています。つまり、RTTフレームバッファーとその深度およびカラーアタッチメントの解像度は変更/再作成されていません。つまり、次のglViewPortは、ウィンドウとGLコンテキストが最初に作成されたときと同じディメンションを使用しますが、エラーはglClear()で発生します(前ではなく、後のみ、一度だけ-ダブルチェックとトリプルチェックを行いました) )。
これはドライバーのバグでしょうか、それともここで間違っている可能性があることはありますか?
opengl - Opengl - フレームバッファのバインドを解除すると、添付されたテクスチャがクリアされます
後で使用するテクスチャへのレンダリングに問題があります。現在、フレームバッファ オブジェクトを生成し、2 つのテクスチャ (1 つの RGB と 1 つの DEPTH_COMPONENT) を作成し、2 つのテクスチャをアタッチし、状態を確認して、フレーム バッファがバインドされた状態で描画しています。gDEBugger の内部では、すべてがテクスチャに問題なく描画されていることがわかります。
ただし、デフォルト バッファ ( glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0) ) にバインドしようとすると、テクスチャはゼロにクリアされ、テクスチャに描画されたものはすべて静的バッファに戻ります。また、さらに 2 つの空のテクスチャをフレーム バッファにバインドしようとしましたが、すべてが新しいテクスチャに移動されます。
何か案は?
編集済み: コードを削除しました。
TL;DR : 問題は EXT の使用にありました (例: glBindFramebuffer の代わりに glBindFramebufferEXT など)。
android - OpenGL ES は LUMINANCE FBO を Android で動作させることができません
フレームバッファを使用して、ビデオ レンダラーで後処理シェーダーを実行しています。シェーダーの 1 つはルックアップが非常に多いため、輝度のみのフレーム バッファーに変更して速度を上げたいと考えています。初期化でglTexImage2D呼び出しをRGBAからLUMINANCEに変更しようとしましたが、「onDrawFrame」でバッファをアタッチしようとするとエラーが発生します。
問題は、例からコードをまとめてハッキングしたため、それが行っているすべてのことを完全に理解していないことです。1 つには、深度アタッチメントも作成しています。ビデオをレンダリングしているため、深度情報は必要ありませんが、それを無効にできるかどうかはわかりません。とにかく、onSurfaceCreated での FBO の初期化は次のとおりです。
onDrawFrame でバッファをアタッチするコードは次のとおりです。
誰にも何か提案がありますか?また、深度バッファコンポーネントを捨てることはできますか、それとも必須ですか
opengl - テクスチャを深さのアタッチメントとして使用するにはどうすればよいですか?
複数のレンダリングターゲットを持つフレームバッファがあります。それらはすべてテクスチャであり、レンダーバッファではありません。テクスチャのA
コンポーネントを深度アタッチメントとして使用するにはどうすればよいですか?デフォルトの深度テストを使用したい。RGBA