1

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() の設定、および上記のクワッドのテクスチャの設定です。

何か案は?

4

1 に答える 1

0

愚かなことに、VIDEO_WIDTH をテクスチャの高さに設定し、VIDEO_HEIGHT をテクスチャの幅に設定しました。

誰かの時間を無駄にしてしまい申し訳ありません。

誰でもこれをロックしたり削除したりできますか?

ありがとう、

インフィニティフィズ

于 2011-07-29T11:27:22.127 に答える