translateM使对象从视口消失

时间:2014-02-22 21:11:59

标签: android matrix opengl-es opengl-es-2.0

我已经开始学习OpenGL ES 2.0了。我目前正在尝试通过在onDrawFrame()方法上使用translateM方法使对象动态化。不幸的是,当我这样做时,对象会短暂出现然后消失。我不确定发生了什么。如果我在onSurfaceChanged()中使用相同的代码进行翻译,则可以正常工作。这是我的代码(没有x整数应该在x轴上移动它,所以我知道它不会移动。但即使删除动态int也会消失):

  package com.background.gl.glcirclebackgroundanimation;

import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT;
import static android.opengl.GLES20.glClear;
import static android.opengl.GLES20.glClearColor;
import static android.opengl.GLES20.glViewport;
import static android.opengl.Matrix.multiplyMM;
import static android.opengl.Matrix.setIdentityM;
import static android.opengl.Matrix.translateM;

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

import android.content.Context;
import android.opengl.GLSurfaceView.Renderer;

import com.background.gl.helper.ColorShaderProgram;
import com.background.gl.helper.TextureShaderProgram;
import com.background.gl.objects.GLCircle;
import com.background.gl.objects.Mallet;
import com.background.gl.objects.Table;
import com.background.gl.util.MatrixHelper;
import com.background.gl.util.TextureHelper;

public class CircleDynamicBackgroundRenderer implements Renderer {
private final Context context;

    private final float[] projectionMatrix = new float[16];
    private final float[] modelMatrix = new float[16];

    private Table table;
    private Mallet mallet;
    private GLCircle circle;
    float x = 0.01f;

    private TextureShaderProgram textureProgram;
    private ColorShaderProgram colorProgram;

    private int texture;


    public CircleDynamicBackgroundRenderer(Context context) {
        this.context = context;
    }

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

        MatrixHelper.perspectiveM(projectionMatrix, 45, (float) width
                / (float) height, 1f, 10f);
        setIdentityM(modelMatrix, 0);

    }

    @Override
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
        glClearColor(0.0f, 0.0f, 1.0f, 0.0f);

        table = new Table();
        mallet = new Mallet();
        circle = new GLCircle();

        textureProgram = new TextureShaderProgram(context);
        colorProgram = new ColorShaderProgram(context);

        texture = TextureHelper.loadTexture(context, R.drawable.air_hockey_surface);
        //texture2 = TextureHelper.loadTexture(context, R.drawable.air_hockey_surface_2);
    }

    @Override
    public void onDrawFrame(GL10 glUnused) {
        //Clear the rendering surface
        glClear(GL_COLOR_BUFFER_BIT);
        //x+=0.01f;
        translateM(modelMatrix, 0, 0f, 0f, -10f);
        final float[] temp = new float[16];
        multiplyMM(temp, 0, projectionMatrix, 0, modelMatrix, 0);
        System.arraycopy(temp, 0, projectionMatrix, 0, temp.length);
        textureProgram.useProgram();
        //Pass data into our shaders(u_matrix) and enable/bind the texture
        //textureProgram.setUniforms2(projectionMatrix, texture, texture2);
        textureProgram.setUniforms(projectionMatrix, texture);
        //Bind our [vertex array] data to our shaders(attribute data)
        circle.bindData(textureProgram);
        //Draw it

        circle.draw();
        /*
        // Draw the mallets.
        colorProgram.useProgram();
        colorProgram.setUniforms(projectionMatrix);
        mallet.bindData(colorProgram);
        mallet.draw();*/
    }

}

我已经搜索了多个解决方案,但我无法让它们中的任何一个工作。我真的可以使用一些帮助。 :)

编辑:是吗,因为我将矩阵相乘,每帧自动将其移回-10?因为这可以解释我的问题。

Edit2:所以我把它从-10f更改为-0.01f,它可以工作。但是,当我为x轴尝试相同时,它只是保持不变。这是为什么?是因为投影矩阵如何将所有值除以w,这就是为什么z会改变,而不是x或y?我怎样才能在x轴上左右移动呢?

Edit3:我的宽度和高度是768,1184。那么,如果我在x上翻译0.1f,为什么会有很大的不同?宽度和高度是768和1184,还是1和1?

Edit4:好的,现在即使我从onDrawFrame中删除translateM,它仍然会移动。我迷路了

2 个答案:

答案 0 :(得分:0)

此行错误

System.arraycopy(temp, 0, projectionMatrix, 0, temp.length);

我不知道你在编写它时的想法,所以我无法解释你是如何失败的,你可能只会在窗口宽高比改变时覆盖投影矩阵。剩下的时间这个矩阵必须是常数,你可能不会写它。在着色器中,您需要传递投影和平​​移矩阵的乘积。但是当你乘以它时,将结果存储在temp中并将temp传递给着色器。

答案 1 :(得分:0)

尝试

translateM(modelMatrix, 0, 0.5f, 0f, -10f);

X和Y轴必须在[-1,1]范围内