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