在opengl中在矩形window上画一个正方形
Drawing a square on a rectangular window in opengl
我正在 LWJGL 中绘制一个 3d 立方体 3.It 渲染效果很好,window 大小为 600 * 480.It 渲染出一个完美的立方体。
但是如果我将 window 的宽度增加到 900 而高度保持不变。
立方体是矩形的。
在 640 * 480 分辨率下立方体的正面是:
在 900 * 480 分辨率下立方体的正面是:
我想渲染一个完美的正方形而不像矩形。
如果需要,
渲染循环如下:
private void loop() {
GL.createCapabilities();
// Set the clear color
glClearColor(0f, 0.0f, 0.0f, 0.0f);
float x = 0.5f;
float y = 0.5f;
float z = 0.5f;
float[] vertices = new float[] {
// VO
-x, y, z,
// V1
-x, -y, z,
// V2
x, -y, z,
// V3
x, y, z,
// V4
-x, y, -z,
// V5
x, y, -z,
// V6
-x, -y, -z,
// V7
x, -y, -z, };
float[] colours = new float[] {
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f,
0.0f, 0.0f, 0.5f,
0.0f, 0.5f, 0.5f,
0.5f,0.0f, 0.0f,
0.0f, 0.5f, 0.0f,
0.0f, 0.0f, 0.5f,
0.0f, 0.5f, 0.5f, };
int[] indices = new int[] {
// Front face
0, 1, 3, 3, 1, 2,
// Top Face
4, 0, 3, 5, 4, 3,
// Right face
3, 2, 7, 5, 3, 7,
// Left face
6, 1, 0, 6, 0, 4,
// Bottom face
2, 1, 6, 2, 6, 7,
// Back face
7, 6, 4, 7, 4, 5, };
RawModel model = Loader.loadRawModel(vertices, indices, colours);
ShaderProgram shader = null;
Transformation transformation = new Transformation();
try {
shader = new ShaderProgram(Utils.loadTextFile("src/shaders/vertexShader.txt"),
Utils.loadTextFile("src/shaders/fragmentShader.txt"));
shader.link();
shader.createUniform("projectionMatrix");
shader.createUniform("worldMatrix");
} catch (Exception e) {
e.printStackTrace();
}
float rotation = 0;
while (!glfwWindowShouldClose(window)) {
glEnable(GL11.GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
shader.bind();
shader.setUniform("projectionMatrix", transformation.getProjectionMatrix((float) Math.toRadians(60),
(float) (width / height), 0.1f, 1000f));
shader.setUniform("worldMatrix", transformation.getWorldMatrix(new Vector3f(0, 0, -3f),
new Vector3f(rotation, rotation, rotation), 1));
model.render();
shader.unBind();
glfwSwapBuffers(window);
glfwPollEvents();
}
shader.dispose();
Loader.dispose();
}
这是 NDC(标准化设备坐标)工作方式的结果。他们没有考虑 window 的比例。我认为问题是当 window 的尺寸发生变化时,您没有更新 width
和 height
的值。您所要做的就是编写一个帧缓冲区大小调整回调并将其设置为 glfwSetFramebufferSizeCallback()
:
glfwSetFramebufferSizeCallback(window, (window, newWidth, newHeight) -> {
width = newWidth;
height = newHeight;
});
这可以解决问题。只需确保将其放在渲染循环之前。
感谢@Derhass,问题已解决 now.The 问题是我计算的纵横比为:
float aspectRatio = (float)(900/480);
等于1.0f .
但是当我将 f 添加到宽度和高度时:
float aspectRatio = (float)(900f/480f);
给了1.875的权利aspectRatio
。
现在立方体显示为方形。
我正在 LWJGL 中绘制一个 3d 立方体 3.It 渲染效果很好,window 大小为 600 * 480.It 渲染出一个完美的立方体。
但是如果我将 window 的宽度增加到 900 而高度保持不变。 立方体是矩形的。
在 640 * 480 分辨率下立方体的正面是:
在 900 * 480 分辨率下立方体的正面是:
我想渲染一个完美的正方形而不像矩形。
如果需要, 渲染循环如下:
private void loop() {
GL.createCapabilities();
// Set the clear color
glClearColor(0f, 0.0f, 0.0f, 0.0f);
float x = 0.5f;
float y = 0.5f;
float z = 0.5f;
float[] vertices = new float[] {
// VO
-x, y, z,
// V1
-x, -y, z,
// V2
x, -y, z,
// V3
x, y, z,
// V4
-x, y, -z,
// V5
x, y, -z,
// V6
-x, -y, -z,
// V7
x, -y, -z, };
float[] colours = new float[] {
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f,
0.0f, 0.0f, 0.5f,
0.0f, 0.5f, 0.5f,
0.5f,0.0f, 0.0f,
0.0f, 0.5f, 0.0f,
0.0f, 0.0f, 0.5f,
0.0f, 0.5f, 0.5f, };
int[] indices = new int[] {
// Front face
0, 1, 3, 3, 1, 2,
// Top Face
4, 0, 3, 5, 4, 3,
// Right face
3, 2, 7, 5, 3, 7,
// Left face
6, 1, 0, 6, 0, 4,
// Bottom face
2, 1, 6, 2, 6, 7,
// Back face
7, 6, 4, 7, 4, 5, };
RawModel model = Loader.loadRawModel(vertices, indices, colours);
ShaderProgram shader = null;
Transformation transformation = new Transformation();
try {
shader = new ShaderProgram(Utils.loadTextFile("src/shaders/vertexShader.txt"),
Utils.loadTextFile("src/shaders/fragmentShader.txt"));
shader.link();
shader.createUniform("projectionMatrix");
shader.createUniform("worldMatrix");
} catch (Exception e) {
e.printStackTrace();
}
float rotation = 0;
while (!glfwWindowShouldClose(window)) {
glEnable(GL11.GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
shader.bind();
shader.setUniform("projectionMatrix", transformation.getProjectionMatrix((float) Math.toRadians(60),
(float) (width / height), 0.1f, 1000f));
shader.setUniform("worldMatrix", transformation.getWorldMatrix(new Vector3f(0, 0, -3f),
new Vector3f(rotation, rotation, rotation), 1));
model.render();
shader.unBind();
glfwSwapBuffers(window);
glfwPollEvents();
}
shader.dispose();
Loader.dispose();
}
这是 NDC(标准化设备坐标)工作方式的结果。他们没有考虑 window 的比例。我认为问题是当 window 的尺寸发生变化时,您没有更新 width
和 height
的值。您所要做的就是编写一个帧缓冲区大小调整回调并将其设置为 glfwSetFramebufferSizeCallback()
:
glfwSetFramebufferSizeCallback(window, (window, newWidth, newHeight) -> {
width = newWidth;
height = newHeight;
});
这可以解决问题。只需确保将其放在渲染循环之前。
感谢@Derhass,问题已解决 now.The 问题是我计算的纵横比为:
float aspectRatio = (float)(900/480);
等于1.0f .
但是当我将 f 添加到宽度和高度时:
float aspectRatio = (float)(900f/480f);
给了1.875的权利aspectRatio
。
现在立方体显示为方形。