Opengl 格洛托似乎没有效果

Opengl 格洛托似乎没有效果,opengl,Opengl,我正在画一个带有坐标(.5,-.5),(.5,-.5),(.5,-.5),(.5,-.5)的正方形,我注意到它在我的800 x 600窗口中被挤压了(这似乎完全符合逻辑) 我试图把它修好,使正方形看起来是正方形,而不是长方形。我的方法是调用glOrtho(),值为left=-ar,right=ar,bottom=-1,top=1,其中ar是我的纵横比(800/600)。我发现,我对glOrtho()所做的任何调用都没有任何效果,包括我已经在做的调用(我可以删除它,但不会有任何改变) 我对glOr

我正在画一个带有坐标
(.5,-.5),(.5,-.5),(.5,-.5),(.5,-.5)
的正方形,我注意到它在我的
800 x 600
窗口中被挤压了(这似乎完全符合逻辑)

我试图把它修好,使正方形看起来是正方形,而不是长方形。我的方法是调用
glOrtho()
,值为
left=-ar
right=ar
bottom=-1
top=1
,其中
ar
是我的纵横比(
800/600
)。我发现,我对
glOrtho()
所做的任何调用都没有任何效果,包括我已经在做的调用(我可以删除它,但不会有任何改变)

我对
glOrtho()
的理解是,它将OpenGL上下文的各个角映射到提供的值,并在这些点之间拉伸所有内容以适合。这是不正确的,还是我正在做一些阻止我对
glOrtho()
的调用生效的事情

import org.lwjgl.BufferUtils;
导入org.lwjgl.LWJGLException;
导入org.lwjgl.opengl.Display;
导入org.lwjgl.opengl.DisplayMode;
导入java.nio.FloatBuffer;
导入静态org.lwjgl.opengl.GL11.*;
导入静态org.lwjgl.opengl.GL15.*;
公共级格洛特酒店司机{
公共静态void main(字符串[]args){
试一试{
Display.setDisplayMode(新的显示模式(800600));
显示。设置标题(“glOrtho测试”);
Display.create();
}捕获(LWJGLEXE){
e、 printStackTrace();
Display.destroy();
系统出口(1);
}
//OpenGL的初始化代码
glMatrixMode(GL_投影);
格洛托(-1,1,-1,1,-1,1);
glLoadIdentity();
//场景设置
int vertexBufferHandle;
int-colorBufferHandle;
FloatBuffer vertexData=BufferUtils.createFloatBuffer(8);
vertexData.put(新浮点[]
{
-.5f,-.5f,
-.5f、.5f、,
.5f、.5f、,
.5f,-.5f
}
);
vertexData.flip();
FloatBuffer colorData=BufferUtils.createFloatBuffer(12);
colorData.put(新浮点[]
{
1, 1, 1,
1, 1, 1,
1, 1, 1,
1, 1, 1
}
);
colorData.flip();
vertexBufferHandle=glGenBuffers();
colorBufferHandle=glGenBuffers();
glBindBuffer(GL_数组_BUFFER,vertexBufferHandle);
glBufferData(GLU数组缓冲区、顶点数据、GLU静态图);
glBindBuffer(GL_数组_BUFFER,colorBufferHandle);
glBufferData(GLU数组缓冲区、colorData、GLU静态绘图);
glBindBuffer(GL_数组_BUFFER,0);
而(!Display.isCloseRequested()){
glClear(GLU颜色缓冲位);
glBindBuffer(GL_数组_BUFFER,vertexBufferHandle);
glvertexofinter(2,GL_FLOAT,0,0);
glBindBuffer(GL_数组_BUFFER,colorBufferHandle);
glColorPointer(3,GL_浮点,0,0);
glEnableClientState(GL_顶点_数组);
glEnableClientState(GL_颜色_阵列);
gldrawArray(GL_四边形,0,4);
glDisableClientState(GL_颜色_数组);
glDisableClientState(GL_顶点_数组);
Display.update();
显示同步(60);
}
glDeleteBuffers(vertexBufferHandle);
glDeleteBuffers(colorBufferHandle);
Display.destroy();
}
}

啊-您的问题是,在调用
glOrtho
之后,您正在调用
glLoadIdentity
glLoadIdentity
将当前模式下的矩阵(
GL_PROJECTION
)替换为标识矩阵,从而清除以前对
glOrtho
的任何调用


glOrtho
之前尝试调用
glLoadIdentity

啊-您的问题是在调用
glOrtho
之后调用
glLoadIdentity
glLoadIdentity
将当前模式下的矩阵(
GL_PROJECTION
)替换为标识矩阵,从而清除以前对
glOrtho
的任何调用


glOrtho
之前尝试调用
glLoadIdentity

那么您的代码显示glOrtho是用(-1,1,-1,1…)调用的。另外,如果您确实使用800/600作为纵横比,您是否确保使用浮点除法?(800.0/600.0)如果您使用整数除法,则只需四舍五入到ar=1。@Anna是的,这是我尝试去挤压正方形之前的原始调用。我发现我可以以任何方式更改它,或者完全删除它,什么都不会更改。您的代码显示glOrtho被(-1,1,-1,1…)调用。另外,如果您确实使用800/600作为纵横比,您是否确保使用浮点除法?(800.0/600.0)如果您使用整数除法,则只需四舍五入到ar=1。@Anna是的,这是我尝试去挤压正方形之前的原始调用。我发现我可以以任何方式改变它,或者完全移除它,什么都不会改变。