2012-03-09 46 views
1

我使用一些与我的OpenGL ES仿真器一起提供的演示作为起点。我目前使用的演示是960x540像素,在屏幕中间绘制了一个简单的2D三角形。什么决定了OpenGL ES 2.0中的屏幕网格的尺寸? (使用C++)

我看到三角形已经用浮动画出,屏幕的左下角是(-1,-1),而屏幕的右上角是(1,1)。

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

因为我打算制作2D平台游戏,所以这会容易得多。我不想在这个游戏中分割任何像素;一切(纹理,玩家移动,相机移动)都将符合全像素坐标。

我试着嘎吱嘎吱的数字(使用常规网格和浮点数)绘制一个24x24像素的直角三角形。但是,它最终在屏幕上是24x23像素。所以我不想继续前进,如果有更准确,更快的方法可以使用像素坐标。

回答

0

从顶点着色器出来的值应该准备投影到普通的OpenGL眼图空间中,但不需要在该空间中传递顶点。在ES 1中,你已经调整了投影堆栈;你的演示有没有类似的东西?

您还应该考虑填充规则。如果像素的中心位于几何图形内,则像素总是被填充;如果它的中心位于边界上,那么实现将通常根据像素在哪个边界上 - 顶部,底部,左侧或右侧边界来做出决定(如果按照像素输出来考虑,这会更有意义;因此,左边界上的像素是第一个在扫描线上的像素,右侧的像素将是最后一个像素,顶部的像素将开始多边形在屏幕的上方,底部的像素会将其向下延伸)。

目标是OpenGL不会在几何图形在边缘上遇到两次时绘制像素。因此,三角形的高度可以是24个像素单位,但如果它从一个像素的中心到另一个像素的中心,它将只绘制[最多] 23行。所以你的数学可能已经是正确的了。考虑从y = 0到y = 24的一个多边形和从y = 24到y = 36的多边形 - 你不希望它们都在y = 24处绘制,特别是因为它们可能部分透明。

+0

演示确实有4x4矩阵,注释:“用于投影模型视图的矩阵”。它的对角线上有1,下降到其他地方的零。你会推荐我在那里放什么号码? – Jourgen 2012-03-09 23:20:15

+0

按照我输入的方式思考,我想你想用2/960来缩放x,所以把它放在左上方,y放2/540,然后沿着主对角线放置下一个,然后你想把中心移到底部左边,所以在x上是负数,在y上是负数,在每种情况下都是-1,所以这些会在最后一列的前两位中出现。在标准GL术语中,作为将是{2.0f/960.0f,0.0f,0.0f,0.0f,0.0f,2.0f/540.0f,0.0f,0.0f,0.0f,0.0f,1.0 f,0.0f,-1.0f,-1.0f,0.0f,1.0f} – Tommy 2012-03-09 23:31:44

+0

刚试过你的矩阵,它的工作完美。现在,我绘制的所有形状都完全取决于我所期望的形状。谢谢! – Jourgen 2012-03-09 23:59:54

2

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

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

应用在顶点着色器此转换,使您可以直接在顶点数据提供像素COORDS。

棘手的部分是,在这种情况下,像素(其中的中心)不在整数位置! 这是事情通常变得奇怪的地方=>适当的搜索词可能是'像素完美的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 
+3

有什么有助于理解奇怪的是将OpenGL坐标视为_continuous_空间(浮点数而不是整数)。像素是小方块,整数坐标在像素之间。这就像标尺上的刻度线,像素是刻度线之间的空格。 – Thomas 2012-03-09 22:47:07

+0

现在我想到了,击中中心的像素非常有意义。您提供的链接对理解投影矩阵也有非常有用的图像(图像的标题为:“Matrix 4x4和四元数的可视化表示”)。感谢您的答案。 – Jourgen 2012-03-09 23:56:50