OpenGL-ES Включение ортографического режима 2D - PullRequest
2 голосов
/ 05 июля 2011

Я пытаюсь не иметь разницы в размерах от спрайтов, если вы увеличиваете z до больших расстояний.
однако мне не повезло, оно все равно становится меньше:

|| EDIT ||

Теперь у меня есть эти методы

 public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    float _width = 320f;
    float _height = 480f;
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glOrthof(0, _width, 0, _height, 1, 100); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity();  

    // Load textures ,
    gl.glEnable(GL10.GL_TEXTURE_2D);
    for (int a = 0; a < squares.length; a++) {
        squares[a].loadGLTexture(gl, context);
    }
}  

.

public void onDrawFrame(GL10 gl) {
    //Clear Screen And Depth Buffer
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);    
    gl.glLoadIdentity();                    //Reset The Current Modelview Matrix
    gl.glTranslatef(.0f, 1.0f, locZ);
    squares[0].draw(gl);
    gl.glLoadIdentity();
    gl.glTranslatef(0.5f, 0.f, locZ);
    squares[1].draw(gl);        
    gl.glLoadIdentity();
    gl.glTranslatef(-0.5f, -0.5f, locZ);
    squares[2].draw(gl);
    gl.glLoadIdentity();
    gl.glTranslatef(-0.5f, -0.5f, locZ);
    squares[3].draw(gl);


    //change zvalues
    if(locZ >= 4.0f){
        speedZ *= -1.0f;
        locZ = 3.9f;
    }
    else if(locZ <= -4.0){
        speedZ *= -1.0f;
        locZ = -3.9f;
    }

    locZ += speedZ;

}  

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

Ответы [ 3 ]

5 голосов
/ 05 июля 2011

У вас плохие параметры glOrtho:

gl.glOrthof(0, width, 0, height, 0.01f, 100.0f);

Или

gl.glOrthof(0, width, height, 0, 0.01f, 100.0f);

РЕДАКТИРОВАТЬ : забудьте сбросить матрицу - glLoadIdentity .

public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);    
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    /* SET NEW PROJECTION HERE: ortho or perspective */
    gl.glOrthof(0, _width, 0, _height, 0.001f, 100); 

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
    /* SET NEW MODELVIEW MATRIX( space transformation ) HERE and DRAW YOUR STUFF */

    //change zvalues
    if(locZ >= 99.0f){
        speedZ *= -1.0f;
        locZ = 99.0f;
    }
    else if(locZ <= 1.0){
        speedZ *= -1.0f;
        locZ = 1.0f;
    }

}

Эти шаги необходимо выполнить перед рендерингом 2D, соответственно. переход от 3D-проекции к 2D-проекции, а не при создании текстуры или какого-либо объекта. Не знаю много о public void onSurfaceCreated , но это не похоже на цикл рендеринга.

0 голосов
/ 12 июля 2011

здесь вы можете использовать два метода; один для переключения в ортоскопический вид, в котором один openGLUnit = один пиксель экрана для рисования в 2d на экране. Затем следующий метод переключает его обратно на 3D-рисунок. Сделайте 2d рисунок после рендеринга 3d и сначала вызовите метод switchToOrtho, а когда закончите, вызовите метод switchBackToFrustum.

public void switchToOrtho() {
    glDisable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glOrthof(0, self.view.bounds.size.width, 0, self.view.bounds.size.height, -5, 1);           glMatrixMode(GL_MODELVIEW);    glLoadIdentity();
}

public void switchBackToFrustum() {
    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
}
0 голосов
/ 05 июля 2011

Таким образом, источник находится в середине вашего GLSurfaceView, неплохая идея сделать что-то вроде:

gl.glOrthof(-width/2, width/2, -height/2, height/2, 0.1f, 100.0f);
...