2013-03-26 4 views
1

Мне нужно масштабировать объект в OpenGL | ES 2.0. Шейдеры:OpenGL ES 2.0 Масштабирование не работает

private final String vertexShaderCode = 
     "uniform mat4 uMVPMatrix;" + 
     "attribute vec4 vPosition;" + 
     "void main() {" + 
     //the matrix must be included as a modifier of gl_Position 
      " gl_Position = vPosition * uMVPMatrix;" + 
     "}"; 

    private final String fragmentShaderCode = 
     "precision mediump float;" + 
       "uniform vec4 vColor;" + 
       "void main() {" +     
       " gl_FragColor = vColor;" + 
       "}"; 

проекционные:

 Matrix.orthoM(mProjMatrix,0, 
       -1.0f,   // Left 
       1.0f,   // Right 
       -1.0f/ratio, // Bottom 
       1.0f/ratio, // Top 
       0.01f,   // Near 
       10000.0f); 

Рисунок установки:

// Set the camera position (View matrix) 
    Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 

    // Calculate the projection and view transformation 
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); 

Actual визуализации:

float[] scale = {5f,5f,1f}; 
    Matrix.scaleM(scale_matrix, 0, scale[0], scale[1], scale[2]); 

    Matrix.multiplyMM(r_matrix, 0, scale_matrix, 0, mMVPMatrix, 0); 
    // Combine the rotation matrix with the projection and camera view 

    // Apply the projection and view transformation 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, r_matrix, 0); 

И это не будет масштабироваться. Я вижу треугольник, и я могу его повернуть. Но масштабирование не работает.

+0

Умножающиеся матрицы не являются коммутативными. Самый простой способ исправить это - изменить масштаб и умножение mvpMatrix, но я думаю, что это не стандартный способ. 'Matrix.multiplyMM (r_matrix, 0, mMVPMatrix, 0, scale_matrix, 0);' – DanP

+0

Благодарим вас за информацию ... Я попытался заменить их без везения. Как масштабирование выполняется правильно? Можете ли вы указать мне ресурс? –

+0

Правильный заказ worldMatrix = scale * rotate * translate, поэтому ваш объект не будет изуродован. затем после этого вычислите wvpMatrix = worldMatrix * viewMatrix * projectionMatrix для учета камеры и перспективы. то в вершинном шейдере вы должны выполнить gl_Position = uMVPMatrix * vPosition; – DanP

ответ

4

Поскольку векторы-столбцы векторов в OpenGL вы должны изменить порядок умножения матриц в вашем вершинном шейдере:

gl_Position = uMVPMatrix * vPosition;

+0

Спасибо, но я видел и пробовал это уже без успеха. Я видел это в других ответах на OpenGL | ES 2.0 на StackOverflow. –

+1

Это не ясно из фрагментов кода, но scale_matrix также должен быть инициализирован с помощью идентификационной матрицы. Вы также можете использовать Matrix.scaleM() непосредственно на mMVPMatrix, но тогда все, что вы рисуете, будет масштабироваться таким образом. – Daniel

+0

Спасибо, что это сработало, но, пожалуйста, объясните, почему мне нужно установить матрицу шкалы в тождество, когда мне не нужно устанавливать матрицу вращения на личность и дать мне правильную ссылку. Спасибо. –

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