У меня есть 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));
}
Пожалуйста, не ссылайтесь на Pastebin. Ресурсы там не сохраняются, поэтому когда-нибудь, когда ресурс не будет доступен, пользователи SO не смогут увидеть, что вы подключили. Отправьте наиболее релевантную часть вашего кода непосредственно в вопросе. – BackSlash
Я извинился, но он был удален, у меня были проблемы с вставкой с правильным форматированием. Исправлено сейчас, спасибо – jthort