mipmap一

minggoddess發表於2017-04-18

講一下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來畫就可以了 

相關文章