2010-05-15 54 views
1

我正在使用OpenGL ES開發Android系統,我繪製了一些立方體,然後使用glColor4f更改顏色。現在,我想要給立方體帶來更逼真的效果,所以我創建了一個單色8位深度,64x64像素大小的PNG文件。我加載了一個紋理,這裏是我的問題,這是將顏色和紋理結合起來以獲得彩色和紋理立方體到屏幕上的方式嗎?OpenGL,如何將單色紋理設置爲彩色形狀?

我不是基於OpenGL的專家,我想這一點:

上創建:

public void asignBitmap(GL10 gl, Bitmap bitmap) 
{ 
    int[] textures = new int[1]; 
    gl.glGenTextures(1, textures, 0); 

    mTexture = textures[0]; 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexture); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE); 

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_ALPHA, bitmap, 0); 

    ByteBuffer tbb = ByteBuffer.allocateDirect(texCoords.length * 4); 
    tbb.order(ByteOrder.nativeOrder()); 
    mTexBuffer = tbb.asFloatBuffer(); 
    for (int i = 0; i < 48; i++) mTexBuffer.put(texCoords[i]); 
    mTexBuffer.position(0); 
} 

而且OnDraw中:

public void draw(GL10 gl, int alphawires) { 
    gl.glColor4f(1.0f, 0.0f, 0.0f, 0.5f); //RED 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexture); 
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTexBuffer); 

    //Set the face rotation 
    gl.glFrontFace(GL10.GL_CW); 

    //Point to our buffers 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 

    //Enable the vertex and color state 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 

    //Draw the vertices as triangles, based on the Index Buffer information 
    gl.glDrawElements(GL10.GL_TRIANGLES, 36, GL10.GL_UNSIGNED_BYTE, indexBuffer); 

    //Disable the client state before leaving 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 

    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    gl.glDisable(GL10.GL_BLEND); 
    gl.glDisable(GL10.GL_TEXTURE_2D); 
} 

我甚至不知道我是否有使用混合選項,因爲我不需要透明度,但它是一個加號:)

回答

4

當您設置紋理環境模式,請使用GL_MODULATE而不是GL_REPLACE。 MODULATE將插值顏色與採樣紋理顏色相乘,其中REPLACE完全丟棄插值顏色,並將其替換爲採樣紋理顏色。