Как реализовать glColorPointer в классе AndEngine Rectangle - PullRequest
3 голосов
/ 27 ноября 2011

Кто-нибудь поделится примером того, как реализовать GradienRectangle, который бы имел разные цвета для каждой вершины?

Я пытался вызвать glColorPointer из GL10, передавая плавающий буфер, и GL11, используя подобный вершинам метод selectOnHardware, но обаметоды не помогли мне ...

На форуме AndEngine я нашел этот код , но он не работает, однако, возможно, он поможет кому-нибудь найти лучшее решение.

Ответы [ 2 ]

3 голосов
/ 30 ноября 2011

этот пример не работает для вас, потому что автор не показал фрагмент кода, отвечающий за установку вершин.

Вот мой пример (он длинный, но это opengl ...) ПРИМЕЧАНИЕ. Не забудьте правильно настроить окно просмотра.

public static void drawGradientRectangle(GL10 gl, float centerX, float centerY,
            float width, float height) {
        gl.glPushMatrix();
        gl.glDisable(GL10.GL_TEXTURE_2D);
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); //just in case if you have not done that before
        gl.glFrontFace(GL10.GL_CCW); //Set the face

        gl.glTranslatef(centerX, centerY, 0);
        if (width != 1 || height != 1) {
            gl.glScalef(width, height, 1);
        }
        gl.glVertexPointer(2, GL10.GL_FLOAT, 0, GLDrawConstants.vertexBuffer0_5);
        gl.glColorPointer(4, GL10.GL_FLOAT, 0, GLDrawConstants.gradOrangeWhiteBuffer);

        // Draw the vertices as triangle strip
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glPopMatrix();
    }

Класс GLDrawConstants:

public class GLDrawConstants {

    public static final FloatBuffer gradOrangeWhiteBuffer;
    public static final FloatBuffer vertexBuffer0_5;

private static final float vertices0_5[] = { 
        -0.5f, -0.5f,// Bottom Left
        0.5f, -0.5f,// Bottom right
        -0.5f, 0.5f,// Top Left
        0.5f, 0.5f// Top Right
    };

private static final float gradOrangeWhiteColor[] = {
        255/255f, 239/255f, 196/255f, 0f, // Bottom Left 
        255/255f, 239/255f, 196/255f, 0f, // Bottom right
        250/255f, 200/255f, 62/255f, 0.3f, // Top Left
        250/255f, 200/255f, 62/255f, 0.3f  // Top Right
    };

static {
        gradOrangeWhiteBuffer = WDUtils.floatBuffer(gradOrangeWhiteColor);
        vertexBuffer0_5 = WDUtils.floatBuffer(vertices0_5);
}

}

WDUtils класс:

public class WDUtils {
    /**
     * Make a direct NIO FloatBuffer from an array of floats
     * 
     * @param arr
     *            The array
     * @return The newly created FloatBuffer
     */
    public static final FloatBuffer floatBuffer(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;
    }
}

example on my phone

0 голосов
/ 05 мая 2013

Или вы используете (или backport) класс Gradient из ветви GLES2-AnchorCenter, который дает вам супер простой в использовании и многофункциональный API, не беспокоясь об OpenGL.=)

...