mipmap一
讲一下mipmap
生成的时候 指定texture 的mipmaplevel 8 然后memory自动就会那么大的
画的时候要在lineraspace(因为我是gpucopy所以不涉及这个问题 可能)
用不同view 对应不同level
在loop里 每次对同一个texture的不同viewcopy
demo:
width = img.getWidth();
height = img.getHeight();
CopyRegion src_reg;
CopyRegion dest_reg;
TextureView src_view;
TextureView dest_view;
src_view.SetDefaults();
dest_view.SetDefaults();
#define SET_REGION(reg, w, h, d) reg.xoffset = reg.yoffset = reg.zoffset = 0; reg.width = w; reg.height = h; reg.depth = d;
for (uint32_t level = 1; level < miplevel; ++level){
SET_REGION(src_reg, width, height, 6);
width >>= 1;
height >>= 1;
SET_REGION(dest_reg, width, height, 6);
src_view.SetLevels(level - 1, 1);
dest_view.SetLevels(level, 1);
// no barrier required since copy engine do not use any cache.
cb.CopyTextureToTexture(&texture.GetTexture(), &src_view, &src_reg, &texture.GetTexture(), &dest_view, &dest_reg, CopyFlags::LINEAR_FILTER);
}
每次除以2 等于downsample linear filter
采样的时候 用texture.sample()就可以
gpu会根据srv是否有mipmap set 根据像素在两个轴的斜率来选适合的mipmap level
smaplelevel()这种函数是你想采特定levle才用得
比如你可以采样高levle看是不是很糊 textureLod(sampler,coord,level) glsl
设置trilinear filter for mipmap
--------------------------------------
一定要注意的是 mipmap在linear color space做 本来想偷懒不做。。。就变得特别暗 调了很久才想起来。
换到srgb的rt来画就可以了
浙公网安备 33010602011771号