gpt4 book ai didi

c# - 纹理映射 - 拉伸(stretch)

转载 作者:行者123 更新时间:2023-11-30 03:00:33 28 4
gpt4 key购买 nike

我正在尝试在 OpenGL 中创建一个简单的 GUI。我创建了一张图片,以便我可以引用它并使解释更简单:

texture map

当我将按钮 (32x32) 的纹理应用到大小为 120x20 的四边形多边形(即不是矩形作为纹理)时,MLMR被拉伸(stretch)成非常粗的线条,这会使按钮看起来难看。我知道通过为每个线段(TLTMTR 等)创建一个新的四边形多边形并应用一部分他们每个人的纹理,我可以避免如图所示的失真:

Distorted texture

问题 #1:我能否以某种方式将源纹理的一部分应用到四边形的确切位置?我能否将纹理的 TL/ML/BL 部分应用到四边形最左侧的垂直拉伸(stretch),然后再采用 TM/MM/BM 并在上一部分旁边水平拉伸(stretch)应用它们,等等?这是否可能并且会更快,因为我只需要 4 个顶点?

  • 换句话说,我可以只拉伸(stretch)纹理的一部分吗?垂直拉伸(stretch)一些部分,水平拉伸(stretch)一些部分,然后将这种多次拉伸(stretch)的纹理应用于多边形?

问题 #2:如果不可能,我将如何减少所需的顶点数量?创建 9x4vert 四边形需要 36 个顶点,但如果我让它们共享所有可以共享的顶点,我可以将这个数字减少到 16 个吗?

答案:

我已经工作了很长时间,手工绘制所有索引和坐标并将其放在纸上,所以我希望这对某人有用。我希望它是正确的,尽管它对我来说很好用。它在 C# 中,但将其转换为 C++ 是微不足道的。

编辑:我在这上面工作了很长时间,这是 3x3 平面的最终顶点/索引数组。

    public Vector3[] VertexData = new[]
{
new Vector3(-1.0f, -1.0f, 0.0f),
new Vector3(-0.33f, -1.0f, 0.0f),
new Vector3(0.33f, -1.0f, 0.0f),
new Vector3(1.0f, -1.0f, 0.0f),

new Vector3(-1.0f, -0.33f, 0.0f),
new Vector3(-0.33f, -0.33f, 0.0f),
new Vector3(0.33f, -0.33f, 0.0f),
new Vector3(1.0f, -0.33f, 0.0f),

new Vector3(-1.0f, 0.33f, 0.0f),
new Vector3(-0.33f, 0.33f, 0.0f),
new Vector3(0.33f, 0.33f, 0.0f),
new Vector3(1.0f, 0.33f, 0.0f),

new Vector3(-1.0f, 1.0f, 0.0f),
new Vector3(-0.33f, 1.0f, 0.0f),
new Vector3(0.33f, 1.0f, 0.0f),
new Vector3(1.0f, 1.0f, 0.0f)
};

public Vector3[] NormalData = new[]
{
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),

new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),

new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),

new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f)
};

public Vector2[] TextureData = new[]
{
new Vector2(0.0f, 1.0f),
new Vector2(0.33f, 1.0f),
new Vector2(0.66f, 1.0f),
new Vector2(1.0f, 1.0f),

new Vector2(0.0f, 0.66f),
new Vector2(0.33f, 0.66f),
new Vector2(0.66f, 0.66f),
new Vector2(1.0f, 0.66f),

new Vector2(0.0f, 0.33f),
new Vector2(0.33f, 0.33f),
new Vector2(0.66f, 0.33f),
new Vector2(1.0f, 0.33f),

new Vector2(0.0f, 0.0f),
new Vector2(0.33f, 0.0f),
new Vector2(0.66f, 0.0f),
new Vector2(1.0f, 0.0f)
};

public UInt32[] IndicesData = new UInt32[54]
{
0, 1, 5,
0, 4, 5,
1, 2, 6,
1, 5, 6,
2, 3, 7,
2, 6, 7,

4, 5, 9,
4, 8, 9,
5, 6, 10,
5, 9, 10,
6, 7, 11,
6, 10, 11,

8, 9, 13,
8, 12, 13,
9, 10, 14,
9, 13, 14,
10, 11, 15,
10, 14, 15
};

最佳答案

I know that by creating a new quad polygon for each of the segments (TL, TM, TR, etc.) and applying a part of the texture to each of them, I can avoid the distortion as shown in the picture

这正是您应该做的。

Question #2: If it's not possible, how would I go about reducing the number of vertices needed?

当然可以,而且您应该共享边相交处的顶点,因为您的纹理映射在那里是连续的,只有一阶导数发生变化,这是完全有序的。

关于c# - 纹理映射 - 拉伸(stretch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11883593/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com