您当前的位置: 首页 >  3d

qianbo_insist

暂无认证

  • 0浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

sdl2 opengl d3d9的mipmap和各项异性过滤渲染

qianbo_insist 发布时间:2022-04-03 15:54:08 ,浏览量:0

opengl

sdl支持的驱动

驱动支持 列出后可以根据自己的需求去做,如果没有驱动就使用software去做就好了,以下列出对比,视频源为1280 720 的摄像头,使用RGB24来测试

opengl

CPU占用率在1.3% 到 1.5% 之间 GPU在5%到6.2%之间

D3D9

cpu 占用率在0.9 到1.6 之间 GPU在5%到6.2%之间

D3D11

CPU 占用率在0.7%到2.0% 之间 GPU在4.6%到5.7%之间 DEBUG 和RELEASE 并没有多大差异。 三者清晰度基本一致。

software

CPU 占用率在0.6%- 1.6%之间 GPU为零

测试代码

以下代码有冗余


int ret = cap.OpenCameraRGB(name.c_str(), w, h);
	if (ret != 0)
		return -1;

	int					screen_w, screen_h;
	SDL_Window			*screen = NULL;
	SDL_Window          *screenD3D = NULL;
	SDL_Window          *screenD3D11 = NULL;
	SDL_Renderer		*sdlRenderer = NULL;
	SDL_Renderer		*sdlRendererD3D = NULL;
	SDL_Renderer		*sdlRendererD3D11 = NULL;
	SDL_Texture			*sdlTexture = NULL;
	SDL_Texture			*sdlTextureD3D = NULL;
	SDL_Texture			*sdlTextureD3D11 = NULL;
	SDL_Rect			sdlRect;
	SDL_Thread			*video_tid;
	SDL_Event			event;
	
	SDL_Init(SDL_INIT_VIDEO |  SDL_INIT_TIMER);
	SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");
	//SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
	//SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);

	int MODE =-1;
	screen_w = w; 
	screen_h = w *9 /16;
	//screen_h = screen_w * 9 / 16;

   if (MODE == -1)
	screen = SDL_CreateWindow("FF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
		640, 360, SDL_WINDOW_SHOWN/* SDL_WINDOW_OPENGL*/); //,
   else if(MODE == 0)
	screenD3D = SDL_CreateWindow("FFD3D", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
		640, 360, SDL_WINDOW_SHOWN/* SDL_WINDOW_OPENGL*/);
   else if(MODE == 1)
	screenD3D11 = SDL_CreateWindow("FFD3D11", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
		640, 360, SDL_WINDOW_SHOWN/* SDL_WINDOW_OPENGL*/);

	for (int i = 0; i format), D3DPOOL_DEFAULT, &texturerep->texture, NULL);

//1 改成0 ,
各项异性过滤加上,mipmap 生成等级map加上,结果出问题
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
		IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
		IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

在d3d9 的render里面修改使用后,sdl 窗口大小必须和纹理大小一样,否则黑屏。所以这个方式就没有用了。

显示正确方法

前面得修改都去除,sdl 源代码不修改,如果直接使用ffmpeg的缩小方法,缩放到和窗口一样大小,那直接显示就非常好了。下面对比以下 这是由 在这里插入图片描述

总结

前面使用了一堆好的方法,sdl最后放到窗口上时没有算法保证过滤。这个要修正。

不使用sdl

不使用sdl,直接使用opengl 或者 direct3d是比较合适的。快速地做出一个显示效果可以使用sdl,不建议在产品中使用。

关注
打赏
1663161521
查看更多评论
立即登录/注册

微信扫码登录

0.0391s