是什么决定了OpenGL ES 2.0中屏幕网格的尺寸? (使用C ++)

时间:2012-03-09 20:11:50

标签: c++ opengl-es opengl-es-2.0

我正在使用我的OpenGL ES模拟器附带的一些演示作为起点。我目前使用的演示是960x540像素,在屏幕中间绘制了一个简单的2D三角形。

我看到三角形是用浮点绘制的,屏幕的左下角是(-1,-1),而屏幕的右上角是(1,1)。

有可能改变这个吗?我想使用整数而不是浮点数,并且屏幕的左下角是(1,1),而右上角是(960,540)。

这将更容易使用,因为我计划制作2D平台游戏。我不想在这个游戏中分割任何像素;一切(纹理,玩家移动,相机移动)将符合整个像素坐标。

我尝试使用常规网格和浮点数来处理数字,以绘制一个24x24像素的直角三角形。但是,它最终在屏幕上显示为24x23像素。因此,如果有更准确,更快速的方法可以使用像素坐标,我不想继续前进。

2 个答案:

答案 0 :(得分:2)

您可以使用正交投影矩阵应用适当的变换,并将范围设置为您的分辨率。

如何制作这样的矩阵:http://db-in.com/blog/2011/04/cameras-on-opengl-es-2-x/

在顶点着色器中应用此变换,可以直接在顶点数据中提供像素坐标。

棘手的部分是,在这种情况下,像素(它们的中心)并不是整数? 事情通常是奇怪的地方=>一个合适的搜索词可能是'像素完美的OpenGL'。

0.5添加到顶点着色器中的像素坐标,然后可以作为整数提供,应该可以解决问题。注意,在顶点着色器中,你必须将整数顶点坐标转换为浮点数,如果浮点数被传递,你应该在它们之前舍入()。

如果你想现在提供标准化坐标{-1,-1} - {1,1}(我不建议这样做):

vec2 pixelSize         = 2.0 / vec2(viewportWidth,viewportHeight);
vec2 halfPixelSize     = 1.0 / vec2(viewportWidth,viewportHeight);
vec2 pixelPerfectCoord = round(coord,pixelSize) + halfPixelSize

答案 1 :(得分:0)

从顶点着色器发出的值应该可以投影到普通的OpenGL眼图空间中,但是你不需要在该空间中传入顶点。在ES 1中你已经调整了投影堆栈;你的演示有什么类似的吗?

您还应该考虑填充规则。如果像素的中心位于几何体内,则始终填充像素;如果它的中心位于边界上,则实现将通常取决于像素所在的边界 - 顶部,底部,左侧或右侧边界(如果您根据像素输出考虑更有意义;所以a左边界上的像素是扫描线上的第一个像素,右边的像素是最后一个像素,顶部的像素会在屏幕的上方开始多边形,底部的像素会将其向下延伸()。

目标是OpenGL不会在几何体在边缘相遇的位置绘制两次像素。

考虑到这一点,三角形可以正好是24像素单位高,但如果它从一个像素的中心到另一个像素的中心,它将仅绘制[最多] 23行。所以你的数学可能已经是正确的了。考虑从y = 0到y = 24的一个多边形和从y = 24到y = 36的一个多边形 - 你不希望它们都在y = 24处绘制,特别是因为它们可能是部分透明的。