TL; DR:有没有办法缩小UV贴图和纹理而不会降低生成结果的质量?
全文:
我正在尝试开发一个简单的渲染引擎,它将从.EXR文件中获取UV贴图,在其上放置纹理并提供给客户端。整个过程如下:
from PIL import Image
import numpy as np
texture = Image.open("texture.png")
texture_array = np.asarray(txt).transpose(1, 0, 2)
# assume reading EXR file and grabbing only R and G channels from it
uv = read_exr()
# scale indexes to texture size
uv[..., 0] *= texture.size[0]
uv[..., 1] *= texture.size[1]
map = uv.astype('uint16')
# use numpy indexing to produce the result
result = texture_array[map[..., 0], map[..., 1]]
# downsample for smoother image
image = Image.fromarray(result, "RGB").resize((2048, 2048), Image.LANCZOS)
制作的图像是衬衫,纹理实际上是织物扫描。 UV实际上由几个文件组成,因为衬衫的每个部分可能有不同的选项。
高分辨率下一切正常,但我想在网页上制作一个“预览”版本。现在问题是,当我尝试缩放UV和纹理时,结果对于具有大图案的织物来说看起来不错。例如。有很多细线的面料会产生类似莫尔条纹的效果。以下是浏览器按比例缩小的高分辨率结果示例(这是可以接受的):
以下是我如何缩放纹理和UV:
from scipy.ndimage.interpolation import zoom
uv = zoom(uv, [0.25, 0.25, 1], order=1) # higher order produces negative values
texture = texture.resize((1024, 1024), Image.LANCZOS)
我也尝试使用cv2
进行UV缩放,但它给出了相同的结果。
能够构建此缩略图版本至关重要,因为高分辨率版本的构图需要几秒钟,缩略图构建需要一秒钟。不幸的是,由于存在大量不同的选项,我无法预先渲染所有可能的组合。
我想知道是否有一些技巧可以使低分辨率结果看起来更好,理想情况下看起来与下采样的“原始”图像相同。我真的很感激任何想法,因为我对图像处理知之甚少,到目前为止找不到任何合适的解决方案。
这是我尝试过没有运气的事情: