誰かplsがOpenGLでテクスチャを作成するためにハードウェアメモリを使用する方法を教えてもらえますか?現在、ゲームをウィンドウモードで実行していますが、ハードウェアを使用するにはフルスクリーンに切り替える必要がありますか?
ハードウェアでテクスチャを作成できる場合、(ハードウェアメモリ以外の)テクスチャの数に制限はありますか?次に、テクスチャをハードウェアにキャッシュするにはどうすればよいですか?ありがとう。
これは、OpenGL のほとんどすべてのテクスチャ チュートリアルでカバーされているはずです。たとえば、ここ、ここ、ここなどです。
すべてのテクスチャについて、最初にテクスチャ名が必要です。テクスチャ名は、1 つのテクスチャの一意のインデックスのようなものです。すべての名前は、独自のパラメーターやデータなどを持つことができるテクスチャ オブジェクトを指します。glGenTexturesは、新しい名前を取得するために使用されます。uint 範囲 (2^32) 以外に制限があるかどうかはわかりません。存在する場合、おそらくすべての新しいテクスチャ名に対して 0 が返されます (および gl エラー)。
次のステップは、テクスチャをバインドすることです ( glBindTextureを参照)。その後、テクスチャを使用する、またはテクスチャに影響を与えるすべての操作は、glBindTexture のパラメータとして使用したテクスチャ名で指定されたテクスチャを使用します。テクスチャ ( glTexParameter )のパラメータを設定し、 glTexImage2D (2D テクスチャ用) でテクスチャ データをアップロードできるようになりました。glTexImage を呼び出した後、テクスチャ データでシステム メモリを解放することもできます。
静的テクスチャの場合、これはすべて 1 回だけ実行する必要があります。テクスチャを使用したい場合は、再度バインドしてテクスチャリングを有効にするだけです (glEnable(GL_TEXTURE_2D))。
1 つのテクスチャのサイズ (幅/高さ) は GL_MAX_TEXTURE_SIZE によって制限されます。これは通常、4096、8192、または 16384 です。また、フレームバッファや頂点バッファなどの他のリソースと一緒に収まる必要があるため、使用可能なグラフィックス メモリによっても制限されます。すべてのテクスチャを合わせると、使用可能なメモリよりも大きくなる可能性がありますが、スワップされます。
ほとんどの場合、グラフィックス ドライバーは、どのテクスチャをシステム メモリに格納し、どのテクスチャをグラフィックス メモリに格納するかを決定する必要があります。ただし、 glPrioritizeTexturesまたは glTexParameterを使用して、特定のテクスチャに高い優先度を与えることができます。
編集: ドライバーは通常、テクスチャがどこに保存されているかについてあまり心配しません。頻繁に使用されるテクスチャも、グラフィックス メモリに保存される可能性が高くなります。優先度を設定すると、テクスチャがグラフィックス カードにとどまることがいかに重要であるかについて、ドライバーにとって単なる「ヒント」になります。優先度が完全に無視される可能性もあります。glAreTexturesResidentを使用して、テクスチャが現在どこにあるかを確認することもできます。
通常、 GPUでテクスチャを生成することについて話すとき、実際にはテクスチャイメージを作成して、通常のテクスチャのように適用しているわけではありません。より単純で一般的なアプローチは、フラグメントシェーダーを使用して、すべての単一フレームの各ピクセルの色を最初からリアルタイムで手続き的に計算することです。
この標準的な例は、ティーポットなどのオブジェクトの表面にマンデルブロパターンを生成することです。ティーポットは、アプリケーションによってポリゴンとテクスチャ座標でレンダリングされます。レンダリングパイプラインのある段階で、ティーポットのすべてのピクセルは、アプリケーションによってGPUに送信される小さなプログラムであるフラグメントシェーダーを通過します。フラグメントシェーダーは、2Dテクスチャ座標を読み取り、2D座標のマンデルブロ集合色を計算してピクセルに適用します。
フルスクリーンモードはそれとは何の関係もありません。ウィンドウモードの場合でも、シェーダーを使用してテクスチャを生成できます。前述したように、作成するテクスチャは実際にはテクスチャメモリのスペースを占めることはなく、その場で作成されます。生成されたテクスチャをキャプチャしてキャッシュする方法を考えることもできますが、これはやや複雑で、複数のレンダリングパスが必要になる場合があります。
Googleで「GLSL」(OpenGLシェーディング言語)を検索すると、詳細を知ることができます。
このやや時代遅れのチュートリアルは、マンデルブロ集合を描画する単純なフラグメントシェーダーを作成する方法を示しています(4ページ)。
「OpenGLシェーディング言語、第2版」という本を手に入れることができれば、アプリケーションからの外部3Dパーリンノイズテクスチャを使用して空、火、木のテクスチャを生成する簡単な例がいくつか含まれていることがわかります。 。
GPUでテクスチャを作成するには、「テクスチャにレンダリング」チュートリアルを調べてください。一般的な方法は2つあります。PBufferコンテキストをテクスチャとしてバインドする方法と、フレームバッファオブジェクトを使用する方法です。テクスチャへのPBufferレンダリングは古い方法であり、より幅広いサポートがあります。フレームバッファオブジェクトの方が使いやすいです。
また、OpenGLをハードウェアアクセラレーションするために「フルスクリーン」モードに切り替える必要はありません。実際、OpenGLはウィンドウについてまったく知りません。フルスクリーンのOpenGLウィンドウはまさにそれです:装飾がなく、入力フォーカスが取得されていない他のすべてのウィンドウの上にあるトップベルウィンドウ。一部のドライバーは、ウィンドウマスキングとクリッピングコードをバイパスし、アクティブなOpenGLコンテキストを持つウィンドウが画面全体をカバーする場合、よりシンプルで高速なバッファースワップ方式を採用するため、パフォーマンスは少し向上しますが、現在のハードウェアおよびソフトウェアでは、効果は非常に小さいです。他の影響に。