Tuesday, 15 April 2014

passing mvp matix to opengl android -



passing mvp matix to opengl android -

i'm having mpvmatrix (mvpmatrix calculated model * view * projection using matrix.multiply()) , passing shader , it's ok.

now i'd move multiplication cpu gpu (from matrix.multiply shader).

if i'm trying pass model, view , projection martrix separately , multiply them in shader see nothing.

i'm sure matrix not null , have real values (as if multiply them on cpu instead of gpu it's ok), matrix uniform index >= 0 (they found in shader). can wrong?

shaders:

private final string vertexshader = "uniform mat4 u_mmatrix; \n" // Матрица модели + "uniform mat4 u_vmatrix; \n" // Матрица модели + "uniform mat4 u_pmatrix; \n" // Матрица модели + "attribute vec4 a_position; \n" // Информация о положении вершин. + "attribute vec2 a_texcoordinate; \n" // per-vertex texture coordinate info pass in. + "varying vec2 v_texcoordinate; \n" // passed fragment shader. + "void main() \n" // Начало программы вершинного шейдера. + "{ \n" + " v_texcoordinate = a_texcoordinate; \n" + " mat4 mvmatrix = u_mmatrix * u_vmatrix;" + " mat4 mvpmatrix = mvmatrix * u_pmatrix;" + " gl_position = mvpmatrix \n" // gl_position специальные переменные используемые для хранения конечного положения. + " * a_position; \n" // Умножаем вершины на матрицу для получения конечного положения + "} \n"; // в нормированных координатах экрана. private final string fragmentshader = "precision mediump float; \n" // Устанавливаем по умолчанию среднюю точность для переменных. Максимальная точность в фрагментном шейдере не нужна. + "uniform sampler2d u_texture; \n" // input texture. + "varying vec2 v_texcoordinate; \n" // interpolated texture coordinate per fragment. + "void main() \n" // Точка входа для фрагментного шейдера. + "{ \n" + " gl_fragcolor = texture2d(u_texture, v_texcoordinate); \n" // Передаем значения цветов. + "}";

binding:

mmatrixhandle = gles20.glgetuniformlocation(programhandle, "u_mmatrix"); // = 0 vmatrixhandle = gles20.glgetuniformlocation(programhandle, "u_vmatrix"); // = 2 pmatrixhandle = gles20.glgetuniformlocation(programhandle, "u_pmatrix"); // = 3

drawing:

gles20.gluniformmatrix4fv(mmatrixhandle, 1, false, modelmatrix, 0); gles20.gluniformmatrix4fv(vmatrixhandle, 1, false, viewmatrix, 0); gles20.gluniformmatrix4fv(pmatrixhandle, 1, false, projectionmatrix, 0);

actually matrix multiplication order in shader wrong, right order is:

gl_position = u_pmatrix * u_mmatrix * u_vmatrix * a_position;

so right shader source is:

private final string vertexshader = "uniform mat4 u_mmatrix; \n" // Матрица модели + "uniform mat4 u_vmatrix; \n" // Матрица модели + "uniform mat4 u_pmatrix; \n" // Матрица модели + "attribute vec4 a_position; \n" // Информация о положении вершин. + "attribute vec2 a_texcoordinate; \n" // per-vertex texture coordinate info pass in. + "varying vec2 v_texcoordinate; \n" // passed fragment shader. + "void main() \n" // Начало программы вершинного шейдера. + "{ \n" + " v_texcoordinate = a_texcoordinate; \n" + " gl_position = u_pmatrix * u_mmatrix * u_vmatrix \n" // gl_position специальные переменные используемые для хранения конечного положения. + " * a_position; \n" // Умножаем вершины на матрицу для получения конечного положения + "} \n"; // в нормированных координатах экрана.

android opengl-es shader

No comments:

Post a Comment