2010-10-02 38 views
2

我已經劃分了CCNode,並希望在每次繪製調用時閃存存儲在成員GLubyte *緩衝區中的圖像。這導致繪製黑色正方形,並且兄弟CCLabel節點現在也完全是黑色的。繼承CCNode,使用glTexImage2D blitzing圖像

因此,有兩個問題:

  1. 爲什麼不是方形白色的?我將緩衝區memset到0xffffffff。
  2. 我的OpenGL調用在繪製方法中一定有問題,因爲它會影響另一個節點的繪製。任何人都可以說什麼?

數據初始化:

exponent = e; 
width = 1 << exponent; 
height = 1 << exponent; 
imageData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte)); 
memset(imageData, 0xff, 4 * width * height * sizeof(GLubyte)); 

抽獎方法:

- (void) draw 
{ 
    float w = 100.0f; 

    GLfloat vertices[] = { 
    0.0f, 0.0f, 0.0f, 
     w, 0.0f, 0.0f, 
    0.0f, w, 0.0f, 
     w, w, 0.0f 
    }; 

    const GLshort texture_coordinates[] = { 
    0, 0, 
    1, 0, 
    0, 1, 
    1, 1, 
    }; 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, width, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 

    glVertexPointer(3, GL_FLOAT, 0, vertices); 
    glTexCoordPointer(2, GL_SHORT, 0, texture_coordinates); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
} 
+0

我用glDisableClientState/glEnableClientState(GL_COLOR_ARRAY)解決了色塊的問題;圍繞着繪製的代碼。這是有道理的,因爲每個繪圖調用默認啓用[GL_TEXTURE_2D GL_VERTEX_ARRAY GL_COLOR_ARRAY GL_TEXTURE_COORD_ARRAY],而那些我不需要GL_COLOR_ARRAY。但是,siblin CCLabel節點仍然呈現爲黑色。 – james 2010-10-02 12:49:06

+0

通常,繪製一件東西會影響稍後繪製的東西,這是因爲您沒有重置某個已更改的狀態。我在上面的代碼中沒有看到任何明顯的東西,所以它可能在代碼中的其他地方。你如何畫標籤?另外,這裏有一個有趣的事實 - 這個詞是「blit」而不是「閃電戰」。它是[「Block Image Transfer」](http://en.wikipedia.org/wiki/Bit_blit)的縮寫。 – user1118321 2012-01-02 17:18:33

回答

0

需要用數據填充它之前生成的紋理對象。也就是說,在某處初始化,你需要調用:

int myTexture; // this is class member variable 

glGenTextures(1, &myTexture); // generates an empty texture object 

glBindTexture(GL_TEXTURE_2D, myTexture); // activate the texture 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
// makes sure there are no mipmaps (you only specify level 0, in case 
// the texture is scaled during rendering, that could result in black square) 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
// this allocates the texture, but specifies no data 

後來,繪畫(而不是你的glTexImage2D()調用)時,你需要激活你的紋理和使用glTexSubImage2D()指定它的數據(即沒有按爲紋理分配新的存儲空間)。

glBindTexture(GL_TEXTURE_2D, myTexture); // activate the texture 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 
// this specifies texture data without allocating new storage 

調用glTex(副)Image2D而不第一結合紋理將一個)導致在OpenGL錯誤,或b)覆蓋某些其它質地,其在所述時刻活性 - 可能是兄弟標籤節點的紋理。

希望這有助於:)