2009-10-20 53 views
2

我想第一次使用openGL ES(for iPhone)渲染紋理,然後在屏幕上顯示紋理。除了在紋理頂部存在32行間隙並且底部32行被切斷之外,所有工作都是可行的。這就像我所有的繪圖正在向下偏移32個像素,這導致底部的32行沒有被繪製,因爲它們在紋理之外。在opengl es紋理頂部有32個像素間隙

這裏是一個非常簡單的例子:

void RenderToTexture(int texture) 
{ 
    unsigned char buffer[4 * 320 * 480]; 
    unsigned char colour[4]; 
    colour[0] = 255; 
    colour[1] = 0; 
    colour[2] = 0; 
    colour[3] = 128; 
    for (int i = 0; i < 4 * 320 * 480; i += 4) 
    { 
     buffer[i] = colour[0]; 
     buffer[i+1] = colour[1]; 
     buffer[i+2] = colour[2]; 
     buffer[i+3] = colour[3]; 
    } 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 320, 480, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 
} 

而這裏的結果:

http://img10.imageshack.us/img10/2113/screenjc.th.jpg http://img10.imageshack.us/img10/2113/screenjc.th.jpg

只設置使用glColor4f(顏色),而不是調用RenderToTexture()導致紅屏如預期。

任何幫助將不勝感激,謝謝。

+0

在可可中,空間被引入來放置狀態欄。使用這一行刪除它:self.frame = [[UIScreen mainScreen] bounds]; – Raptor 2009-10-20 06:20:21

+2

雖然狀態欄只有20px高.... – 2009-10-20 06:21:53

回答

5

這32個像素是512:512 - 480 = 32的缺失部分。 原因是,您只能使用與GL_TEXTURE_2D相乘的紋理大小。 所以你必須將你的寬度和高度四捨五入爲512.你仍然可以通過使用紋理座標或設置紋理矩陣來只顯示你想要的紋理部分。

1

iPhone 3GS在某些條件下支持非冪次冪紋理。所有必須滿足以下條件:

  • GL_TEXTURE_WRAP_S應設置爲GL_CLAMP_TO_EDGE
  • GL_TEXTURE_WRAP_T應設置爲GL_CLAMP_TO_EDGE
  • 紋理映射必須關閉;用GL_LINEAR而不是GL_LINEAR_MIPMAP_LINEAR來縮小