2009-06-13 45 views
0

我使用OpenGL ES在我的iPhone遊戲中繪製東西。有時我喜歡更改我正在繪製的紋理的alpha值爲。這是我使用的(工作)代碼。此代碼示例中的什麼,如果有的話,是不必要的?謝謝!我在做什麼,這是不必要的? (iPhone,OpenGL ES)

// draw texture with alpha "myAlpha" 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_COMBINE); 
    glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB,GL_MODULATE); 
    glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB,GL_PRIMARY_COLOR); 
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB,GL_SRC_COLOR); 
    glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB,GL_TEXTURE); 
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB,GL_SRC_COLOR); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    glEnable(GL_BLEND); 
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
    glColor4f(myAlpha, myAlpha, myAlpha, myAlpha); 

    glPushMatrix(); 
    glTranslatef(xLoc, yLoc, 0); 
    [MyTexture drawAtPoint:CGPointZero]; 
    glPopMatrix(); 

    glColor4f(1.0, 1.0, 1.0, 1.0); 

編輯:

上面代碼示例是用於繪製瓦特/ 改性的α-值(所以我可以淡入事物和出)。當我只想繪製不用修改alpha值的時候,我會使用上面示例的最後5行,而沒有最後一次調用glColor4f。

回答

2

我畫的樣子:

glBindTexture(GL_TEXTURE_2D, tex->name); // bind to the name 
glVertexPointer(3, GL_FLOAT, 0, vertices); // verices is the alignment in triangles 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); // coordinates describes the rectangle 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); //draw 

很難知道什麼,你可以不知道你想要做什麼刪除。

編輯:

除非你在某個時候禁用交融,你可以擺脫所有共混物的要求:

glEnable(GL_BLEND); 
glBlendFunc... 

,把它們放進如果您在GL狀態的初始化需要設置一次。如果您需要啓用和禁用,則最好爲所有需要繪製混合的狀態設置一次狀態,然後再次爲未混合狀態設置狀態(一次)。

OpenGL是一個state machine所以這個一般的想法適用於你需要改變GL狀態的任何地方(如使用glTexEnvf設置紋理環境)。

關於狀態機:

當前的狀態,通過該系統的過去 狀態決定。因此,它可以被稱爲記錄關於過去的 的信息,即它反映了從系統開始到當前時刻的輸入 的變化。轉換指示 狀態變化,並且由 條件描述,該條件將需要被滿足以啓用轉換。

+0

嘿,尼克,我只是想繪製一個修改後的alpha值的紋理(所以我可以淡入淡出紋理)。我不確定是否所有代碼行都是必需的。 – MrDatabase 2009-06-17 04:11:15

2

您有調用來配置紋理環境和幀緩衝混合,這是完全不同的功能。在繪圖之前,您還要調用glTexEnvf(GL_TEXTURE_ENV,GL_OPERAND1_RGB,x)兩次,因此只有第二次調用很重要。

如果您真正想要做的只是將原色與紋理顏色相乘,那麼它就像glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)一樣簡單。對glTexEnv的其餘調用是不必要的。