gpt4 book ai didi

c++ - opengl为什么我的矩形这么大又倾斜?

转载 作者:太空宇宙 更新时间:2023-11-04 16:23:12 25 4
gpt4 key购买 nike

我有一个opengl项目,我只是试图在屏幕上绘制一个红色矩形,问题是1)它很大,几乎占据了整个屏幕,2)倾斜了。我对opengl真的很陌生,所以我不了解坐标系以及一些函数的功能,例如glOrtho()函数。

这是代码:

void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBegin(GL_QUADS);
glColor3f(1, 0, 0); // NOT SURE WHERE THIS STARTS, AND HOW THE COORDINATES WORK
glVertex2f(-1.0f, 1.0f);
glVertex2f( 1.0f, 1.0f);
glVertex2f( 1.0f,-1.0f);
glVertex2f(-1.0f,-1.0f);
glEnd();

glFlush();
}

void init()
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 10.0, 0, 10.0, -1.0, 1.0); //What does this do and how does it's coordinates work?
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(30.0, 1.0, 1.0, 1.0);
glEnable(GL_DEPTH_TEST);
}

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(600, 600);
glutInitWindowPosition(250, 250);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
glutCreateWindow("Model View");


glutDisplayFunc(display);

init();
glutMainLoop();

return 0;
}


无论如何,我希望将其转化为学习经验,所以请解释并链接到可能会有帮助的事情!谢谢。

最佳答案

过程显示负责实际图纸。

void display()
{


这行清除缓冲区;缓冲区本质上是渲染图像的内存;它基本上是一个宽度和高度为600x600的矩阵。清除表示将矩阵的每个单元格设置为相同的值。每个单元都是一个像素,并包含颜色和深度。通过此调用,您要告诉OpenGL将所有物体涂成不透明的黑色,并将深度重置为1。为什么不透明的黑色?由于调用了glClearColor:前三个参数是红色,绿色和蓝色分量,它们的范围可以在0到1之间。0,0,0表示黑色。对于最后一个组件,您指定了1,表示不透明; 0将是透明的。最后一个组件称为alpha,在启用alpha混合时使用。为什么净深为1?因为默认值为1,所以您没有调用 glClearDepth覆盖该值。

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


这是在告诉OpenGL您要绘制四边形。

   glBegin(GL_QUADS);


您希望这些四边形为红色(请记住,颜色的第一个成分是红色)。

      glColor3f(1, 0, 0);  // NOT SURE WHERE THIS STARTS, AND HOW THE COORDINATES WORK


现在,您列出四边形的顶点(只有一个,四个顶点)。所有顶点都是红色的,因为您永远不会通过调用glColor3f来更新颜色;您可以将不同的颜色关联到每个顶点,如果选择红色(1,0,0),绿色(0,1,0),蓝色(0,0,1)和白色(1,则最终结果通常非常可爱,1,1);该四边形应该在屏幕上显示为正方形,因为它在几何上是正方形,您的窗口是正方形,并且摄像机(使用glOrtho定义)具有正方形的外观(调用glOrtho的前四个参数)。如果您不调用glOrtho,您可能只会看到红色,因为默认的OpenGL坐标范围是-1和1,因此您将覆盖整个窗口。

        glVertex2f(-1.0f, 1.0f); 
glVertex2f( 1.0f, 1.0f);
glVertex2f( 1.0f,-1.0f);
glVertex2f(-1.0f,-1.0f);


这意味着您完成了绘图。

    glEnd();                  


从技术上讲,这可能是OpenGL没有将您指定的任何命令发送到图形卡。命令可能出于效率原因而排队。调用 glFlush强制将命令发送到图形卡。

   glFlush();
}


您编写了此函数,并通过init初始化了一些OpenGL状态,您认为该状态将在整个应用程序中保持稳定。实际上,像游戏这样的真实应用程序会在其中显示大多数此类内容。例如,随着玩家的移动,游戏必须不断更新相机。

void init()
{


就像我们之前说过的,此处将透明色设置为不透明黑色。

   glClearColor(0.0, 0.0, 0.0, 1.0);


在这里,您说的是相机不是透视型的。基本上,远处的东西不会变小。类似于人造卫星对城市的看法。特别是您要创建一个不在视场中央的相机:我建议您在第一个实验中使用glOrtho(-10.0,10.0,-10.0,10.0,-1.0,1.0)之类的调用。对于非透视相机,您在此处指定的坐标将覆盖我们上面提到的约定-1至+1。尝试调整参数,以使红色方块显得较小且居中。

   glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 10.0, 0, 10.0, -1.0, 1.0); //What does this do and how does it's coordinates work?


在这里,您基本上是将摄像机相对于正方形放置,或相对于摄像机放置正方形。有无数种观看方式。您正在定义几何变换,之所以将其称为MODELVIEW,是因为它并不是唯一地改变模型(正方形)或视图(摄影机)的东西,而是根据您查看方式的不同而改变的东西。但是,由于您正在调用 glRotatef,因此正方形显示为旋转状态。删除它,该正方形应看起来像一个正方形。

   glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(30.0, 1.0, 1.0, 1.0);


深度测试是一种使用缓冲区中的深度存储以删除隐藏表面(例如3D场景中的立方体背面)的技术。您的场景是2D的,并且您仅绘制了四边形,因此这实际上不影响您的绘制。

   glEnable(GL_DEPTH_TEST);
}


从根本上讲,您正在与glut(一个不是OpenGL的一部分,但可以执行一些仅授权操作系统才能执行的枯燥乏味的操作)的可选子系统glut进行交互。

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


首先,您必须初始化过剩。

    glutInit(&argc, argv);


然后,定义将包含渲染图像的窗口。

    glutInitWindowSize(600, 600);
glutInitWindowPosition(250, 250);


GLUT_RGB表示您的窗口仅支持红色,绿色和蓝色,并且没有Alpha通道(通常是这种情况)。 GLUT_DEPTH意味着您的缓冲区将能够存储每个像素的深度。 GLUT_SINGLE表示窗口是单个缓冲的,也就是说您的命令将直接在窗口上绘制;另一个选择是双缓冲,实际上是在后缓冲区上绘制,然后交换前缓冲区和后缓冲区,以使渲染的图像突然出现,而不是以渐进方式出现。您的场景是如此简单,以至于您不会注意到GLUT_SINGLE和GLUT_DOUBLE之间的任何区别。

    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);


然后,您实际上创建了窗口。

    glutCreateWindow("Model View");


您告诉glut应该调用哪个函数来渲染场景。

    glutDisplayFunc(display);


在这里,您可以调用init函数。

   init();


这是一个由glut提供的窗口循环。大多数开窗系统都需要一个软件循环,以使窗口保持活动状态,并能够响应单击,拖动,调整大小和键盘笔触。

    glutMainLoop();

return 0;
}


长话短说,可以使用多种版本的OpenGL,并且可以使用多种语言对它们进行编程,并针对多种平台。这些版本之间最重要的区别是,有些版本使用固定功能管线(FFP),而最新版本则具有可编程管线。您的程序使用固定功能管道。顾名思义,您应该尽可能切换到可编程管线,因为它是现代的计算机图形处理方式,并且更加灵活,尽管它需要更多的编程。

您应该忽略我最初链接的教程,但我没有立即意识到它们有多过时。您应该使用 the one recommended by datenwolf,或者,如果您对移动开发感兴趣,则可以考虑学习OpenGL ES 2(这很重要,因为以前的版本是固定功能,因此这是非常重要的)。还有一个用于HTML5和Javascript的OpenGL ES 2变体,称为WebGL。您可以找到教程 here,以及包含所有示例的ZIP文件。每当需要检查我是否了解新概念时,我都会使用它们的代码库。

关于c++ - opengl为什么我的矩形这么大又倾斜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14822763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com