glTexSubImage2d を使用して、GL 初期化で glTexImage2d で初期化された数フレームごとにテクスチャを更新していました。各パーティクル自体にテクスチャを適用したパーティクル システムを追加した後、glTexSubImage2d テクスチャを表示するクワッドが表示されません。
パーティクルのテクスチャは PNG であるため、SDL を使用して PNG を SDL サーフェスにロードし、glTexImage2d を使用して PNG をテクスチャにバインドします。
クワッドの glTexSubImage2d 呼び出しを glTexImage2d 呼び出しに変更すると、テクスチャが表示されますが、これは非常に非効率的であり、フレームレートが少なくとも半分になるため、glTexSubImage2d を使用することをお勧めします (以前は機能していたように)。
glTexSubImage2d を使用できない理由を知っている人はいますか?
以下は、テクスチャの初期化とバインドに関連するコードです。
パーティクル テクスチャの読み込み
//Load smoke texture
SDL_Surface *surface;
SDL_Surface *alpha_image;
if( (surface = IMG_Load("smoke_particle.png")))
{
SDL_PixelFormat *pixf = SDL_GetVideoSurface()->format;
alpha_image = SDL_CreateRGBSurface( SDL_SWSURFACE, surface->w, surface->h, 32, pixf->Bmask, pixf->Gmask, pixf->Rmask, pixf->Amask );
SDL_SetAlpha(surface,0,0);
SDL_BlitSurface( surface, NULL, alpha_image, NULL );
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0,
GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels );
}
クワッドのテクスチャを設定する:
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &texVid);
glBindTexture(GL_TEXTURE_2D, texVid);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, VIDEO_WIDTH, VIDEO_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glPixelStorei(GL_UNPACK_ALIGNMENT, 2);
initGL() での唯一の呼び出しは、GL_TEXTURE_2D の有効化、GL_BLEND の glBlendFunc() の設定、および上記のクワッドのテクスチャの設定です。
何か案は?