gpt4 book ai didi

c++ - OpenGL 在正交和透视之间切换

转载 作者:行者123 更新时间:2023-11-28 00:38:15 25 4
gpt4 key购买 nike

我有一个在即时模式下使用正交投影的图 block 引擎,我只是想在我的图 block 场景上绘制一个 3d 立方体,希望我最终可以将 3d 模型整合到我的引擎中,而不仅仅是 Sprite /纹理四边形。我还想将瓷砖制作成 3d,以获得一点点额外的视觉效果。希望我最终可以将其转换为使用现代 OpenGL,以便我可以利用这些额外的功能。目前不在我的优先列表中。那么问题来了。

我用这个初始化 OpenGL:

void initGL()
{
glDisable(GL_DEPTH_TEST);

glViewport( 0,0,SCREEN_WIDTH,SCREEN_HEIGHT);

//Initialize Projection Matrix
glMatrixMode( GL_PROJECTION );
glPushMatrix();
glLoadIdentity();

//Initialize Modelview Matrix
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
glLoadIdentity();

glOrtho(0,SCREEN_WIDTH,SCREEN_HEIGHT,0,0,1);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
//...setting some various other attributes, omitted for brevity...

glEnable(GL_TEXTURE_2D);
glClearColor( 0, 0, 0, 0 );
}

我有一个绘制立方体的函数。

void draw_cube()
{
/* position object */
glRotatef(30.0F, 1.0F, 0.0F, 0.0F);
glRotatef(30.0F, 0.0F, 1.0F, 0.0F);

/* draw six faces of a cube */
glBegin(GL_QUADS);
...vertices... (removed for brevity)
glEnd();
}

我做了 2 个函数来设置 2d 和 3d 投影模式。

void set3d()
{
glEnable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(0,SCREEN_WIDTH,0,SCREEN_HEIGHT, 0,1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void set2d()
{
glClear(GL_COLOR_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,SCREEN_WIDTH,SCREEN_HEIGHT,0,0,1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

为了完整起见,我的纹理四边形绘图的一些伪代码..

pushmatrix();
translate();
rotate();
-translate();

glbegin();
...vertices
glend();
popmatrix();

到目前为止,我已经设法让立方体绘制在图 block 上,但它会在大约 1 秒后消失,直到我再次运行该程序后才会再次出现。

基本上我在主循环中做的是这样的:

move objects around, process collisions, etc.

set2d();
draw textured quads, lines, text, etc. in 2d mode.

set3d();
draw_cube();

我的问题是:为什么立方体消失了,我的 set2d() 和 set3d() 函数是否有任何错误?

最佳答案

你在这段代码中有很多问题,实际上太多了,无法在评论中列出。

  1. 您的投影矩阵正在改变投影后坐标空间的旋向性,这将影响多边形缠绕。

    • 坚持单手使用,除非您想反转用于正面/背面多边形面的方向 (glFrontFace (...)) - 默认情况下为 CCW,但您当您使用 set3d (...) 以保持一致的行为时,必须将其更改为 CW。
    • 出现这个问题是因为 Y 轴的方向不同

  2. 您所描述的对象短暂出现然后消失的行为表明您的矩阵堆栈存在问题。

    • 您是否在您的软件中多次调用 initGL (...)?如果你这样做的次数足够多,你将遇到堆栈溢出,因为你不必要地将当前矩阵压入堆栈并且永远不会将其弹出。

  3. 您不能将 0.0 用于具有透视投影矩阵的 zNear,这将导致在 转换为 clip-空间;深度缓冲区将无法正常工作。

    • 事实上,glFrustum (...) 将生成一个 GL_INVALID_VALUE 错误并且完全什么都不做如果您为 zNear 传递了一个 ≤ 0.0 的值。在相关说明中,gluPerspective (...) 不会执行此操作,因为它实际上不是 OpenGL 的一部分,但将这样的值传递给 gluPerspective (.. .).

关于c++ - OpenGL 在正交和透视之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20085080/

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