sdl2 opengl d3d9的mipmap和各项异性过滤渲染
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 < SDL_GetNumRenderDrivers(); ++i){SDL_RendererInfo rendererInfo = {};SDL_GetRenderDriverInfo(i, &rendererInfo);cout <<i<<" "<< rendererInfo.name << endl;//if (rendererInfo.name != std::string("direct3d11"))//{// continue;//}}if (MODE == -1){sdlRenderer = SDL_CreateRenderer(screen, 4, SDL_RENDERER_SOFTWARE);sdlTexture = SDL_CreateTexture(sdlRenderer,SDL_PIXELFORMAT_BGR24, //SDL_PIXELFORMAT_IYUV, //SDL_PIXELFORMAT_BGR24SDL_TEXTUREACCESS_STREAMING,/*SDL_TEXTUREACCESS_STREAMING,*/w, h);}else if (MODE == 0){sdlRendererD3D = SDL_CreateRenderer(screenD3D, 0, SDL_RENDERER_ACCELERATED);sdlTextureD3D = SDL_CreateTexture(sdlRendererD3D,SDL_PIXELFORMAT_BGR24, //SDL_PIXELFORMAT_IYUV, //SDL_PIXELFORMAT_BGR24SDL_TEXTUREACCESS_STREAMING,/*SDL_TEXTUREACCESS_STREAMING,*/w, h);}else if (MODE == 1){sdlRendererD3D11 = SDL_CreateRenderer(screenD3D11, 1, SDL_RENDERER_ACCELERATED);sdlTextureD3D11 = SDL_CreateTexture(sdlRendererD3D11,SDL_PIXELFORMAT_BGR24, //SDL_PIXELFORMAT_IYUV, //SDL_PIXELFORMAT_BGR24SDL_TEXTUREACCESS_STREAMING,/*SDL_TEXTUREACCESS_STREAMING,*/w, h);}sdlRect.x = 0;sdlRect.y = 0;sdlRect.w = w;sdlRect.h = w*9/16;video_tid = SDL_CreateThread(sfp_refresh_thread, NULL, NULL);int got_picture;for (;;){SDL_WaitEvent(&event);if (event.type == SFM_REFRESH_EVENT){uint8_t *frame = cap.QueryFrame();if (frame != NULL){//int y = screen_h * 2 / 3;if (MODE == -1){SDL_UpdateTexture(sdlTexture, NULL/*&sdlRect*/, frame, w * 3);//SDL_UpdateTexture(sdlTexture, &sdlRect, out_buffer + W * H * 3, -W * 3);SDL_RenderClear(sdlRenderer);SDL_RenderCopy(sdlRenderer, sdlTexture, &sdlRect,NULL);SDL_RenderPresent(sdlRenderer);}else if (MODE == 0){SDL_UpdateTexture(sdlTextureD3D, NULL/*&sdlRect*/, frame, w * 3);//SDL_UpdateTexture(sdlTexture, &sdlRect, out_buffer + W * H * 3, -W * 3);SDL_RenderClear(sdlRendererD3D);SDL_RenderCopy(sdlRendererD3D, sdlTextureD3D, &sdlRect, NULL);SDL_RenderPresent(sdlRendererD3D);}else if (MODE == 1){SDL_UpdateTexture(sdlTextureD3D11, NULL/*&sdlRect*/, frame, w * 3);//SDL_UpdateTexture(sdlTexture, &sdlRect, out_buffer + W * H * 3, -W * 3);SDL_RenderClear(sdlRendererD3D11);SDL_RenderCopy(sdlRendererD3D11, sdlTextureD3D11, &sdlRect, NULL);SDL_RenderPresent(sdlRendererD3D11);}}}else if (event.type == SDL_KEYDOWN){if (event.key.keysym.sym == SDLK_SPACE)thread_pause = !thread_pause;}else if (event.type == SDL_QUIT){thread_exit = 1;}else if (event.type == SFM_BREAK_EVENT){break;}}
sdl2 渲染问题
sdl2 的渲染里面并没有再高级的放大缩小算法,在大的图像缩小时会产生不舒服的纹理,需要滤波算法,这需要修改源码。
sdl opengl 渲染
screen = SDL_CreateWindow("FFGL", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,640, 360, SDL_WINDOW_OPENGL); //,glContext = SDL_GL_CreateContext(screen);if (glContext == NULL){// Display error messageprintf("OpenGL context could not be created! SDL Error: %s\n", SDL_GetError());return false;}else{glewInit();}
使用opengl 要创建opengl得窗口,并且产生mipmap图像,就能够比较清晰,这个要自己写的,sdl2 里面并没有加入这个方法,但是这个方式是可以的,需要自己写opengl的代码,下面使用d3d9,在sdl2 中d3d9也并没有使用mipmap 图像,也没有使用各项异性过滤。
修改sdl d3d9代码
/* setup default renderstate */IDirect3DDevice9_SetRenderState(m_d3d_device, D3DRS_SRCBLEND, D3DBLEND_ONE);IDirect3DDevice9_SetRenderState(m_d3d_device, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);IDirect3DDevice9_SetRenderState(m_d3d_device, D3DRS_ALPHAFUNC, D3DCMP_GREATER);IDirect3DDevice9_SetRenderState(m_d3d_device, D3DRS_ALPHAREF, (DWORD)0x0);IDirect3DDevice9_SetRenderState(m_d3d_device, D3DRS_LIGHTING, FALSE);IDirect3DDevice9_SetSamplerState(m_d3d_device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);IDirect3DDevice9_SetSamplerState(m_d3d_device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
找到所有Create_Texture 的代码
result = IDirect3DDevice9_CreateTexture(device, texturerep->w, texturerep->h,1, texturerep->usage,PixelFormatToD3DFMT(texturerep->format), D3DPOOL_DEFAULT, &texturerep->texture, NULL);
修改成
result = IDirect3DDevice9_CreateTexture(device, texturerep->w, texturerep->h,0, texturerep->usage,PixelFormatToD3DFMT(texturerep->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,不建议在产品中使用。
sdl2 opengl d3d9的mipmap和各项异性过滤渲染相关推荐
- opengl 三线性和各项异性过滤
概念 在纹理倾斜的时候如何设置边缘模糊,否则图像看起来会很怪异,对眼睛不适合,这个技术其实ffmpeg做得非常好,在合适的参属下,ffmpeg缩小会把这些做好. 各项异性过滤 Anisotropic ...
- OpenGL蓝宝书源码学习(十)第五章——纹理的应用、Mip贴图、各项异性过滤和纹理压缩基础
一.纹理应用 1.纹理坐标 我们是通过为每个顶点指定一个纹理坐标而直接在几何图形上进行纹理贴图的.纹理坐标要么是指定为着色器的一个属性,要么通过算法计算出来.纹理贴图中的纹理单元是作为一个更加抽象的纹 ...
- 各项异性滤波简介Anisotropic Filtering(AF)
本文主要整理简绍来自互联网的各项异性滤波的知识. 原文链接:http://www.linuxgraphics.cn/graphics/using_anisotropic_texture_filteri ...
- 各项异性扩散滤波 -- OpenCV实现
/*********************************** *功能 -- 各项异性扩散滤波 *by 垚 *visual studio 2010 & windows 7 ultim ...
- 各项异性扩散(Anisotropic diffusion)--算法简介(python)代码实现
各项异性扩散(Anisotropic diffusion)–算法简介(python)代码实现 学习博文 https://blog.csdn.net/qq_38784098/article/detail ...
- 图形学基础|各项异性与头发渲染
图形学基础|各项异性与头发渲染 文章目录 图形学基础|各项异性与头发渲染 一.前言 二.各向异性光照 2.1 各向异性光照现象 2.2 ShadingModel扩展 三.头发光照模型 3.1 Kaji ...
- 次时代游戏头发各项异性流光flowtexture绘制探析
一直以来忙于次时代项目研发工作,少有时间去好好总结沉淀一下,半年前就打算想写点东西分享交流一下,直到今天才有时间真正去执笔. 参与过次时代项目的同学,大多都接触过一个各项异性的概念,今天我想分享的内容 ...
- 各项异性高光 Kajiya-Kay TDir or BDir
在做Kajiya-Kay各项异性高光的时候,我们会使用半角向量(hDir)和模型的切线方向进行点积.但有时候用切线方向的效果不正确,用副切线方向确有正确的效果. 那么什么时候改用切线,什么时候用副切线 ...
- 热传导与图像处理:非线性各项异性扩散
首先,用通俗的语言说明两个基本概念,非线性和各向异性 非线性,可以从线性说起,不严谨的说,如果两个变量之间的关系是一次函数,那么就说他们是线性关系,比如一维的一条直线: y=kx+b,k和b都是实数, ...
最新文章
- oracle重建实例_记一次误删Oracle控制文件并恢复过程
- linux中why软件,why?why?why?
- SAP PP 启用了MRP Area之后MMBE有什么变化?
- Javascript操纵Cookie--转
- Centos下重要日志文件及查看方式
- 【Python】用Python实现十大经典排序算法
- 处理对象的多种状态及其相互转换——状态模式
- android listview动态加载网络图片不显示,Android Listview异步动态加载网络图片
- android gdb 远程调试工具,Android下用gdb远程调试办法
- ICCV NAS Workshop 最佳论文提名:通过层级掩码实现高效神经网络架构搜索
- hdu 1133 Buy the Ticket(递推+精度精算)
- ActiveMQ(4) ActiveMQ JDBC 持久化 Mysql 数据库
- vs C++实现Socket通信、添加ws2_32.lib 动态链接库
- Xcode7 launchscreen.storyboard真机启动黑屏,且不能适配,模拟器没问题
- HTL5 JavaScript里的DOM节点简单思维导图(元素节点,文本节点,节点的增删改查) 高清可打印
- c语言中函数名可不可以由用户命名,C语言中变量名及函数名的命名规则与驼峰命名法...
- 手把手实操系列|贷中逾期风险预测模型开发流程(上)
- 计算机人才供需状况和就业形势分析,计算机科学与技术就业形势分析
- HDOJ 1846 Brave Game(巴士博弈)
- TI公司三大系列DSP内部结构之比较
热门文章
- java socket 抓包_linux下用socket的抓包程序
- 诗哲魂:制约中国互联网发展瓶颈在哪里?
- 苹果2024年推出真全面屏iPhone 但可能只是高端版
- 车主高速充电1小时排队4小时 国庆高速公路每日充电量创新高
- iPhone 13拍照马赛克、换屏无法解锁Face ID、iPad mini 6“果冻屏”:等“百香果”吧...
- 8599元起!三星Galaxy Z Fold3/Flip3 5G折叠手机国行即将发货
- 一线城市夫妻“双城记”:带板凳上地铁,从江苏坐到江苏路站
- iPhone工厂骚乱损失至多712万美元?纬创资讯回应...
- iPhone 12 Pro火爆程度超预期 苹果紧急向关键组件厂商加单
- 华为Mate 40 Pro屏幕贴膜曝光:双孔曲面屏实锤?