我正在繪製幾個形狀(如圓形),這些形狀的寬度取決於窗口高度&。由於窗口總是以給定的大小開始,所以它們被正確繪製,但是當窗口被調整大小時,它會將高寬比向上混淆。在OpenGL中,如何調整正在調整大小的窗口?
無論窗口大小如何,我如何正確繪製形狀?
我正在繪製幾個形狀(如圓形),這些形狀的寬度取決於窗口高度&。由於窗口總是以給定的大小開始,所以它們被正確繪製,但是當窗口被調整大小時,它會將高寬比向上混淆。在OpenGL中,如何調整正在調整大小的窗口?
無論窗口大小如何,我如何正確繪製形狀?
你肯定不想讓你的對象的大小明確依賴於窗口大小。
正如genpfault已經提示的那樣,只要窗口大小發生變化就調整投影矩陣。
的事做對窗口大小調整:
調整視:
glViewPort(0,0, width, height)
調整投影矩陣:
glFrustum(left * ratio, right * ratio, bottom, top, nearClip,farClip)
或
glOrtho(left * ratio, right * ratio, bottom, top, nearClip,farClip)
或
gluOrtho2D(left * ratio, right * ratio, bottom, top)
(假設left, right, bottom
和top
都是平等的,ratio=width/height
)
如果你正在使用類似gluPerspective()只使用窗寬/高比例
gluPerspective(60, (double)width/(double)height, 1, 256);
你應該建立某種形式的窗口處理函數被調用每當你的OpenGL窗口調整大小時。當aspectRatio> 1,並且aspectRatio < = 1時,您需要處理這種情況。不這樣做可能會導致在屏幕調整大小後,幾何體會脫離屏幕。
void windowResizeHandler(int windowWidth, int windowHeight){
const float aspectRatio = ((float)windowWidth)/windowHeight;
float xSpan = 1; // Feel free to change this to any xSpan you need.
float ySpan = 1; // Feel free to change this to any ySpan you need.
if (aspectRatio > 1){
// Width > Height, so scale xSpan accordinly.
xSpan *= aspectRatio;
}
else{
// Height >= Width, so scale ySpan accordingly.
ySpan = xSpan/aspectRatio;
}
glOrhto2D(-1*xSpan, xSpan, -1*ySpan, ySpan, -1, 1);
// Use the entire window for rendering.
glViewport(0, 0, windowWidth, windowHeight);
}
我也在學習opengl。我昨天遇到了這個問題,我還沒有找到正確的答案。今天,我已經解決了這個問題。在我的小程序中,當調整窗口寬度或高度時,對象改變大小。這是我的代碼(請原諒我的錯誤):
#include <GL/freeglut.h>
void fnReshape(int ww, int hh)
{
GLdouble r;
if(hh == 0)
hh = 1.0;
if(hh > ww)
r = (double) hh/(double) ww;
else
r = (double) ww/(double) hh;
glViewport(0, 0, ww, hh);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(hh > ww)
glFrustum(-1.0, 1.0, -1.0 * r, 1.0 * r, 2.0, 200.0);
else
glFrustum(-1.0 * r, 1.0 * r, -1.0, 1.0, 2.0, 200.0);
}
//////////////////////////////////////////////////////////////////
void fnDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0., 0., -5.);
glBegin(GL_QUAD_STRIP);
glColor3f(0., 0., 1.0);
glVertex3f(-1., -1., 0.);
glVertex3f(-1., 1., 0.);
glVertex3f(1., -1., 0.);
glVertex3f(1., 1., 0.);
glEnd();
glutSwapBuffers();
}
////////////////////////////////////////////////////////////
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA |GLUT_DOUBLE);
glutInitWindowSize(500, 500);
glutCreateWindow("Sample window");
glClearColor(1.0, 0, 0, 1.0);
glutDisplayFunc(fnDisplay);
glutReshapeFunc(fnReshape);
glutMainLoop();
return 0;
}
有很多方法可以做到這一點。 以下示例顯示了我在項目中的工作方式。 該示例僅顯示一個矩形框,它在窗口大小調整時不會更改它的大小。您可以直接調用複製並粘貼在你的項目中(考慮到我是一個初學者的OpenGL)
#include<windows.h>
#include<glut.h>
GLfloat x1=100.0f;
GLfloat y1=150.0f;
GLsizei rsize = 50;
GLfloat xstep=1.0f;
GLfloat ystep=1.0f;
GLfloat windowWidth;
GLfloat windowHeight;
void scene(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glRectf(x1,y1,x1+rsize,y1-rsize);
glutSwapBuffers();
}
void setupRc(void){
glClearColor(0.0f,0.0f,1.0f,0.0f);
}
void changeSize(GLsizei w,GLsizei h){
if(h==0)
h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w>=h){
windowWidth=250.0f*w/h;
windowHeight=250.f;
}
else{
windowWidth=250.0f;
windowHeight=250.f*h/w;
}
glOrtho(0.0f,windowWidth,0.0f,windowHeight,1.0f,-1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main(void){
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutCreateWindow("Rectangle");
glutReshapeFunc(changeSize);
glutDisplayFunc(scene);
setupRc();
glutMainLoop();
}
剪取也影響重繪區域,如果你一旦設置剪輯矩形'glScissor()'。見[this](https://www.opengl.org/discussion_boards/showthread.php/176760-glClearColor-WM-SIZE-only-part-is-cleared)。 – zwcloud 2017-03-30 05:50:03