gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:29:07 26 4
gpt4 key购买 nike

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

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

是否可以更改此设置?我想使用整数而不是 float ,并且屏幕的左下角是 (1,1) 而右上角是 (960,540)。

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

我尝试处理数字(使用常规网格和 float )来绘制一个 24x24 像素的直角三角形。然而,它最终在屏幕上变成了 24x23 像素。所以如果有更准确、更快的方法可以使用像素坐标,我不想继续前进。

最佳答案

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

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

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

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

0.5 添加到顶点着色器中的像素坐标,然后可以将其作为整数提供,应该可以解决问题。请注意,在顶点着色器中,您必须将整数顶点坐标转换为 float ,如果传递的是 float ,您应该先对它们进行 round()。

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

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

关于c++ - 什么决定了 OpenGL ES 2.0 中屏幕网格的尺寸? (使用 C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9640337/

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