1

我们很高兴地使用 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() 和设置四边形的纹理,如上。

有任何想法吗?

4

1 回答 1

0

愚蠢的是,我们将 VIDEO_WIDTH 设置为纹理的高度,将 VIDEO_HEIGHT 设置为纹理的宽度。

对不起,如果我们浪费了任何人的时间。

任何人都可以锁定这个或删除这个或任何东西吗?

谢谢,

无限化

于 2011-07-29T11:27:22.127 回答