ここで奇妙な問題が発生しました。1秒間に数回作成される潜在的に大きな(最大500mbのような)3Dテクスチャがあります。テクスチャのサイズが変更される可能性があるため、古いテクスチャを毎回再利用することはできません。メモリ消費を回避するための論理的な手順は、テクスチャが使用されなくなるたびに(glDeleteTextureを使用して)テクスチャを削除することですが、プログラムはすぐに読み取りまたは書き込みアクセス違反でクラッシュします。テクスチャを更新するために使用するバッファで呼び出された場合、glDeleteBufferでも同じことが起こります。
私の目には、glDelete *関数はかなりフェイルセーフであるため、これは起こり得ません。対応するオブジェクトではないglハンドルをそれらに与えると、それらは何もしません。
興味深いのは、テクスチャとバッファを削除しないと、最終的にグラフィックカードのメモリがなくなるまでプログラムが正常に実行されることです。
これは、Windows XP 32ビット、266.58erドライバーを搭載したNVIDIA Geforce 9500GTで実行され、プログラミング言語はVisualStudio2005ではc++です。
アップデート
明らかに、影響を受ける関数はglDeleteだけではありません。他のいくつかの方法で違反が発生しました(昨日はそうではありませんでした)...ここで何かが壊れているようです。
アップデート2
これは失敗するべきではありませんか?
template <> inline
Texture<GL_TEXTURE_3D>::Texture(
GLint internalFormat,
glm::ivec3 size,
GLint border ) : Wrapper<detail::gl_texture>()
{
glGenTextures(1,&object.t);
std::vector<GLbyte> tmp(glm::compMul(size)*4);
glTextureImage3DEXT(
object, // texture
GL_TEXTURE_3D, // target
0, // level
internalFormat, // internal format
size.x, size.y, size.z, // size
border, // border
GL_RGBA, // format
GL_BYTE, // type
&tmp[0]); // don't load anything
}
失敗する:
Exception (first chance) at 0x072c35c0: 0xC0000005: Access violoation while writing to position 0x00000004.
Unhandled exception at 0x072c35c0 in Project.exe: 0xC0000005: Access violatione while writing to position 0x00000004.
最良の推測:プログラムメモリを台無しにする何か?