自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 资源 (6)
  • 收藏
  • 关注

原创 XR“黑话”

使用的 TW 重投影技术是方向时间扭曲 (OTW)。与 OTW 相比,使用我们的 PTW 方法的开销极低,同时也足以帮助解决 OTW 中由于 HMD 位移而出现的抖动伪像。前面说的ATW的补帧,弥补的是场景里相机的运动,这里弥补的场景里物体运动带来的变化。:可以认为是ATW重投影计算的3DOF版本,把图像视为无限远处的画面,仅引入HMD旋转带来的变量。:运动矢量,ASW里的关键信息,直观理解就是上面图片中的小箭头。

2024-03-21 11:37:23 719

原创 OpenXR Reference Space浅析

可以概括成这样计算的: Inverted(baseSpace.pose) * purePose * Space.pose。在OpenXR中space也是一个重要的模块,这里参考Monado的代码分析一下。入口是oxr_xrLocateSpace -》oxr_space_locate,二是和space的pose,以及baseSpace的pose,合到一起。其中分两个大部分,一是先获取原始的space pose,

2023-10-19 11:08:04 171

原创 XRCameraSubsystem浅析

2. ARCameraManager里会在每次Update的时候,调用XRCameraSubsystem的TryGetLatestFrame,如果有更新应该会返回true。4. 通过调用XRCpuImaged的Convert或者ConvertAsync,把原始数据转换为RGB或者灰度图等格式。在使用ARFoundtion 4.2.8版本,要获取相机图像,还是通过ARCameraManager获取的。1. 应用脚本获取ARCameraManager对象,默认是挂在AR Camera下,向其注册回调函数。

2023-07-28 17:30:53 215

原创 OpenXR Loader 浅析

在./build/intermediates/merged_native_libs/OpenGLESDebug/out/lib/目录下也可以找到loader so。在Android上的查询方式,是通过content provider实现的,如果在linux平台上,会在系统里找active_runtime.json 文件。这里是为了查询当前系统中存在的runtime,获取路径及so名称。本文是针对Android平台,进入OpenXR-SDK-Source/src/tests/hello_xr目录下,执行。

2023-05-11 17:04:51 999

原创 六轴融合算法

在3Dof姿态追踪功能中,最主要的传感器就是陀螺仪(Gyroscope),它可以提供3个轴的角加速度,对时间进行积分,就可以得出物体旋转的方向角度。但是因为硬件精度等各方面原因,会产生误差,随着时间的累积,计算得到的角度误差就会越来越大,即产生漂移。为了防止漂移,这就引入了另一个传感器,加速度计(Accelerometer)。

2023-03-24 17:20:39 795

原创 OpenGLES下读取Texture到CPU内存

首先在OpenGLES中,Texture是保存到GPU内存中的,但是有时候基于调试的需要,得把这部分内容读取到CPU内存中,保存成图片查看。Texture分为两大类,一类是Color Texture,保存的是颜色,通常是RGBA格式;另一类是Depth Texture,保存的是深度值,通常是32位的Float。对于Color Texture来说,读取内存比较简单。但是对于Depth Texture,有点麻烦。

2023-03-21 15:34:43 574

原创 编译android平台使用的opencv

本文是在ubuntu上编译android native so库首先去https://opencv.org/releases/下载opencv源码,这里用的是4.6.0版本。

2023-02-03 12:04:58 827

原创 NDK下获取vsync时间

在做渲染相关处理的时候,经常需要和Android系统的Vsync做同步,今天来说一下NDK下如何实现。ndk下专门提供了AChoreographer来做这件事,第一步要加载头文件<android/choreographer.h>。然后实际使用也很简单,获取实例,注册回调,然后就等着收到回调时间就可以了。AChoreographer *grapher = AChoreographer_getInstance();AChoreographer_postFrameCallback(gr

2021-11-08 11:00:09 2054

原创 Android平台so库动态替换

项目中有功能模块是以so库的形式集成的,想要实现类似热修复的功能,最终是利用函数指针来实现了这一功能。比如so中原有一个接口bool SendEvent(int event);那么现在不直接实现这个接口,而是中间通过一个函数指针来调用bool SendEvent_Imp(int event){ //Do something}bool (* SendEvent_Proxy)(int event) = SendEvent_Imp;bool SendEvent(int event){

2020-08-14 16:29:42 1156

原创 关于视频播放的一些总结

以前做过一些视频播放器相关的功能,当时从零开始学习,后来项目结束就放下了,时间一长都忘了,先整理些必备知识吧。生命周期Android 平台自带了播放器 Mediaplayer,使用比较方便,只需要了解下它的生命周期,就能应对些基本的功能了。(时间太长,忘了当时从哪学的了,只留下这张图片)注意几点:如果运行过程中,出现了IllegalStateException异常,那就说明调用某个方法的时候状态不对,需要检查流程。通过reset()进入 Idle state 后,如果调用错误的方法,会触发

2020-07-31 16:00:32 446

原创 EGL 环境创建

OpenGL ES 是Android绘图API,但OpenGL ES是平台通用的,在特定设备上使用需要一个中间层做适配,这个中间层就是EGL。EGL架构EGLDisplay 是对实际显示设备的抽象。EGLSurface 是对用来存储图像的内存区域 FrameBuffer 的抽象,包括 Color Buffer, Stencil Buffer ,Depth Buffer。EGLContext 存储 OpenGL ES绘图的一些状态信息。创建流程第一步通常就获取默认的显示设备 EGL_DEF

2020-07-28 17:25:18 582

原创 OpenGL ES基本流程总结

作为一个学习总结,绘制了OpenGL中完成一次渲染所需要的一些基本步骤。离屏渲染此处是以离屏渲染为例,离屏渲染是不直接上屏的,而是渲染到缓冲区中,那么这块缓冲区就需要我们手动创建,也就是上图所示的Framebuffer。其中需要三个部分来存储数据,分别是COLOR_ATTACHMENT, DEPTH_ATTACHMEN 和 STENCIL_ATTACHMENT。其中color部分就用普通的texture即可。depth 和 stencil 部分应该用renderbuffer来实现,另外也有用绑定tex.

2020-07-27 16:15:19 340

原创 NDK下监听sensor数据

Android NDK中提供了一系列接口来监听传感器数据,都包含在 <android/sensor.h> 中,所以首先要在代码中添加引用:#include <android/sensor.h>ASensorManager首先就是要获取 sensor manager,在应用里它是一个单例,只能通过接口来获取它的引用:ASensorManager * mpSensorManager = ASensorManager_getInstance();ASensorRef

2020-07-16 15:55:57 1754

翻译 Vulkan教程翻译之十六 绘制立方体

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/15-draw_cube.html绘制立方体本章节的代码文件是 15-draw_cube.cpp你快要完成了!这是把你的 Vulkan 图像上屏的最终步骤了:等待一个 Swapchain Buffer在绘制东西之前,示例程序需要一个目标 swapchain image 来进行渲染。vkAcquireNextImageKHR()函数是用来获取

2020-07-15 11:19:27 713

翻译 Vulkan教程翻译之十五 创建Graphics Pipeline

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/14-init_pipeline.html创建Graphics Pipeline本章节的代码文件是14-init_pipeline.cpp你快要凑够足够的组件来绘制一个立方体了!接下来的步骤是通过设置一个 graphics pipeline 来配置 GPU。graphics pipeline 包含 shader,pipeline layout,re..

2020-07-02 15:52:27 1124

翻译 Vulkan教程翻译之十四 创建 Vertex Buffer

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/13-init_vertex_buffer.html创建 Vertex Buffer本章节代码文件是13-init_vertex_buffer.cppvertex buffer 是 CPU 和 GPU 都可见的缓冲区,它包含描述你想要渲染的物体网格的顶点数据。一般来说,顶点数据包含位置数据(x,y,z)和可选颜色,法线,或其他信息。像其他 3D API一.

2020-06-24 10:00:49 478

原创 利用 OpenCV 转换图片颜色格式

首先说一下遇到的需求,想要做个展示camera的demo,输出的图像有 YUV 格式的 和 16位深度图。显示画面用opengl渲染到glSurfaceView上,得先把图像都转换成 RGB 格式,然后才能作为贴图渲染。这种处理用 OpenCV 就能轻易实现了,对刚接触的人来说,只是要注意颜色格式等等的设置。下面是把 yuv 转换成 rgb 的步骤:cv::Mat rawMat = cv::Mat((height + (height >> 1)), width, CV_8UC1,

2020-06-18 11:16:34 1703

原创 对字符串进行 DES 加密解密

加密和解密的过程,步骤大致相同,首先用 key 字符串生成 key_sets,然后把原文按每 8 个字符为一组进行计算,最后拼接起来。唯一的区别是在处理最后一组字符的时候,在加密的时候,如果最后一组不够 8 个,那么空余的数目作为 padding 值填到最后几个字符里。这样能保证最后一组字符长度足够。 if (block_count == number_of_blocks) { padding = 8 - length % 8; copyUChar(data_block, so

2020-06-17 16:01:00 511

翻译 Vulkan教程翻译之十三 创建 Framebuffer

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/12-init_frame_buffers.html创建 Framebuffer本章节的代码文件是12-init_frame_buffers.cppVulkan FramebufferFramebuffer 代表了一个 render pass 实例中使用的内存附件的集合。这些内存附件的例子包括我们在前面示例中创建的 color image buffe.

2020-06-16 11:28:13 931

翻译 Vulkan教程翻译之十二 编译 Shader

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/11-init_shaders.htmlShader这一章节的代码文件是11-init_shaders.cpp把GLSL Shader 编译成 SPIR-V对 Vulkan 来说,低级的 shader 代码表现为 SPIR-V。示例程序通过调用一个实用函数把用GLSL写的 shader 程序编译成 SPIR-V:GLSLtoSPV(VK_SHA.

2020-06-15 15:30:58 659

翻译 Vulkan教程翻译之十一 创建 Render Pass

创建 Render Pass这一章节的代码文件是10-init_render_pass.cpprender pass 通过指定在渲染操作中使用的附件,子通道,和依赖项的集合,来描述渲染操作的范围。render pass 至少包含一个子通道。这些信息传给驱动,使得驱动在渲染开始时知道期望的是什么,并且为渲染操作做出最佳的硬件设置。你通过调用 vkCreateRenderPass() 开始定义 render pass,然后调用 vkCmdBeginRenderPass() 和 vkCmdEndRe.

2020-06-14 11:17:52 1261

翻译 Vulkan教程翻译之十 创建 Descriptor Set

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/09-init_descriptor_set.html创建 Descriptor Set这一章节的代码文件是09-init_descriptor_set.cpp回到 pipeline_layout 例子中,你定义了 descriptor set layout,但是实际上没有分配它。回想一下,你定义 descriptor set 是用来通知 GPU 如何把.

2020-05-29 15:05:26 767

翻译 Vulkan教程翻译之九 Descriptor Set Layouts 和 Pipeline Layouts

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/08-init_pipeline_layout.htmlDescriptor Set Layouts 和 Pipeline Layouts这一章节的代码文件是08-init_pipeline_layout.cpp在之前的示例中,你创建过一个 uniform buffer,但是你还没有做任何事情来描述它如何被 shader 使用。你是知道的,该缓冲区里包含.

2020-05-29 13:52:51 1070

原创 Android Service 加载 GLSurfaceView 显示动画

先说遇到的需求,要在不影响前台应用的情况下,弹出一些通知,且样式比较花哨。所以用后台Service + GLSurfaceView的方式做个小demo,趟一趟路。实现的效果就是这样了,就是桌面有个cube一直转圈圈,不影响其他任何操作。简单来说,要做的就是,自己新创建一个View,然后通过WindowManager把它加载进去。要注意权限,在Manifest文件中声明权限,这样才能在最上层显示。<uses-permission android:name="android.p...

2020-05-22 17:29:13 752 1

翻译 Vulkan教程翻译之八 创建 Uniform Buffer

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/07-init_uniform_buffer.html创建 Uniform Buffer这一章节的代码文件是07-init_uniform_buffer.cpp你在最近的示例中已经创建过缓冲区,不妨现在再处理另一个。uniform buffer 是一个面向 shader 以只读方式访问的缓冲区,以使 shader 能够读取静态参数的数据。这又是一.

2020-05-20 14:07:18 716

原创 在 opengl 环境下将 texture 保存为 bmp 图片

首先说一下做这个功能的原因,是在应用里,有一个渲染线程,负责渲染出图,将最终的画面以texture形式传递给另一个线程,后者会再进行一些处理,然后渲染到屏幕上。那么在最后显示出来画面偶尔有花屏撕裂的现象,这样就需要确认问题出在哪一步。所以想要在中间把texture保存成图片检查一下。实现这个功能主要依赖函数 glReadPixels(),它可以把gpu里的像素值读取到cpu内存中,这样才有可能保存下来。另外一个关键点是,如何把RGBA格式的像素值写成BMP格式的文件。接下来说实现步骤,首先需要绑

2020-05-18 19:24:41 2453 4

翻译 Vulkan教程翻译之七 创建 Depth Buffer

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/06-init_depth_buffer.html创建 Depth Buffer这一章节的代码文件是06-init_depth_buffer.cppDepth buffer 是可选的,但是在最终的示例里,你需要 depth buffer 来渲染3D立方体。而且你只需要一个就能渲染每一帧,即使 swapchain 有多个 image。这是因为你在使用 sw.

2020-05-14 17:21:32 380

翻译 Vulkan教程翻译之六 创建 Swapchain

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/05-init_swapchain.html创建 Swapchain这一章节的代码文件是05-init_swapchain.cpp本章节描述了如何创建 swapchain,它是最终显示给用户的图像缓冲区列表。这是设置渲染需要的所有缓冲区的第一步。这是一张 Vulkan swapchain 的视图,它关联着系统的其他各个部分。其中一些部分我们很熟悉,剩.

2020-05-13 16:19:34 1839

翻译 Vulkan教程翻译之五 创建 Command Buffer

创建 Command Buffer这一章节的代码文件是04-init_command_buffer.cpp。基础的 Command Buffer 操作在其他图形API里,应用也许会通过API调用来设置某个属性,比如调用 glLineWidth() 设置线条宽度。在底层,驱动把API调用转换成GPU特定的命令,并且该命令放到 command buffer 里。驱动还通过创建和销毁 co...

2020-05-07 13:58:53 790

翻译 Vulkan教程翻译之四 创建(Logical)Device

创建(Logical)Device这一章节的代码文件是03-init_device.cpp下一步是创建一个对应系统里 physical device 的 VkDevice logical device 对象。logical device 是稍后用来给硬件指定图形命令的关键对象。目前为止,我们的示例已经确定了你有多少个 physical device。示例里列举 device 的实际函...

2020-05-06 13:45:28 629

翻译 Vulkan教程翻译之三 列举Physical Device

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/02-enumerate_devices.html列举 Physical Device这一章节的代码文件是 02-enumerate_devices.cpp。示例程序中的下一步就是确定系统里存在的physical device。在你创建完in...

2020-04-30 17:25:15 985

原创 Android Studio里Gradle配置多版本编译

项目上需要在Android Studio工程中,用同一套代码编译不同的版本,而其中依赖的包等等又有冲突,所以就研究了一下如何通过Gradle配置来区别开。如上图所示,我们新建一个AS工程后,打开Build Variants标签页,默认都会有两个编译选项debug 和 release,这是预置好的。我们需要做的是加入自己的定义。然后我们来看build.gradle文件,默认会有一个def...

2020-04-30 14:58:52 862

原创 Android Java/C 混合编译-JNI

基本问题-编译* 区别:Java用sdk来编,c用ndk来编* Eclipse配置配置ndk路径编译规则在Android.mk* Gradle配置修改build.gradleCmake编译,CmakeList.txtNdk编译,Android.mk// ues ndkexternalNativeBuild{ ndkBui...

2020-04-29 18:01:08 262

翻译 Vulkan教程翻译之二 创建Vulkan Instance

创建Vulkan Instance这一章节的代码文件是01-init_instance.cpp示例程序中的第一步就是创建一个Vulkan instance。在 LunarG Vulkan Sample库的API-Samples目录下找到01-init_instance.cpp 程序,在阅读本章节关于Vulkan instance的时候准备好查看代码。Vulkan Instances...

2020-04-29 15:37:47 932

翻译 Vulkan教程翻译之一 Vulkan简介

Vulkan简介Vulkan是Khronos组织开发的一套高级图形API。其他的图形API(例如OpenGL和Direct3D)要求驱动实现从高层API到适配硬件的必要转换。当时的目的是保证开发者不必去管理关于图形硬件的更复杂的细节。随着这些老旧的图形API不断地发展,它们逐渐把越来越多的底层硬件功能直接暴露给开发者。开发者要求硬件底层访问权,权衡手持设备的便捷性和安全性,这造成了高开销低...

2020-04-28 11:55:27 818

对字符串进行 DES 加密解密的实现代码

利用des算法对字符串进行加密解密运算,简单的window下控制台程序。

2020-06-17

Android Service 显示动画的demo

一个小demo,用Service + GLSurfaceView 在桌面画个立方体,显示期间不影响前台应用的逻辑,以及屏幕操作。启动的话需要用 adb 命令

2020-05-22

基于ijkplayer的简单播放器

基于B站的开源播放器ijkplayer,实现了播放本地视频文件功能 能够浏览本地文件,播放,快进快退等

2019-04-12

ijkplayer 0.8.8 编译的so

ijkplayer 版本 0.8.8 , 平台 armv7a 包含 module-lite 轻量版的,和 module-default 功能全面的

2018-07-05

安卓日历calender

安卓日历完整项目代码。目前闹钟bug未修复

2015-09-25

DIV+CSS布局

利用DIV+CSS布局网页,更加灵活,代码简洁明确。

2012-05-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除