我已经开始学习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,它仍然会移动。我迷路了
答案 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]范围内