绘制2D纹理而不缩放?

时间:2012-09-08 15:54:28

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

我刚刚开始玩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
};

enter image description here

1 个答案:

答案 0 :(得分: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),这将保持图像缩放并在左上角。