Выпуск рисования треугольников с базовым VBO в OpenGL ES для Android 2.1 - PullRequest
0 голосов
/ 06 февраля 2011

Я начинаю работу над игрой для Android и изучаю OpenGL ES. Я немного использовал OpenGL, хотя это было довольно давно. В последнее время я в основном использовал DirectX с C ++, поэтому я достаточно хорошо понимаю концепции графического API.

Когда, играя с API самостоятельно, я не смог получить ожидаемые результаты, я обратился к этому учебнику, который я нашел в Интернете, который казался довольно всеобъемлющим, и хотя я легко его понял и следовал учебник довольно строго, я все еще не могу заставить экран отображать простой квадрат (в настоящее время не используется ничего, кроме массива вершин без цвета).

Ниже приведен код для моего класса рендерера, на который я смотрел в течение некоторого времени, и я начинаю немного сходить с ума от своей неспособности найти свою ошибку. Я сделал гораздо более сложные вещи с помощью графических API (как в DirectX, так и в OpenGL), поэтому я нахожу это смущающим, и мне просто нужно, чтобы кто-то указал на мой, очевидно, очевидный недосмотр.

Заранее спасибо!

public class GameRenderer implements Renderer {

private float red, green, blue = 0.0f;

private final float vertices[] = {
        0.5f, -0.5f, 0.0f,  // 0, Bottom Right
        0.5f,  0.5f, 0.0f,  // 1, Top Right
        -0.5f,  0.5f, 0.0f, // 2, Top Left
        -0.5f, -0.5f, 0.0f, // 3, Bottom Left
}; 

private final short indices[] = {
        0, 1, 2, 0, 2, 3
};


private final float colours[] = {
        1.0f, 1.0f, 1.0f, 
        0.5f, 0.5f, 0.5f, 
        0.5f, 0.5f, 0.5f, 
        0.0f, 0.0f, 0.0f
}; 

FloatBuffer vFBuff;
FloatBuffer cFBuff;

ShortBuffer iSBuff;

public GameRenderer(){
    super();
}

@Override
public void onDrawFrame(GL10 gl) {

    gl.glClearColor(red, green, blue, 0.5f);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glLoadIdentity();
    gl.glScalef(2.0f, 2.0f, 0.0f);
    gl.glTranslatef(0.0f, 0.0f, -4f);

    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, iSBuff);
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    // TODO Auto-generated method stub
    // set viewport
    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, 0.0f, 100.0f);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
}

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

    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glClearDepthf(1.0f);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

    ByteBuffer vBBuff = ByteBuffer.allocateDirect(vertices.length * 4);
    ByteBuffer cBBuff = ByteBuffer.allocateDirect(colours.length * 4);
    ByteBuffer iBBuff = ByteBuffer.allocateDirect(indices.length * 2);

    vFBuff = vBBuff.asFloatBuffer();
    vFBuff.put(vertices);
    vFBuff.position(0);

    cFBuff = cBBuff.asFloatBuffer();
    cFBuff.put(colours);
    cFBuff.position(0);

    iSBuff = iBBuff.asShortBuffer();
    iSBuff.put(indices);
    iSBuff.position(0);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vFBuff);

    gl.glFrontFace(GL10.GL_CCW);
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glCullFace(GL10.GL_BACK);
}

public void setColour(float r, float g, float b) {
    red = r;
    blue = b;
    green = g;
}

1 Ответ

0 голосов
/ 06 февраля 2011
GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, 0.0f, 100.0f);

Не устанавливайте zNear в ноль :

Если (r = zFar / zNear) примерно log2(r) битов точности буфера глубины теряются.Поскольку r приближается к бесконечности, когда zNear приближается к 0, zNear никогда не следует устанавливать на 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...