【问题标题】:OpenGL - Maintain texture width to height ratioOpenGL - 保持纹理的宽高比
【发布时间】:2016-02-11 17:55:39
【问题描述】:

我有一个 256x256 的板条箱纹理和一个两倍高的飞机。

我想保持纹理的纵横比并控制它的缩放因子,而不是将其拉伸到所有角落,如下所示。

这是我的对象数据:

// 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));

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

// 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 纹理的显示大小一致。

【问题讨论】:

  • 你要的效果是什么?当四边形比纹理宽时,您是要平铺纹理,还是调整四边​​形的大小?
  • 我想总是平铺四边形。例如,在具有许多不同大小的四边形的场景中,所有板条箱图像将具有相同大小,并在需要时进行平铺或裁剪。
  • 好的,在这种情况下,您需要根据您的纵横比调整纹理坐标。

标签: c# opengl opentk


【解决方案1】:

根据你的纵横比调整你的纹理坐标。

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

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

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

您可以只将纹理宽度和高度(或纵横比,但宽度和高度有时非常有用,所以我只是将它们分别以 float2 统一的 x 和 y 分别发送)到您的着色器,并且在那里进行更正。

来自 OP 的其他 cmets:

这行得通。通过计算平面宽度(x2 - x1) 和纹理偏移(x1 % 1),纹理现在水平对齐到“世界网格”。

// 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)};

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多