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