2011-07-28 50 views
1

我們很高興地使用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()以及如上所述設置四邊形紋理。

任何想法?

+2

也許這是一個有點瑣碎的評論,但你綁定更新其數據,並用它繪製之前正確的質感? –

+0

我也猜測你沒有正確的紋理邊界。但是如果沒有至少更新代碼以及這些東西發生的順序,就不可能分辨出來。 – ltjax

+0

現在感覺有點尷尬,但使用gDebugger打破了glTexSubImage2d()後,我們意識到VIDEO_HEIGHT和VIDEO_WIDTH是錯誤的方式,所以opengl拋出INVALID_NUM錯誤,因爲它想要一個512x1024,我們通過一個1024x512 ... oops。感謝您的意見。 –

回答

0

很愚蠢的是,我們將VIDEO_WIDTH設置爲紋理的高度,將VIDEO_HEIGHT設置爲紋理的寬度。

對不起,如果我們浪費了任何人的時間。

任何人都可以鎖定或刪除這個或任何東西?

感謝,

Infinitifizz