2013-09-21 116 views
0

我已經搜索了這個,但不幸的是,我找到的唯一答案是那些處理紋理未映射的問題,在這種情況下紋理映射,但看起來不像加載的表面。SDL2與OpenGL紋理顯示不正確

無論如何,忽略了2個方形圖像的強度不是必需的事實(我還沒有正確地研究過),我已經制作了一個功能腳本,用於將表面擴展到2維和一個結構用於存儲調整大小的表面,表面的舊尺寸和紋理的ID。

我的紋理編碼表面是(參數是SDL_Surface *衝浪,antTex * TEX):

tex->w=surf->w; 
tex->h=surf->h; 
tex->surf=resizeToNearestPow2(surf); 
glGenTextures(1, &tex->id); 
glBindTexture(GL_TEXTURE_2D, tex->id); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->surf->w, tex->surf->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, tex->surf->pixels); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glBindTexture(GL_TEXTURE_2D, NULL); 

的antTex結構是:

GLuint id;   //Texture ID 
int w, h;   //Original Image Size 
int rw, rh;   //Resized Canvas Size 
SDL_Surface* surf; //Resized Surface 

一切有關調整圖像大小,似乎是工作(使用SDL的SDL_SaveBMP函數檢查生成的圖像)​​,我使用SDL2_image.h的IMG_Load來加載原始圖像。

當我畫一個平面,而GL_BLEND啓用映射到它的紋理什麼也不顯示的一切,當我禁用它,我得到這個(紅色是窗口的背景色):

http://i1200.photobucket.com/albums/bb336/DarknessXeagle/error_zps03e1e5a1.png

原始圖像是這樣的:

http://i1200.photobucket.com/albums/bb336/DarknessXeagle/d_zpsc8b9af6f.png

這是我對於所映射的紋理繪製平面功能(參數是antTex * TEX,詮釋的x,int y)對:

glBindTexture(GL_TEXTURE_2D, tex->id); 
int w, h; 
w=tex->w; 
h=tex->h; 
GLfloat tw, th; 
th=(GLfloat)tex->h/(GLfloat)tex->rh; 
tw=(GLfloat)tex->w/(GLfloat)tex->rw; 
glPushMatrix(); 
    glTranslatef(x, y, 0); 
    glBegin(GL_QUADS); 
     glNormal3f(0, 0, 1); 
     glTexCoord2f(0, th); glVertex2f(0, h); 
     glTexCoord2f(tw, th); glVertex2f(w, h); 
     glTexCoord2f(tw, 0); glVertex2f(w, 0); 
     glTexCoord2f(0, 0);  glVertex2f(0, 0); 
    glEnd(); 
glPopMatrix(); 
glBindTexture(GL_TEXTURE_2D, NULL); 

回答

1

對於使用glTexCoord2f將紋理渲染到四邊形時傳遞的u和v座標有問題。

你需要改變:

glTexCoord2f(0, th); glVertex2f(0, h); 
glTexCoord2f(tw, th); glVertex2f(w, h); 
glTexCoord2f(tw, 0); glVertex2f(w, 0); 
glTexCoord2f(0, 0);  glVertex2f(0, 0); 

到:

glTexCoord2f(0, 1); glVertex2f(0, h); 
glTexCoord2f(1, 1); glVertex2f(w, h); 
glTexCoord2f(1, 0); glVertex2f(w, 0); 
glTexCoord2f(0, 0);  glVertex2f(0, 0);