将OpenGL原点更改为屏幕左上方时,我应该担心什么?


11

对于自我教育,我正在使用SDL / OpenGL用C ++编写2D平台引擎。我最初使用sdltutorials.com和lazyfoo.net上的教程从纯SDL开始,但是现在我使用SDL创建OpenGL渲染上下文,然后使用OpenGL函数进行渲染(特别是即时模式,但是我正在学习VAO / VBO) )。我仅将SDL用于接口,音频等。

SDL使用坐标系,其原点位于屏幕的左上角,而y轴的正指向下。在OpenGL中设置正投影可以很容易地做到这一点。

我知道纹理坐标是一个从0到1的右手系统-在渲染之前垂直翻转纹理(好吧,在加载之前翻转文件)会产生可以正确渲染的纹理...如果我正在绘制,这很好整个纹理,但最终我将使用tileset并可以想象问题。

执行此操作时,我应该在渲染方面关注什么?

如果有人提出任何建议,或者他们自己做了建议并指出未来的陷阱,那将是不错的选择,但实际上任何想法都会受到赞赏。


1
您是使用SDL进行渲染(如SDL的blitting函数一样),还是使用SDL创建OpenGL渲染上下文,然后使用OpenGL函数进行渲染?
Nicol Bolas 2012年

1
我正在使用SDL创建OpenGL渲染上下文,并使用OpenGL函数进行渲染。我将在问题中对此进行澄清。
派生

1
也许如果您要使用物理系统,则最好查看它使用的是哪个坐标系(右手或左手,Y-UP或Y-DOWN)并继续使用。当然,您可以执行诸如反转重力之类的操作,但是我会尝试使用相同的方法来简化操作。
Gustavo Maciel 2012年

Answers:


8

“在执行此操作时,我应该在渲染方面关注什么?” - 不多。坐标系只是一个约定,而不是一成不变的规则,这是完全合法和有效的做法。只要确保您自己的用法一致,一切都会正常。


大!我唯一需要担心的是直觉自律,但这对我来说是新的领域。
派生

1
我还要补充一点,亲爱的老Quake早在1996年就这样做了,而且效果还不错。
Maximus Minimus

5

使用OpenGL在2D模式下工作时,我经常使用左上角作为原点。这可以通过以下方式完成:

glOrtho(0,      // left
        width,  // right
        height, // bottom
        0,      // top
        0,      // zNear
        1       // zFar
        );

但是,将原点更改为左上角时会有一些陷阱。

我不止一次遇到一个陷阱:glScissor(),用于裁剪,总是使用左下角的坐标。

它的签名是:

void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )

其中x, y指定左下角的剪取框的角落。

更一般而言,任何在窗口坐标中运行的功能都以左下角为原点。这包括类似功能gluProjectgluUnProjectglCopyPixels等。

但是,像一些功能glDrawPixels使用glRasterPos用于定位和glRasterPos用途对象(即转化的)的坐标

如果您在Linux上运行,并且知道如何使用man,则可能要在这里获取OpenGL手册页的副本:ftp : //ftp.sgi.com/sgi/opengl/doc/ 我发现它们是实时的-保护程序。

另外,我注意到您说的是“加载前翻转文件”纹理。这不是必需的。加载时无需翻转图像,只需翻转纹理坐标即可在渲染时从1.0变为0.0。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.