Почему glColorPointer не окрашивает треугольник - и другие странные вещи с открытыми окнами - PullRequest
0 голосов
/ 13 апреля 2011

Я не очень знаком с opengl, но я попытался нарисовать простой треугольник на экране.Каждый уголок окрашен в разные цвета.Что-то вроде базового урока ... Проблема в том, что 1. треугольник просто белый.2. треугольник виден только в эмуляторе, а не в моем HTC Desire.

Мой класс GLView:

public class GLView extends GLSurfaceView implements GLSurfaceView.Renderer {

private FloatBuffer vertexBuff;
private FloatBuffer colorBuff;

public 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;
}

public GLView(Context context) {
    super(context);
    setRenderer(this);
}

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClearColor(0, 0, 0, 0);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);


    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
    gl.glColorPointer(3, GL10.GL_FLOAT, 0, makeFloatBuffer(new float[] { 1, 0, 0,
                                                                         0, 1, 0,
                                                                         0, 0, 1 }));

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);       
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, makeFloatBuffer(new float[] { 0, 0, 0,
                                                                          0, 1, 0,
                                                                          1, 1, 0}));

    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    gl.glViewport(0, 0, width, height);     
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {

}
}

Есть предложения?

1 Ответ

3 голосов
/ 13 апреля 2011

Я предполагаю, что состояние OpenGL может быть несколько неопределенным, поскольку вы не предоставляете матрицы проекции или представления модели.Но я предполагаю, что в основном я не совсем знаком с OpenGL.Как бы то ни было, я заставил ваш код работать, добавив альфа-значения в массив цветов

    gl.glColorPointer(4, GL10.GL_FLOAT, 0, makeFloatBuffer(new float[] { 1, 0, 0, 1,
                                                                         0, 1, 0, 1,
                                                                         0, 0, 1, 1 }));

И предоставив упомянутые матрицы преобразования, можно добиться успеха на устройстве.

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    gl.glViewport(0, 0, width, height);

        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluOrtho2D(gl, -1.0f, 1.0f, -1.0f, 1.0f);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }
...