Как реализовать простой 2D-перевод на OpenGL ES 2.0 с помощью OpenTK для Android

Я пытаюсь добавить перевод к простому примеру рисования треугольника с помощью OpenGL ES 2.0 для Android. Я создал матрицу перевода с нулевым переводом во всех направлениях, которая должна быть матрицей идентичности. Когда я удаляю умножение из вершинного шейдера, треугольник отображается нормально. Однако, когда я пытаюсь добавить некоторое преобразование (даже идентичность), ничего не отображается. Я думаю, что это что-то об отправке матричных данных в шейдер. GL.UniformMatrix 4 принимает только float в качестве атрибутов, и я не могу преобразовать Matrix4 в массив float. В конце концов я отчаянно создал массив с плавающей запятой для матрицы идентичности и передал его с помощью GL.UniformMAtrix4, однако снова ничего не отображается.

Помогите, пожалуйста, у кого есть опыт.

        Matrix4 uvMat = Matrix4.CreateTranslation(0.0f,0.0f,0.0f);

        // Vertex and fragment shaders
        string vertexShaderSrc =  "attribute vec4 vPosition;    \n" + 
            "uniform mat4 uvMat;                    \n" +
            "void main()                  \n" +
            "{                            \n" +
            "   gl_Position = uvMat*vPosition;  \n" +
            "}                            \n";

        string fragmentShaderSrc = "precision mediump float;\n" +
            "void main()                                  \n" +
            "{                                            \n" +
            "  gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0);  \n" +
            "}                                            \n";

        int vertexShader = LoadShader (All.VertexShader, vertexShaderSrc );
        int fragmentShader = LoadShader (All.FragmentShader, fragmentShaderSrc );
        program = GL.CreateProgram();
        if (program == 0)
            throw new InvalidOperationException ("Unable to create program");

        GL.AttachShader (program, vertexShader);
        GL.AttachShader (program, fragmentShader);

        GL.BindAttribLocation (program, 0, "vPosition");
        GL.LinkProgram (program);

        float[] matTrans = new float[] {1,0,0,0,
                              0,1,0,0,
                              0,0,1,0,
            0,0,0,1};

        int uniMatLoc = GL.GetUniformLocation (program, "uvMat");
        Console.WriteLine (uniMatLoc.ToString());
        GL.UniformMatrix4 (uniMatLoc, 16, false, matTrans);

person user3847160    schedule 17.07.2014    source источник


Ответы (1)


Второй аргумент UniformMatrix4 — это количество матриц, а не количество элементов в матрице. Таким образом, вызов должен быть:

GL.UniformMatrix4(uniMatLoc, 1, false, matTrans);
person Reto Koradi    schedule 17.07.2014
comment
Есть ли способ использовать Matrix4 вместо float[]? - person user3847160; 18.07.2014
comment
Я не знаю. Это было задано в этом (относительно старом) вопросе: /8375076/. - person Reto Koradi; 18.07.2014