2013-07-06 5 views
1

Следуя за android OpenGL ES tutorial, я могу нарисовать квадрат к экрану.Как рисовать два квадрата рядом?

Я хотел бы нарисовать второй квадрат на экране, рядом с начальной площади, так что я сделал следующим образом (только дважды):

Matrix.setLookAtM(mViewMatrix, 0, 0, 0, 3.0f, 0, 0, 0, 0, 1.0f, 0); 
float[] modelMatrix = new float[16]; 
Matrix.setIdentityM(modelMatrix, 0); 
Matrix.translateM(modelMatrix, 0, 2, 2, 0); //arbitrarily picking 2, the correctly drawn square uses 0's. 
Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, modelMatrix, 0) 
Matrix.multiplyMM(mMVPMatrix, 0, mMVPMatrix, 0, mProjMatrix, 0); 

, а затем продолжить рисовать его (link to google's code)

а именно:

private final String vertexShaderCode = 
"uniform mat4 uMVPMatrix;" + 
"attribute vec4 vPosition;" + 
"void main() {" + 
" gl_Position = vPosition * uMVPMatrix;" + 
"}"; 

и

GLES20.glViewport(0, 0, width, height); 
float ratio = (float) width/height; 
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); 

Однако мой второй квадрат перекос так:

enter image description here

Почему это так? Как я могу просто нарисовать квадрат рядом с этим, не изменяя начальные координаты?

Мое подозрение, что это имеет какое-то отношение к Matrix.setLookAtM(), и что проекция преобразует квадрат. Я не уверен, как это сделать.

+0

Второй «multiplyMM» выглядит неправильно. Кодирование умножения 'VMP', где должно быть' PVM'; переключите аргументы. –

+0

@StefanHanke Я переключил второй аргумент на: 'Matrix.multiplyMM (mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);' но теперь я получаю более крупную версию того же самого. Есть идеи? Это аргументы, которые вы хотели переключить? – cnorris

+0

Да. Ну, тогда попробуйте добрые старые printf-отладки - MVP-матрицу для шейдера, какие данные действительно отправлены и т. Д. Включен ли Z-буфер? –

ответ

0

This thread solved my issue.

В затенении, я умножая

vPosition * uMVPMatrix;" 

но умножения должны следовать заказу:

transformed vertex = projMatrix * viewMatrix * modelMatrix * input vertex 

к сведению, что вход вершина приходит после того, как проекции, вид и модельной матрицы (MVPMatrix)

Так переключение на

vPosition * uMVPMatrix; 

и

float[] pvMatrix = new float[16]; 
//projection * view 
Matrix.multiplyMM(pvMatrix, 0, mProjMatrix, 0, mViewMatrix, 0); 
float[] mModelMatrix = new float[16]; 
Matrix.setIdentityM(mModelMatrix, 0); 
Matrix.scaleM(mModelMatrix,0, mScale[0],mScale[1], 1.0f); 
Matrix.translateM(mModelMatrix, 0, mPosition[0],mPosition[1], mPosition[2]); 
//projection * view * model 
Matrix.multiplyMM(mMVPMatrix,0, pvMatrix, 0, mModelMatrix, 0); 

ли трюк!

+0

Рад слышать, как вы решили проблему! –

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