Если я использую glTranslatex вместо glTranslatef, я ничего не вижу! - PullRequest
0 голосов
/ 25 марта 2011

Я пишу небольшую программу в OpenGL ES для Android (API 3), которая показывает черный треугольник на черном экране. Но каково было мое изумление, когда я заметил, что изменение вызова glTranslatef на glTranslatex (в методе onDrawFrame ()) сделало мой треугольник невидимым! Может ли кто-нибудь объяснить мне, что происходит.

Вот мой код для рендерера

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLU;

public class TheRenderer implements Renderer {

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

    gl.glTranslatef(0, 0, -6); // Here my problem
    triangle.draw(gl);
}

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

    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluPerspective(gl, 60.0f, (float) width / (float) height, 1, 10);
}

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

}

private GLSimple2DTriangle triangle = new GLSimple2DTriangle();
}

Вот код для треугольника

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;

import javax.microedition.khronos.opengles.GL10;

public class GLSimple2DTriangle {

    public GLSimple2DTriangle(){
        buildVerticesBuffer();
    }

    public void draw(GL10 gl){
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glVertexPointer(COORDS_PER_VERTEX, GL10.GL_SHORT, 0, verticesBuffer);
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, VERTICES_NUMBER);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }

    private void buildVerticesBuffer(){
        final short vertices [] = {
                +0, +1,
                +1, -1,
                -1, -1
        };

        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * SHORTS_SIZE_BYTES);
        byteBuffer.order(ByteOrder.nativeOrder());
        verticesBuffer = byteBuffer.asShortBuffer();
        verticesBuffer.put(vertices);
        verticesBuffer.rewind();
    }

    private ShortBuffer verticesBuffer;
    private static final byte SHORTS_SIZE_BYTES = 2;
    private static final byte COORDS_PER_VERTEX = 2;
    private static final byte VERTICES_NUMBER = 3;
}

Привет

1 Ответ

3 голосов
/ 25 марта 2011

glTranslatex - версия с фиксированной запятой.OpenGL-ES использует формат с фиксированной точкой 16,16, поэтому целочисленные координаты должны быть сдвинуты на 16 бит влево, чтобы получить тот же результат.Тогда ваш переводческий вызов станет glTranslatex(0, 0, -6 << 16).Прямо сейчас, без смещения, значение -6 фактически равно -0,00009 (-6 / 65536), поэтому ваш объект обрезается ближней плоскостью.

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