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

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

我正在使用我的 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/

相关文章:

java - 如何查找位于 3D 边界内的点

ios - OpenGL ES 应用程序模板项目在 iOS 模拟器中崩溃

多维数据集的 IOS GLKit 纹理

ios - cicontext 绘制图像 :inRect:fromRect crashes in ios6

android - 如何在 Linux 和 Android 中使用 OpenGL-ES 2.0

java - glClearColor 无法正常工作(android opengl)

C++ 条件包含文件运行时

c++ - 如何避免 C++ 中的许多静态强制转换和 nullptr 检查?

c++ - 只读取也有子文件夹的目录中的 .txt 文件

c++ - 从 lambda 到模板函数指针的蹦床