ウィンドウのサイズを変更するときは、フレームバッファーにアタッチされているテクスチャのサイズを変更する必要があります。サイズパラメータを変えて、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になります。
ただし、彼はこれを修正するためにシェーダーを使用しています。それは私がこれをしたい方法ではありません。別の解決策が必要ですよね?
glTexImage2D (...)
を使用してテクスチャにストレージを割り当てていた場合、最初にテクスチャを削除しなくても、いつでもテクスチャ内の任意の画像にストレージを再割り当てできます。
ただし、あなたはglTexImage2D (...)
を使用しているnot、glTexStorage2D (...)
。これにより、immutableテクスチャオブジェクトが作成されます。このオブジェクトのストレージ要件は一度設定され、二度と変更することはできません。最初にストレージを割り当てた後にglTexImage2D (...)
またはglTexStorage2D (...)
を呼び出すと、_GL_INVALID_OPERATION
_が生成され、他には何も実行されません。
サイズをいつでも変更できるテクスチャを作成する場合は、glTexStorage2D (...)
を使用しないでください。代わりに、データ型と形式のダミー(が互換性のある)値をglTexImage2D (...)
に渡します。
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));
}
_
テクスチャデータが実際に提供されていないため、
format
とtype
の擬似コードで使用される値は無関係であり、選択したinternalformat
列挙子に対して正当な値。 [...]成功すると、_GL_TEXTURE_IMMUTABLE_FORMAT
_の値は_GL_TRUE
_になります。 _GL_TEXTURE_IMMUTABLE_FORMAT
_の値は、pname
を_GL_TEXTURE_IMMUTABLE_FORMAT
_に設定してglGetTexParameterを呼び出すことで検出できます。テクスチャオブジェクトの寸法やフォーマットをこれ以上変更することはできません。テクスチャオブジェクトのサイズや形式を変更する可能性のあるコマンド(glTexImage2Dなど)またはglTexStorage2Dへの別の呼び出しを使用する)は、実際にはオブジェクトの寸法や形式を変更しない場合でも、_GL_INVALID_OPERATION
_エラーを生成します。