2014-09-03 2 views
0

У меня есть matrix4f, что я перехожу из своего класса ShaderProgram в свой шейдерный класс вершин с использованием однородных переменных. Предполагается, что эта матрица выступает в качестве перевода для вершин. Ниже то, что матрица выглядитGLSL Matrix Translation оставляет пустой экран?

1, 0, 0, 0, 
0, 1, 0, 0, 
0, 0, 1, 0, 
0, 0, 0, 1 

Когда я умножать эту переменную (так называемый «тест») точками вершин (Called gl_Vertex) ничего не видно, она просто оставляет пустой экран. Это происходит только тогда, когда я умножаю его на единую переменную «test», если я умножаю ее на новую матрицу4f с одинаковыми значениями, она работает нормально. Если я использую векторные однородные переменные вместо матриц, он работает так, как ожидалось.

Я передаю переменную в класс вершинного шейдера GLSL правильно? И если да, то почему мой квад не появляется на экране?

Вот моя вершинный шейдер

#version 400 core 

uniform vec4 translation; 
uniform vec4 size; 
uniform vec4 rotation; 
uniform mat4 test; 

in vec2 textureCoords; 
in vec3 position; 
out vec2 pass_textureCoords; 

void main(void){ 
    //pass texture cords 
    pass_textureCoords = textureCoords; 

    //This works by multiplying by identity matrix 
    //gl_Position = mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1) * gl_Vertex; 

    //This works by passing vec4's not matrix4 
    /*gl_Position = vec4(((gl_Vertex.x + translation.x)*size.x), 
         ((gl_Vertex.y + translation.y)*size.y), 
         ((gl_Vertex.z + translation.z)*size.z), 
         ((gl_Vertex.w + translation.w)*size.w) 
         );*/ 

    //this leaves a blank window 
    gl_Position = test * gl_Vertex; 

} 

Это, как я объявляю унифицированные переменные местоположения:

translationLocation = GL20.glGetUniformLocation(programID, "translation"); 
sizeLocation = GL20.glGetUniformLocation(programID, "size"); 
rotationLocation = GL20.glGetUniformLocation(programID, "rotation"); 
textureLocation = GL20.glGetUniformLocation(programID, "textureSampler"); 
testMat = GL20.glGetUniformLocation(programID, "test"); 

Это, как я сделать равномерные переменные

public void start(){ 
    GL20.glUseProgram(programID); 

    Vector4f translation = offset.getTranslation(); 
    Vector4f size = offset.getSize(); 
    Vector4f rotation = offset.getRotation(); 

    GL20.glUniform4f(translationLocation, translation.x, translation.y, translation.z,  translation.w); 
    GL20.glUniform4f(sizeLocation, size.x, size.y, size.z, size.w); 
    GL20.glUniform4f(rotationLocation, rotation.x, rotation.y, rotation.z, rotation.w); 

    FloatBuffer buff = BufferUtils.createFloatBuffer(16); 
    offset.getTestTranslation().storeTranspose(buff); 
    GL20.glUniformMatrix4(testMat, false, buff); 

    GL20.glUniform1i(textureLocation, 0); 
} 

И так я объявляю свои переменные перед передачей их в GLSL

Vector4f translation; 
Vector4f size; 
Vector4f rotation; 
Matrix4f testTranslation; 

public Offset(){ 
    translation = new Vector4f(0, 0, 0, 0); 
    size = new Vector4f(1, 1, 1, 1); 
    rotation = new Vector4f(0, 0 , 0, 0); 
    testTranslation = new Matrix4f(); 
    testTranslation.translate(new Vector3f(0,0,0)); 
} 
+3

Пожалуйста, не ссылайтесь на Pastebin. Ресурсы там не сохраняются, поэтому когда-нибудь, когда ресурс не будет доступен, пользователи SO не смогут увидеть, что вы подключили. Отправьте наиболее релевантную часть вашего кода непосредственно в вопросе. – BackSlash

+0

Я извинился, но он был удален, у меня были проблемы с вставкой с правильным форматированием. Исправлено сейчас, спасибо – jthort

ответ

0

Ну, получается, что я использую следующий метод для преобразования matrix4f в floatBuffer

matrix4f.storeTranspose(buff) 

Когда, по-видимому, не правильно хранить матрицу в буфер поплавка. Теперь я использую этот метод для отправки матрицы в шейдерный шейдер при рендеринге шейдерной программы

public void setMatrixArray(boolean transposed, Matrix4f[] matrices){ 

    FloatBuffer matrixBuffer = BufferUtils.createFloatBuffer(16*matrices.length); 
    for(int i = 0; i<matrices.length; i++) { 
     matrices[i].store(matrixBuffer); 
    } 
    matrixBuffer.flip(); 
    GL20.glUniformMatrix4(testMat,transposed,matrixBuffer); 
} 
Смежные вопросы