web-dev-qa-db-ja.com

フレームバッファで既存のテクスチャ添付ファイルのサイズを変更するにはどうすればよいですか?

ウィンドウのサイズを変更するときは、フレームバッファーにアタッチされているテクスチャのサイズを変更する必要があります。サイズパラメータを変えて、glTexStorage2Dをもう一度呼び出してみました。しかし、それは機能しません。

フレームバッファにアタッチされているテクスチャのサイズを変更するにはどうすればよいですか? (デプスアタッチメントを含む)

[〜#〜]編集[〜#〜]

私が試したコード:

glBindTexture(m_target, m_name);
glTexStorage2D(m_target, 1, m_format, m_width, m_height);
glBindTexture(m_target, 0);

ここで、m_name、m_target、およびm_formatは元のテクスチャから保存され、m_widthとm_heightは新しい寸法です。

EDIT2

質問を修正できるように、なぜこれが反対票を投じられたのか教えてください。

EDIT3

ここ 、他の誰かが同じ問題を抱えていました。

テクスチャがFBOに正しくレンダリングされているのに、間違ったサイズで表示されていることがわかりました。テクスチャが最初にデフォルトのフレームバッファに送信されたとき、テクスチャサイズが永続的に設定され、サイズ変更されたテクスチャが送信されたときは、元のサイズであるかのように扱われていました。たとえば、最初のテクスチャが100x100で、2番目のテクスチャが50x50の場合、テクスチャ全体が画面の左下の4分の1に表示されます。逆に、元のテクスチャが50x50で、新しいテクスチャが100x100の場合、結果は、画面全体に表示されるテクスチャの左下4分の1になります。

ただし、彼はこれを修正するためにシェーダーを使用しています。それは私がこれをしたい方法ではありません。別の解決策が必要ですよね?

15
gartenriese

glTexImage2D (...)を使用してテクスチャにストレージを割り当てていた場合、最初にテクスチャを削除しなくても、いつでもテクスチャ内の任意の画像にストレージを再割り当てできます。

ただし、あなたはglTexImage2D (...)を使用しているnotglTexStorage2D (...)。これにより、immutableテクスチャオブジェクトが作成されます。このオブジェクトのストレージ要件は一度設定され、二度と変更することはできません。最初にストレージを割り当てた後にglTexImage2D (...)またはglTexStorage2D (...)を呼び出すと、_GL_INVALID_OPERATION_が生成され、他には何も実行されません。

サイズをいつでも変更できるテクスチャを作成する場合は、glTexStorage2D (...)を使用しないでください。代わりに、データ型と形式のダミー(が互換性のある)値をglTexImage2D (...)に渡します。


たとえば、1 LODつまり_m_width_ x _m_height_であるテクスチャを割り当てたい場合:

_glTexImage2D (m_target, 0, m_format, m_width, m_height, 0, GL_RED, GL_FLOAT, NULL);
_

後で_m_width_または_m_height_が変更された場合は、同じ方法でストレージを再割り当てできます。

_glTexImage2D (m_target, 0, m_format, m_width, m_height, 0, GL_RED, GL_FLOAT, NULL);
_

これは、glTexStorage2D (...)を使用する場合とは大きく異なります。これにより、ストレージを再割り当てできなくなり、単に_GL_INVALID_OPERATION_エラーが発生します。


glTexStorage2D (...) のマニュアルページを確認する必要があります。次のように記載されています。

説明

glTexStorage2D は、2次元テクスチャまたは1次元テクスチャ配列のすべてのレベルのストレージ要件を同時に指定します。 このコマンドでテクスチャを指定すると、プロキシテクスチャでない限り、すべてのレベルの形式と寸法が不変になります。画像の内容は変更される可能性がありますが、ただし、ストレージ要件は変更されない可能性があります。このようなテクスチャは、不変形式のテクスチャと呼ばれます。

glTexStorage2Dの動作は、ターゲットパラメータによって異なります。

ターゲットが_GL_TEXTURE_2D, GL_PROXY_TEXTURE_2D_、_GL_TEXTURE_RECTANGLE_、_GL_PROXY_TEXTURE_RECTANGLE_、または_GL_PROXY_TEXTURE_CUBE_MAP_の場合、glTexStorage2Dを呼び出すことは同等です。エラーが生成されないと仮定して、次の擬似コードを実行します。

_for (i = 0; i < levels; i++) {
    glTexImage2D(target, i, internalformat, width, height, 0, format, type, NULL);
    width = max(1, (width / 2));
    height = max(1, (height / 2));
}
_

ターゲットが_GL_TEXTURE_CUBE_MAP_の場合、glTexStorage2Dは次と同等です。

_for (i = 0; i < levels; i++) {
    for (face in (+X, -X, +Y, -Y, +Z, -Z)) {
        glTexImage2D(face, i, internalformat, width, height, 0, format, type, NULL);
    }
    width = max(1, (width / 2));
    height = max(1, (height / 2));
}
_

ターゲットが_GL_TEXTURE_1D_または_GL_TEXTURE_1D_ARRAY_の場合、glTexStorage2Dは次と同等です。

_for (i = 0; i < levels; i++) {
    glTexImage2D(target, i, internalformat, width, height, 0, format, type, NULL);
    width = max(1, (width / 2));
}
_

テクスチャデータが実際に提供されていないため、formattypeの擬似コードで使用される値は無関係であり、選択したinternalformat列挙子に対して正当な値。 [...]成功すると、_GL_TEXTURE_IMMUTABLE_FORMAT_の値は_GL_TRUE_になります。 _GL_TEXTURE_IMMUTABLE_FORMAT_の値は、pnameを_GL_TEXTURE_IMMUTABLE_FORMAT_に設定してglGetTexParameterを呼び出すことで検出できます。テクスチャオブジェクトの寸法やフォーマットをこれ以上変更することはできません。テクスチャオブジェクトのサイズや形式を変更する可能性のあるコマンド(glTexImage2Dなど)またはglTexStorage2Dへの別の呼び出しを使用する)は、実際にはオブジェクトの寸法や形式を変更しない場合でも、_GL_INVALID_OPERATION_エラーを生成します。

22