如何将纹理的 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;
在片段着色器中,我得到了 [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;