2012-04-28 89 views
0

我想有在OpenGL的Android的OpenGL-ES漸變背景

漸變背景,我發現這兩個環節,但我不能複製:

OpenGL gradient fill on iPhone looks striped

OpenGL gradient banding on Android

我嘗試以下第一個鏈接:

// Begin Render 
    //IntBuffer redBits = null, greenBits = null, blueBits = null; 
    //gl.glGetIntegerv (GL10.GL_RED_BITS, redBits); // ==> 8 
    //gl.glGetIntegerv (GL10.GL_GREEN_BITS, greenBits); // ==> 8 
    //gl.glGetIntegerv (GL10.GL_BLUE_BITS, blueBits); // ==> 8 

    gl.glDisable(GL10.GL_BLEND); 
    gl.glDisable(GL10.GL_DITHER); 
    gl.glDisable(GL10.GL_FOG); 
    gl.glDisable(GL10.GL_LIGHTING); 
    gl.glDisable(GL10.GL_TEXTURE_2D); 
    gl.glShadeModel(GL10.GL_SMOOTH); 

    float[] vertices = { 
     0, 0, 
     320, 0, 
     0, 480, 
     320, 480, 
    }; 
    FloatBuffer vertsBuffer = makeFloatBuffer(vertices); 

    int[] colors = { 
    255, 255, 255, 255, 
    255, 255, 255, 255, 
    200, 200, 200, 255, 
    200, 200, 200, 255, 
    }; 

    IntBuffer colorBuffer = makeIntBuffer(colors); 

    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertsBuffer); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, colorBuffer); 
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 
    // End Render 




protected static FloatBuffer makeFloatBuffer(float[] arr) { 
    ByteBuffer bb = ByteBuffer.allocateDirect(arr.length*4); 
    bb.order(ByteOrder.nativeOrder()); 
    FloatBuffer fb = bb.asFloatBuffer(); 
    fb.put(arr); 
    fb.position(0); 
    return fb; 
} 

protected static IntBuffer makeIntBuffer(int[] arr) { 
    ByteBuffer bb = ByteBuffer.allocateDirect(arr.length*4); 
    bb.order(ByteOrder.nativeOrder()); 
    IntBuffer ib = bb.asIntBuffer(); 
    ib.put(arr); 
    ib.position(0); 
    return ib; 
} 

但它只是在右上角顯示一個矩形。但我不知道是否

glGetIntegerv

就會有效果?任何想法/鏈接如何使它運行?

=== SOLUTION

// set orthographic perspective 
    setOrtho2D(activity, gl); 

    gl.glDisable(GL10.GL_BLEND); 
    //gl.glDisable(GL10.GL_DITHER); 
    gl.glDisable(GL10.GL_FOG); 
    gl.glDisable(GL10.GL_LIGHTING); 
    gl.glDisable(GL10.GL_TEXTURE_2D); 
    gl.glShadeModel(GL10.GL_SMOOTH); 

    float[] vertices = { 
      0, 0, 
      _winWidth, 0, 
      0, _winHeight, 
      _winWidth, _winHeight 
     }; 

    FloatBuffer vertsBuffer = makeFloatBuffer(vertices); 

    float[] colors = { 
    1.0f, 1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 1.0f, 
    0.2f, 0.2f, 0.2f, 1.0f, 
    0.2f, 0.2f, 0.2f, 1.0f 
    }; 

    FloatBuffer colorBuffer = makeFloatBuffer(colors); 

    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertsBuffer); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer); 
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 

我忘了評論的角度線一次。我還將頂點順序從「U」形改爲「Z」形(謝謝尼克)。 現在看起來是這樣的:android_gradient_background

回答

1

這是一個問題:

int[] colors; 
.... 
gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, colorBuffer); 

您使用簽名的四字節整數爲你的顏色通道,然後告訴OpenGL的,他們是無符號的一個字節的整數。您應該使用充滿無符號字節的緩衝區。

它會更容易不過,只使用浮點數來代替:

float[] colors = { 
    1.0f, 1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 1.0f, 
    0.5f, 0.5f, 0.5f, 1.0f, 
    0.5f, 0.5f, 0.5f, 1.0f, 
    }; 

float vertices[] = { 
    0, 0, 
    800, 0, 
    0, 480, 
    480, 800, 
    }; 

FloatBuffer colorBuffer = makeFloatBuffer(colors); 

gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer); 
+0

謝謝你的迴應。 (我在帖子中添加了代碼)有一個問題是的。但是現在洞屏幕只是白色的? – 2012-04-28 14:15:26

+0

好吧,你的頂點的順序是錯誤的。您基本上已將頂點排成「U」形,但三角形條應呈「Z」形。看到這個頁面:http://www.matrix44.net/cms/notes/opengl-3d-graphics/understanding-gl_triangle_strip - 第一個三角形是逆時針,然後錯開頂點。 – bitwise 2012-04-28 20:56:53

+0

1.0f和0.8f之間的區別在我的屏幕上也很難區分,您應該在測試時使用更多的極端值,例如0.2f,1.0f - 0.0f等於0,1.0f相當於255. – bitwise 2012-04-28 21:05:34