【问题标题】:Draw 2D texture without scaling?无需缩放即可绘制 2D 纹理?
【发布时间】:2012-09-02 04:04:29
【问题描述】:

我刚开始使用 OpenGL ES 2.0,我设法绘制了一个 256x256 的图像并填充了整个视口(大小为 320x460)。图像被缩放,如下图所示,但这不是我们想要的,我想要的是从指定的 2D 坐标以原始大小绘制图像,例如从坐标 (10, 10) 到坐标 (266, 266) ,看来我需要某种投影,但我对投影了解不多,也不知道如何入手。

任何建议将不胜感激。

编辑

我刚刚找到this,现在我知道这是因为我指定的顶点填充了整个视口。现在我的问题是如何将图像映射到纹理坐标系?如何计算 4 个顶点中每个顶点的 XY 坐标,以便图像可以正好适合纹理表面而无需缩放?

EDIT2

非常感谢@Slartibartfast,就这么简单,我觉得自己很笨,一开始就做错了。

如果其他人需要,以下是我指定的顶点,用于从左上角绘制那只可爱的小驴:

typedef struct {
    float position[2];
    float textureCoor[2];
} Vertex;

const Vertex vertices[] = {
    {{-1, 1}, {0, 0}},
    {{0.6, 1}, {1, 0}},
    {{0.6, -0.113}, {1, 1}},
    {{-1, -0.113}, {0, 1}},
};

const GLubyte indices[] = {
    0, 1, 2,
    2, 3, 0
};

【问题讨论】:

  • 如果您能显示您当前正在使用的代码,这可能会对我们有所帮助。
  • 有什么理由不能让视口与图像的纵横比相同?
  • 我刚刚编辑了我的问题,现在问题转向如何进行计算顶点的数学运算,我不擅长:(
  • 我通过缩放顶点解决了这个问题,但我只在数组中使用了 8 个浮点值。你好像有 20 个?
  • 您能否详细说明如何缩放顶点?我实际上只使用了 8 个浮点数(它是 4 个顶点),Z 轴的值是多余的,我可以删除它。 Vertex 结构的textureCoor 数组是纹理的坐标。

标签: ios opengl-es opengl-es-2.0 textures projection


【解决方案1】:

据我所知。如果您想将图像精确映射到屏幕上,您需要指定的顶点必须进行相应的缩放。

您在 X 和 Y 维度上都使用了从 -1 到 1 的坐标。现在,这指定了整个屏幕尺寸,您可以在指定视口时访问这些尺寸。 设屏幕尺寸为 sw 和 sh,图像尺寸为 tw 和 th。

由于以顶点坐标表示的屏幕宽度 (sw) 为 2(-1 到 1),因此图像覆盖的宽度将为 2*tw/sw。同样高度是 2*th/sh。

现在您可以指定从 (-1,-1) 到 (-1 + 2*tw/sw, -1 + 2*th/sh) 的顶点,这将使图像保持缩放并绘制在左上角。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多