簡體   English   中英

嘗試按寬度(而不是高度)縮放OpenGL程序?

[英]Trying to Scale OpenGL Program with Width (but not height)?

我在擺弄圖形,並試圖找到一種方法來使我正在繪制的形狀(在本例中為三角形)與窗口大小保持比例。 但是,我只希望寬度更新,而高度保持不變。

我進行了一些研究,並嘗試使用glutGet(GLUT_SCREEN_WIDTH)作為乘積或與我的形狀的頂點相似(例如(GLUT_SCREEN_WIDTH / 100)-250),但是我覺得我可能缺少一個關鍵的想法。 我是否應該將縮放操作應用於視口,而不是形狀的點? 每當我縮放點時,它們似乎都不會隨窗口縮放。 下面的代碼。

#define GLUT_DISABLE_ATEXIT_HACK
#include <GL/glut.h>
#include <GL/gl.h>
//#include <assert.h>

void init (void)
{

glClearColor (1.0, 1.0, 0.0, 0.0); /* Set background to yellow */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);

}

void display(void)
{

glClear (GL_COLOR_BUFFER_BIT);

glColor3f (0.0, 0.0, 1.0);

glBegin(GL_TRIANGLES);

glVertex2d (0.0, 0.0);
glVertex2d(1.0, 0.0);
glVertex2d (0.5, 0.866);

glEnd();

glFlush (); //Display immediately

}

void keyEscape( unsigned char key, int x, int y )
{
switch ( key )
{
case 113: // 'Q' key for escape
  int windowID = glutCreateWindow ("triangle");
  glutDestroyWindow (windowID);
  exit (0);
  break;
}

glutPostRedisplay();

}

void mouseEscape( int button, int state, int x, int y )
{
if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
{

    int windowID = glutCreateWindow ("triangle");
    glutDestroyWindow (windowID);
    exit (0);

    glutPostRedisplay();

}

}

int main(int argc, char** argv)
{

glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition ((glutGet(GLUT_SCREEN_WIDTH)-250)/2,    (glutGet(GLUT_SCREEN_HEIGHT)-250)/2);
glutCreateWindow ("triangle");
init ();

glutKeyboardFunc(keyEscape);
glutMouseFunc(mouseEscape);
glutDisplayFunc(display);
glutMainLoop();

return 0;

}
  • 步驟1:擺脫Init函數。 投影設置是繪制過程的一部分。
  • 步驟2:使用“窗口寬度”作為glOrtho的left / right參數的輸入

像這樣:

void display(void)
{
    int const win_width  = glutGet(GLUT_WINDOW_WIDTH);
    int const win_height = glutGet(GLUT_WINDOW_HEIGHT);
    float const win_aspect = (float)win_width / (float)win_height;

    glClearColor (1.0, 1.0, 0.0, 0.0); /* Set background to yellow */
    glClear (GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, win_aspect, 0.0, 1.0, -1.0, 1.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glColor3f (0.0, 0.0, 1.0);

    glBegin(GL_TRIANGLES);

    glVertex2d (0.0, 0.0);
    glVertex2d(1.0, 0.0);
    glVertex2d (0.5, 0.866);

    glEnd();

    glFlush (); // Tell OpenGL to process what we submitted so far
}

順便說一句:您應該切換到雙緩沖模式,並使用glutSwapBuffers代替glFlush / glFinish; 在某些系統上,單緩沖模式不起作用(很好)。 今天,唯一可靠的方法是雙緩沖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM