Android 我所有的矩阵函数都不工作了?OpenGLES2.0

Android 我所有的矩阵函数都不工作了?OpenGLES2.0,android,opengl-es,matrix,opengl-es-2.0,Android,Opengl Es,Matrix,Opengl Es 2.0,我正试图制作一个投影矩阵来缩放屏幕,并制作一个协调系统。出于某种原因,我认为我的矩阵调用都不起作用。。。我使用的3个函数是 Matrix.orthoM(mProjMatrix, 0, 0, 1520, 0, 1000, -1, 10); Matrix.setLookAtM(mVMatrix, 0, 0, 0, 1.0f, 0.0f, 0f, 0f, 0f, 1.0f, 0.0f); Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatri

我正试图制作一个投影矩阵来缩放屏幕,并制作一个协调系统。出于某种原因,我认为我的矩阵调用都不起作用。。。我使用的3个函数是

Matrix.orthoM(mProjMatrix, 0, 0, 1520, 0,  1000, -1, 10);
Matrix.setLookAtM(mVMatrix, 0, 0, 0, 1.0f, 0.0f, 0f, 0f, 0f, 1.0f, 0.0f);
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
他们是在相互抵消吗?有什么问题吗?(完整的渲染类代码在末尾)

我这样做的主要目的是最终得到这样一种情况:当我做一个正方形时,我可以提供坐标,比如
(200100,0)//x,y,z
,它们不仅在-1和1之间

以下是我的完整渲染类:

public class MyRenderer implements Renderer {

private static final String TAG = "MyRenderer";

Square square;

private final float[] mMVPMatrix = new float[16];
private final float[] mProjMatrix = new float[16];
private final float[] mVMatrix = new float[16];
private final float[] mRotationMatrix = new float[16];

private int camWidth,camHeight;

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    GLES20.glClearColor(0.0f, 0.0f, 1.0f, 0.5f);
    camWidth=480;camHeight=320;
    // initialize a square
    square = new Square();
}

@Override
public void onDrawFrame(GL10 nope) {
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

    //set camera position

    GLES20.glViewport(0, 0, camWidth, camHeight);

    Matrix.orthoM(mProjMatrix, 0, 0, 1520, 0,  1000, -10, 999999);
    Matrix.setLookAtM(mVMatrix, 0, 0, 0, 1.0f, 0.0f, 0f, 0f, 0f, 1.0f, 0.0f);
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);


    square.draw(mMVPMatrix);
}

@Override
public void onSurfaceChanged(GL10 nope, int width, int height) {




    GLES20.glViewport(0, 0, camWidth, camHeight);

    Matrix.orthoM(mProjMatrix, 0, 0, 1520, 0,  1000, -10, 999999);
    Matrix.setLookAtM(mVMatrix, 0, 0, 0, 1.0f, 0.0f, 0f, 0f, 0f, 1.0f, 0.0f);
}

public static int loadShader(int type, String shaderCode) {

    // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
    // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
    int shader = GLES20.glCreateShader(type);

    // add the source code to the shader and compile it
    GLES20.glShaderSource(shader, shaderCode);
    GLES20.glCompileShader(shader);

    return shader;
}

 }
我的Square班(不确定是否需要,但为了安全起见:)-

最后,为了让你有一些视觉效果:

这就是我的手机在使用和不使用前面提到的三种metrix功能的情况下的外观,似乎唯一改变宽度和高度的是
GLES20.glViewport(0,0,camWidth,camHeight)


看起来metrix好像什么都没做。

看起来你已经适应了正方形。这里有几个问题:

  • 仅在
    onSurfaceChanged
    中调用
    glViewPort
    ,并且仅使用给定的参数
  • 顶点着色器代码不使用
    uMVPMatrix
    。您可以通过检查
    mMVPMatrixHandle
    的值看到这一点(对于不存在的制服,请参见
    -1
  • 链接程序后,着色器变量的位置是固定的,因此代码可以获取它们一次,而不是每次绘制调用

  • 然后,您需要调整正方形的坐标…

    谢谢!我只是注意到我从未在vertexshader中使用矩阵。。。如果你仔细阅读我的问题,我说我使用glviewport只是因为矩阵不起作用,这是唯一改变屏幕分辨率的东西。你从平移和缩放开始了吗?你对OpenGL | ES 2.0的使用情况如何?你觉得它对你的目的有用吗?@QuintinBalsdon我不是从平移和缩放开始的;当我有空的时候,我还在学习它;它对我的目的很有用,但对于我现在拥有的(2d游戏规划)来说有点太复杂了。不过,我确实想学习OpenGL ES 2.0,因为它在大多数移动设备上都受支持,如果我想制作更复杂的游戏或应用程序,了解它会有所帮助。你有好的OpenGL ES 2.0教程吗?我现在不打算使用3D,只使用2D,而且还将其作为一个侧面滚动条。任何帮助都将不胜感激,谢谢-我正忙着慢慢地弄明白。。。谢天谢地,OpenGL | ES2.0平台也在苹果设备上,所以我们可以在那里做一些计算。我已经计算出了缩放和旋转,我真的进入了顶点和片段着色器的纹理。我现在意识到为什么OpenGL | ES 2.0是更好的平台——在GPU上进行更多的计算。我可能会做一个教程后不久,我得到纹理和输入下来。祝你一切顺利!
    public class Square {
    private final String vertexShaderCode =
        "attribute vec4 vPosition;" +
        "void main() {" +
        "  gl_Position = vPosition;" +
        "}";
    
    private final String fragmentShaderCode = "precision mediump float;"
            + "uniform vec4 vColor;" + "void main() {"
            + "  gl_FragColor = vColor;" + "}";
    
    static final int COORDS_PER_VERTEX = 3;
    
    static float triangleCoords[] = { // in counterclockwise order:
    -0.5f, 0.5f, 0.0f, // top left
            -0.5f, -0.5f, 0.0f, // bottom left
            0.5f, -0.5f, 0.0f, // bottom right
            0.5f, 0.5f, 0.0f
    
    };
    private short drawOrder[] = { 0, 1, 2, 0, 2, 3 };
    private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
    
    private final int vertexStride = COORDS_PER_VERTEX * 4; // bytes per vertex
    
    // red-green-blue-alpha
    float color[] = { 0.63f, 0.76f, 0.22f, 1.0f };
    
    private final int mProgram;
    private int mPositionHandle;
    private int mColorHandle;
    private int mMVPMatrixHandle;
    private FloatBuffer vertexBuffer;
    private ShortBuffer drawListBuffer;
    
    public Square() {
        ByteBuffer bb = ByteBuffer.allocateDirect(
        // # of coords values * 4 bytes per float
                triangleCoords.length * 4);
    
        // use native byte order
        bb.order(ByteOrder.nativeOrder());
    
        // create a floating point buffer from the ByteBuffer
        vertexBuffer = bb.asFloatBuffer();
        // add coordination to FloatBuffer
        vertexBuffer.put(triangleCoords);
        // set the buffer to read first coordinate
        vertexBuffer.position(0);
    
        ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length * 2);
    
        dlb.order(ByteOrder.nativeOrder());
    
        drawListBuffer = dlb.asShortBuffer();
        drawListBuffer.put(drawOrder);
        drawListBuffer.position(0);
    
        int vertexShader = ChizRenderer.loadShader(GLES20.GL_VERTEX_SHADER,
                vertexShaderCode);
        int fragmentShader = ChizRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER,
                fragmentShaderCode);
    
        mProgram = GLES20.glCreateProgram();
        GLES20.glAttachShader(mProgram, vertexShader);
        GLES20.glAttachShader(mProgram, fragmentShader);
        GLES20.glLinkProgram(mProgram);
    
    }
    
    public void draw(float[] mvpMatrix) {
        // Add program to OpenGL ES environment
        GLES20.glUseProgram(mProgram);
    
        // get handle to vertex shader's vPosition member
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
    
        // Enable a handle to the triangle vertices
        GLES20.glEnableVertexAttribArray(mPositionHandle);
    
        // Prepare the triangle coordinate data
        GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
                GLES20.GL_FLOAT, false, vertexStride, vertexBuffer);
    
        // get handle to fragment shader's vColor member
        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
    
        // set color for drawing the triangle
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);
    
        // get handle to shape's transformation matrix
        mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
    
        // apply the projection and view transformation
        GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
    
        // Draw the triangle
        GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length,
                GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
    
        // dispable vertex array
        GLES20.glDisableVertexAttribArray(mPositionHandle);
    
    }
    }