OpenGL - 保持纹理宽高比

时间:2016-02-10 14:20:44

标签: c# opengl opentk

我有一个256x256的板条箱纹理和一个高达两倍的平面。

我想保持纹理的宽高比并控制它的缩放系数,而不是将其拉伸到所有角落,如下所示。

enter image description here

这是我的对象数据:

// Vertex Positions
Vector3 vertices = new Vector3[] {
            new Vector3( 1,  0,  1),
            new Vector3( 3,  0,  1),
            new Vector3( 3,  1,  1),
            new Vector3( 1,  1,  1)};

// Index Order
int[] indices = new int[] {0, 1, 2,   0, 2, 3};

// Texture Co-ordinates
Vector2 texcoords = new Vector2[] {
            new Vector2 (0.0f, 0.0f),
            new Vector2 (1.0f, 0.0f),
            new Vector2 (1.0f, 1.0f),
            new Vector2 (0.0f, 1.0f)};

// Normals
Vector3 normals = new Vector3[] {
            new Vector3 (0.0f, 0.0f, 1.0f),
            new Vector3 (0.0f, 0.0f, 1.0f),
            new Vector3 (0.0f, 0.0f, 1.0f),
            new Vector3 (0.0f, 0.0f, 1.0f)};

我已使用以下内容启用了纹理重复:

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, Convert.ToInt32(TextureWrapMode.Repeat));
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, Convert.ToInt32(TextureWrapMode.Repeat));

通过将纹理坐标与平面的高度和宽度相匹配,纹理会按预期重复。<​​/ p>

// Texture Co-ordinates
Vector2 texcoords = new Vector2[] {
            new Vector2 (0.0f, 0.0f),
            new Vector2 (2.0f, 0.0f),
            new Vector2 (2.0f, 1.0f),
            new Vector2 (0.0f, 1.0f)};

但是,无论平面大小如何,我都希望所有256x256纹理的大小都一致。

1 个答案:

答案 0 :(得分:2)

根据宽高比调整纹理坐标。

例如,如果您的图块具有2:1(宽度:高度)方面,则纹理坐标的范围为X上的0-2而不是0-1。这将导致纹理在X中平铺两次。

您需要检查X是否大于Y,反之亦然。如果是前者,请通过quadWidth / quadHeight缩放X.否则,通过quadHeight / quadWidth缩放texCoord.y。

这样,您的最小尺寸将从0到1,更大的尺寸将调整以匹配您的纹理方面。

你可以传递纹理宽度和高度(或宽高比,但宽度和高度有时非常有用,所以我只是将它们分别以float2制服分别发送为x和y)到着色器,在那里进行修正。

OP的其他评论:

这很有用。通过计算平面(x2 - x1)的宽度和纹理偏移(x1 % 1),纹理现在水平对齐到&#34;世界网格&#34;。

// Texture Co-ordinates
Vector2 texcoords = new Vector2[] {
    new Vector2 (TextureOffset, 0.0f),
    new Vector2 (TextureOffset + Width, 0.0f),
    new Vector2 (TextureOffset + Width, 1.0f),
    new Vector2 (TextureOffset, 1.0f)};

enter image description here