我们很高兴地使用 glTexSubImage2d 每隔几帧更新一个纹理,该纹理在我们的 GL 初始化中使用 glTexImage2d 初始化。在添加了一个粒子系统后,每个粒子都对其本身进行纹理化,我们的四边形显示 glTexSubImage2d 纹理不显示。
粒子的纹理是 PNG,因此我们使用 SDL 将 PNG 加载到 SDL Surface,然后使用 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() 和设置四边形的纹理,如上。
有任何想法吗?