2012-04-28 3 views
0

Я хотел бы иметь градиент фона в OpenGLAndroid OpenGL-ES градиент фон

Я нашел эти две ссылки, но я не могу воспроизвести его:

OpenGL gradient fill on iPhone looks striped

OpenGL gradient banding on Android

I проверил следующее по первой ссылке:

// 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

будет иметь эффект? Любые идеи/ссылки, как заставить его работать?

=== РЕШЕНИЕ

// 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» (спасибо Nick). Теперь это выглядит следующим образом: 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

Благодарим Вас за реагировать. (Я добавил код в сообщение). Проблема была да. Но теперь экран отверстия просто белый? –

+0

ну, ваши вершины находятся в неправильном порядке. Вы в основном уложили свои вершины в форме «U», но треугольная полоска должна быть в форме «Z». См. Эту страницу: http: //www.matrix44.net/cms/notes/opengl-3d-graphics/understanding-gl_triangle_strip. Первый треугольник против часовой стрелки, затем пошатните вершины. – bitwise

+0

Разница между 1.0f и 0.8f также очень трудно отличить на моем экране, и вы должны, вероятно, использовать более экстремальные значения во время тестирования, например 0.2f, 1.0f - 0.0f, эквивалентно 0 и 1.0f, эквивалентно 255. – bitwise

Смежные вопросы