我們很高興地使用glTexSubImage2d來更新每個在GL初始化過程中用glTexImage2d初始化的幾幀紋理。添加粒子系統後,每個粒子都會紋理化,我們顯示的glTexSubImage2d紋理不顯示。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()以及如上所述設置四邊形紋理。
任何想法?
也許這是一個有點瑣碎的評論,但你綁定更新其數據,並用它繪製之前正確的質感? –
我也猜測你沒有正確的紋理邊界。但是如果沒有至少更新代碼以及這些東西發生的順序,就不可能分辨出來。 – ltjax
現在感覺有點尷尬,但使用gDebugger打破了glTexSubImage2d()後,我們意識到VIDEO_HEIGHT和VIDEO_WIDTH是錯誤的方式,所以opengl拋出INVALID_NUM錯誤,因爲它想要一個512x1024,我們通過一個1024x512 ... oops。感謝您的意見。 –