Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GLSL矩阵翻译留下空白屏幕?_Java_Opengl_Glsl_Lwjgl_Matrix Multiplication - Fatal编程技术网

Java GLSL矩阵翻译留下空白屏幕?

Java GLSL矩阵翻译留下空白屏幕?,java,opengl,glsl,lwjgl,matrix-multiplication,Java,Opengl,Glsl,Lwjgl,Matrix Multiplication,我有一个matrix4f,我正在使用统一变量从ShaderProgram类传递到顶点着色器类。该矩阵应充当顶点的平移。下面是矩阵的外观 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 当我将这个变量(称为“test”)乘以顶点(称为gl_顶点)时,什么都看不见,只留下一个空白屏幕。只有当我将它乘以统一变量“test”时才会发生这种情况,如果我将它乘以具有相同值的新矩阵4f,它就会正常工作。如果我使用向量统一变量而不是矩阵,它会按预期工作 我是否正确

我有一个matrix4f,我正在使用统一变量从ShaderProgram类传递到顶点着色器类。该矩阵应充当顶点的平移。下面是矩阵的外观

1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
当我将这个变量(称为“test”)乘以顶点(称为gl_顶点)时,什么都看不见,只留下一个空白屏幕。只有当我将它乘以统一变量“test”时才会发生这种情况,如果我将它乘以具有相同值的新矩阵4f,它就会正常工作。如果我使用向量统一变量而不是矩阵,它会按预期工作

我是否正确地将变量传递到GLSL顶点着色器类?如果是这样,为什么我的quad没有显示在屏幕上?

这是我的顶点着色器

#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));
}

事实证明,我是在使用以下方法将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);
}
public void setMatrixArray(布尔转置,Matrix4f[]矩阵){
FloatBuffer matrixBuffer=BufferUtils.createFloatBuffer(16*matrices.length);

对于(int i=0;i请不要链接到Pastebin。那里的资源不会持久存在,因此有一天,当资源不可用时,用户将无法看到您附加的内容。直接在问题中发布您代码中最相关的部分。我表示歉意,但它已被删除,我在使用正确格式粘贴它时遇到了一些问题。现已修复,谢谢