2015-06-29 6 views
0

У меня есть этот код, который должен перенести мой круг (квадрат):Не переводить хорошо - Android - OpenGL ES 2

float[] scratch = new float[16]; 

float[] move = new float[16]; 
Matrix.setIdentityM(move, 0); 
Matrix.translateM(move, 0, 100, 100, 0); 

Matrix.multiplyMM(scratch, 0, projectionMatrix, 0, move, 0); 

mCircle.draw(scratch); 

projectionMatrix является камера:

Matrix.orthoM(projectionMatrix, 0, 0, width, height, 0, -1f, 1f); 

Но когда я исполняю код Я понимаю это: Image

Я следил за кодом от Android Developer.

precision highp float; 

uniform float uRadius; 
vec2 center = vec2(uRadius, uRadius); 
vec2 coord = vec2(gl_FragCoord.x, 1080. - gl_FragCoord.y); 
vec2 position = coord - center; 
uniform vec4 uColor; 

void main() 
{ 
    if (length(position) > uRadius) { 
    discard; 
    } 

    gl_FragColor = uColor; 
} 
-------------------------------- 
uniform mat4 uMatrix; 

attribute vec4 aPosition; 

void main() 
{ 
    gl_Position = uMatrix * aPosition; 
} 

Мой главный цикл:

public void onDrawFrame(GL10 unused) { 
    // Draw background color 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 

    float[] scratch = new float[16]; 

    float[] move = new float[16]; 
    Matrix.setIdentityM(move, 0); 
    Matrix.translateM(move, 0, 50, 50, 0); 

    Matrix.multiplyMM(scratch, 0, projectionMatrix, 0, move, 0); 

    mCircle.draw(scratch); 
} 

И круг ничья функции является:

public void draw(float[] projectionMatrix) { 
    GLES20.glUseProgram(mProgram); 

    // get handle to vertex shader's vPosition member 
    int mPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition"); 

    // 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 
    int mColorHandle = GLES20.glGetUniformLocation(mProgram, "uColor"); 

    // Set color for drawing the triangle 
    GLES20.glUniform4fv(mColorHandle, 1, mColor, 0); 

    int radiusHandle = GLES20.glGetUniformLocation(mProgram, "uRadius"); 
    MyGLRenderer.checkGlError("glGetUniformLocation"); 
    GLES20.glUniform1f(radiusHandle, mRadius); 

    // get handle to shape's transformation matrix 
    int mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMatrix"); 
    MyGLRenderer.checkGlError("glGetUniformLocation"); 

    // Apply the projection and view transformation 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, projectionMatrix, 0); 
    MyGLRenderer.checkGlError("glUniformMatrix4fv"); 

    // Draw the square 
    GLES20.glDrawElements(
      GLES20.GL_TRIANGLES, drawOrder.length, 
      GLES20.GL_UNSIGNED_SHORT, drawListBuffer); 

    // Disable vertex array 
    GLES20.glDisableVertexAttribArray(mPositionHandle); 
} 
+0

Я думаю, что вы не видите изображение, которое вы выбрали. Попробуйте уменьшить смещение, чтобы сказать '50', т. Е. попробуйте 'Matrix.translateM (move, 0, 50, 50, 0); ' – Nishant

+0

Да! Что это, я перемещаю область просмотра, а не круг. Но как перемещать круг? – 1742557334

+0

Я думаю, что вы не перемещаете область просмотра. Добавьте шейдеры и создайте код цикла, и я объясню. – Nishant

ответ

0

После нескольких часов, я наконец-то нашел логическую ошибку в пиксельный шейдер: центр окружности остался прежним, теперь я добавил еще 2 формы для смещения/позиции, и он работает.

Смежные вопросы