如何将纹理的 UV 坐标映射到子矩形的 "inner" UV 坐标?

How to map UV coordinates of a texture to the "inner" UV coordinates of a sub rectangle?

在片段着色器中,我得到了 [0.0,1.0] 范围内的当前像素的 UV 坐标。但是,我不渲染整个纹理(因此在从 0.0 到 1.0 的 UV 中),而只渲染它的一个子矩形。所以我在这个着色器中得到的UV坐标只是[0.0,1.0]的一个子范围,因为其他部分在我渲染的矩形之外。

在我的着色器中,我确实想使用 [0.0,1.0] 范围内的 UV 坐标,但映射到我渲染的纹理的子矩形。

所以我的问题是:给定纹理的总大小和我渲染的该纹理的子矩形,我如何才能将给定的整体纹理的 UV 坐标转换为我子的“内部”UV 坐标矩形,但也在 [0.0,1.0]?

范围内

下面我将使用GLSL和对应HLSL类型float2的GLSL类型vec2

假设您有一个大小为 (vec2 tSize) 的纹理,纹理中的矩形区域从 vec2 tMin;vec2 tMax。您想将 [0.0, 1.0] 范围内的纹理坐标 (vec2 uv) 映射到纹理中的矩形区域。使用公式 val * (max - min) + min:

使用表达式进行映射
vec2 uvMapped = (uv * (tMax - tMin) + tMin) / tSize;

或使用GLSL函数mix (GLSL mix, corresponds to HLSL lerp):

vec2 uvMapped = mix(tMin, tMax, uv) / tSize;