Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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 调整窗口大小后,四边形的缩放不正确。如何修复?_Java_Opengl_Glsl - Fatal编程技术网

Java 调整窗口大小后,四边形的缩放不正确。如何修复?

Java 调整窗口大小后,四边形的缩放不正确。如何修复?,java,opengl,glsl,Java,Opengl,Glsl,如果我尝试在不调整窗口大小的情况下渲染具有相同x和y缩放比例的正方形,一切都很好。但调整窗口大小后,不再渲染正方形。相反,您可以看到一个矩形,即使我正在重新计算投影矩阵,并在每次窗口的宽度或高度更改时将矩阵传递给着色器。 如果宽度和高度不同,则正方形的缩放不正确。在我的代码中更改窗口大小而不调整窗口大小不会更改缩放比例 我不知道错误在哪里。也许我错过了什么 坐标: float[] positions = new float[] {0, 1, 0, 0, 1, 1, 1, 0}; 计算投影矩阵:

如果我尝试在不调整窗口大小的情况下渲染具有相同x和y缩放比例的正方形,一切都很好。但调整窗口大小后,不再渲染正方形。相反,您可以看到一个矩形,即使我正在重新计算投影矩阵,并在每次窗口的宽度或高度更改时将矩阵传递给着色器。 如果宽度和高度不同,则正方形的缩放不正确。在我的代码中更改窗口大小而不调整窗口大小不会更改缩放比例

我不知道错误在哪里。也许我错过了什么

坐标:

float[] positions = new float[] {0, 1, 0, 0, 1, 1, 1, 0};
计算投影矩阵:

 public static void createProjectionMatrix() {

    Vector2f windowSize = DisplayManager.getWindowSize();

    float aspectRatio = windowSize.x / windowSize.y;
    float halfWidth = 1.0f;
    float halfHeight = halfWidth / aspectRatio;

    float left = -halfWidth;
    float right = halfWidth;
    float bottom = -halfHeight;
    float top = halfHeight;
    float far = -1f;
    float near = 1f;

    Matrix4f matrix = new Matrix4f();

    matrix.setIdentity();

    matrix.m00 = 2f / (right - left);
    matrix.m11 = 2f / (top - bottom);
    matrix.m22 = -2f / (far - near);
    matrix.m32 = (far + near) / (far - near);
    matrix.m30 = (right + left) / (right - left);
    matrix.m31 = (top + bottom) / (top - bottom);

    projectionMatrix = matrix;
 }
计算转换(未使用矢量2F worldScale):

检查尺寸:

GLFW.glfwSetWindowSizeCallback(WINDOW, new GLFWWindowSizeCallback() {

        @Override
        public void invoke(long arg0, int arg1, int arg2) {
            resized = true;
        }
});
渲染(通常会渲染更多对象):

如果您需要更多信息,可以在Github上找到完整的代码,但我只想知道如何解决这个特定问题。

更改窗口大小后,必须将视口矩形调整为新大小:

用于设置视口矩形

将方法
updateViewPort
添加到类
DisplayManager

publicstaticvoidupdateviewport(){
IntBuffer pWidth=stack.mallocInt(1);
IntBuffer pHeight=stack.mallocInt(1);
GLFW.glfwGetFramebufferSize(窗口、宽度、高度);
GL11.glViewport(0,0,pWidth.get(0),pHeight.get(0));
}
调用类
MasterRenderer
中方法
prepare
中的
DisplayManager.updateViewPort

private void prepare(){
if(DisplayManager.isResized()){
DisplayManager.updateViewPort();
createProjectionMatrix();
}
Camera.calcViewMatrix();
GL11.glClear(GL11.GL\u颜色\u缓冲\u位);
GL11.glClearColor(1,0,0,1);
}
另见

GLFW.glfwSetWindowSizeCallback(WINDOW, new GLFWWindowSizeCallback() {

        @Override
        public void invoke(long arg0, int arg1, int arg2) {
            resized = true;
        }
});
@Override
protected void render() {
    shader.start();
    if(DisplayManager.isResized()) {
        shader.loadProjectionMatrix(MasterRenderer.getProjectionMatrix());
    }
    bindModel(Loader.getQuad(), new int[] {0});
    for(GUI gui : guis) {
        if(DisplayManager.isResized()) {
            gui.loadTransformationMatricies();
        }
        bindTexture(gui.getTexture().getTopLeftCorner(), GL13.GL_TEXTURE0);
        Matrix4f[] transforms = gui.getTransformations();
        for(int i = 0; i < 1; i++) {
            shader.loadTransformationMatrix(transforms[i]);
            drawSTRIP(Loader.getQuad());
        }
    }
    unbind(new int[] {0});
    shader.stop();
}
#version 400 core

in vec2 position;

uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;

out vec2 textureCoords;

void main (void){

    gl_Position =  projectionMatrix * transformationMatrix * vec4(position, 0, 1.0);
    textureCoords = vec2((position.x+1.0)/2.0, 1 - (position.y+1.0)/2.0);
}