Передача матриц в glsl просто не сработает? - PullRequest
5 голосов
/ 08 декабря 2011

Я сейчас использую lwjgl и программирую glsl 1.20.

Вот как выглядит код, который пытается отправить плавающую матрицу 4x4 в шейдеры:

    int normalMatrixLocation = ARBShaderObjects.glGetUniformLocationARB(handlers.ShaderHandler.get().getShader("sphere"), "normalMatrix");
    tempFloatBuffer = BufferUtils.createFloatBuffer(16);
    tempFloatBuffer.put(helpers.Matrix.doubleToFloat4x4(normalMatrix.getArray()));
    tempFloatBuffer.rewind();
    ARBShaderObjects.glUniformMatrix4ARB(normalMatrixLocation, false, tempFloatBuffer);

Вспомогательная функция выглядит следующим образом:

    public static float[] doubleToFloat4x4(double[][] dArray) {
        float[] newFloat = new float[16];
        for(int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                newFloat[j+4*i] = (float)dArray[i][j];
            }
        }
        return newFloat;
    }

И в шейдере у меня есть следующее, так что я смогу использовать его для шейдеров различных функций:

uniform mat4 normalMatrix;

Хотя эта униформавсегда пустая матрица 4x4 ...

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 23 апреля 2012
uniform mat4x4 matrixName;

Насколько я могу судить, это 'mat4x4', а не 'mat4'.

Кроме того, отправка плавающих буферов требует использования байтового буфера и класса ByteOrder.Мой код выглядит так:

 qbuffer.rewind();

    ByteBuffer temp = ByteBuffer.allocateDirect(64);
    temp.order(ByteOrder.nativeOrder());

    int qLocation = ARBShaderObjects.glGetUniformLocationARB(shaderProgram, "q");
    ARBShaderObjects.glUniformMatrix4ARB(qLocation, 
false, (FloatBuffer)temp.asFloatBuffer().put(qbuffer).flip());

извилистый, да, но он обеспечивает собственный порядок.

0 голосов
/ 03 февраля 2012

Функции glUniform влияют на текущую программу.Убедитесь, что вы вызываете glUseProgramARB (myProgramObj) перед вызовом glUniform.

...