<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Bleach3的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Bleach3</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Bleach3]]></copyright><item><title><![CDATA[VulkanSamples编译记录]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/144356496</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/144356496</guid><author>Bleach3</author><pubDate>Mon, 09 Dec 2024 20:17:09 +0800</pubDate><description><![CDATA[可以从GitHub上手动下载，然后把文件解压，拷到VulkanSamples/spirv-tools 目录下，再重新执行上面命令。提示错误 draw_textured_cube 是一个目录，不能生成可执行文件，是因为文件和目录有重名。再进入VulkanSamples根目录下，执行make 或者 cmake --build 命令。会生成vulkan loader和头文件，以及一个cmake文件，接下来执行。可以改一下CMakeLists文件，换个名字，然后在重新执行make。]]></description><category></category></item><item><title><![CDATA[XR“黑话”]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/136901960</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/136901960</guid><author>Bleach3</author><pubDate>Thu, 21 Mar 2024 11:37:23 +0800</pubDate><description><![CDATA[使用的 TW 重投影技术是方向时间扭曲 (OTW)。与 OTW 相比，使用我们的 PTW 方法的开销极低，同时也足以帮助解决 OTW 中由于 HMD 位移而出现的抖动伪像。前面说的ATW的补帧，弥补的是场景里相机的运动，这里弥补的场景里物体运动带来的变化。：可以认为是ATW重投影计算的3DOF版本，把图像视为无限远处的画面，仅引入HMD旋转带来的变量。：运动矢量，ASW里的关键信息，直观理解就是上面图片中的小箭头。]]></description><category></category></item><item><title><![CDATA[OpenXR Reference Space浅析]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/116797404</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/116797404</guid><author>Bleach3</author><pubDate>Thu, 19 Oct 2023 11:08:04 +0800</pubDate><description><![CDATA[可以概括成这样计算的： Inverted(baseSpace.pose) * purePose * Space.pose。在OpenXR中space也是一个重要的模块，这里参考Monado的代码分析一下。入口是oxr_xrLocateSpace -》oxr_space_locate，二是和space的pose，以及baseSpace的pose，合到一起。其中分两个大部分，一是先获取原始的space pose，]]></description><category></category></item><item><title><![CDATA[XRCameraSubsystem浅析]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/131983740</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/131983740</guid><author>Bleach3</author><pubDate>Fri, 28 Jul 2023 17:30:53 +0800</pubDate><description><![CDATA[2. ARCameraManager里会在每次Update的时候，调用XRCameraSubsystem的TryGetLatestFrame，如果有更新应该会返回true。4. 通过调用XRCpuImaged的Convert或者ConvertAsync，把原始数据转换为RGB或者灰度图等格式。在使用ARFoundtion 4.2.8版本，要获取相机图像，还是通过ARCameraManager获取的。1. 应用脚本获取ARCameraManager对象，默认是挂在AR Camera下，向其注册回调函数。]]></description><category></category></item><item><title><![CDATA[OpenXR Loader 浅析]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/130626131</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/130626131</guid><author>Bleach3</author><pubDate>Thu, 11 May 2023 17:04:51 +0800</pubDate><description><![CDATA[在./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目录下，执行。]]></description><category></category></item><item><title><![CDATA[六轴融合算法]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/129754856</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/129754856</guid><author>Bleach3</author><pubDate>Fri, 24 Mar 2023 17:20:39 +0800</pubDate><description><![CDATA[在3Dof姿态追踪功能中，最主要的传感器就是陀螺仪（Gyroscope），它可以提供3个轴的角加速度，对时间进行积分，就可以得出物体旋转的方向角度。但是因为硬件精度等各方面原因，会产生误差，随着时间的累积，计算得到的角度误差就会越来越大，即产生漂移。
为了防止漂移，这就引入了另一个传感器，加速度计（Accelerometer）。]]></description><category></category></item><item><title><![CDATA[OpenGLES下读取Texture到CPU内存]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/129689809</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/129689809</guid><author>Bleach3</author><pubDate>Tue, 21 Mar 2023 15:34:43 +0800</pubDate><description><![CDATA[首先在OpenGLES中，Texture是保存到GPU内存中的，但是有时候基于调试的需要，得把这部分内容读取到CPU内存中，保存成图片查看。
Texture分为两大类，一类是Color Texture，保存的是颜色，通常是RGBA格式；另一类是Depth Texture，保存的是深度值，通常是32位的Float。对于Color Texture来说，读取内存比较简单。但是对于Depth Texture，有点麻烦。]]></description><category></category></item><item><title><![CDATA[编译android平台使用的opencv]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/128864081</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/128864081</guid><author>Bleach3</author><pubDate>Fri, 03 Feb 2023 12:04:58 +0800</pubDate><description><![CDATA[本文是在ubuntu上编译android native so库
首先去https://opencv.org/releases/下载opencv源码，这里用的是4.6.0版本。]]></description><category></category></item><item><title><![CDATA[NDK下获取vsync时间]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/121203208</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/121203208</guid><author>Bleach3</author><pubDate>Mon, 08 Nov 2021 11:00:09 +0800</pubDate><description><![CDATA[在做渲染相关处理的时候，经常需要和Android系统的Vsync做同步，今天来说一下NDK下如何实现。

ndk下专门提供了AChoreographer来做这件事，第一步要加载头文件&lt;android/choreographer.h&gt;。

然后实际使用也很简单，获取实例，注册回调，然后就等着收到回调时间就可以了。


AChoreographer *grapher = AChoreographer_getInstance();
AChoreographer_postFrameCallback(gr]]></description><category></category></item><item><title><![CDATA[Android平台so库动态替换]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/108005648</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/108005648</guid><author>Bleach3</author><pubDate>Fri, 14 Aug 2020 16:29:42 +0800</pubDate><description><![CDATA[项目中有功能模块是以so库的形式集成的，想要实现类似热修复的功能，最终是利用函数指针来实现了这一功能。
比如so中原有一个接口bool SendEvent(int event);
那么现在不直接实现这个接口，而是中间通过一个函数指针来调用
bool SendEvent_Imp(int event){
    //Do something
}
bool (* SendEvent_Proxy)(int event) = SendEvent_Imp;
bool SendEvent(int event){
    ]]></description><category></category></item><item><title><![CDATA[关于视频播放的一些总结]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/107709311</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/107709311</guid><author>Bleach3</author><pubDate>Fri, 31 Jul 2020 16:00:32 +0800</pubDate><description><![CDATA[以前做过一些视频播放器相关的功能，当时从零开始学习，后来项目结束就放下了，时间一长都忘了，先整理些必备知识吧。
生命周期
Android 平台自带了播放器 Mediaplayer，使用比较方便，只需要了解下它的生命周期，就能应对些基本的功能了。
（时间太长，忘了当时从哪学的了，只留下这张图片）

注意几点：

如果运行过程中，出现了IllegalStateException异常，那就说明调用某个方法的时候状态不对，需要检查流程。
通过reset()进入 Idle state 后，如果调用错误的方法，会触发 ]]></description><category></category></item><item><title><![CDATA[EGL 环境创建]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/107639562</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/107639562</guid><author>Bleach3</author><pubDate>Tue, 28 Jul 2020 17:25:18 +0800</pubDate><description><![CDATA[OpenGL ES 是Android绘图API，但OpenGL ES是平台通用的，在特定设备上使用需要一个中间层做适配，这个中间层就是EGL。
EGL架构


EGLDisplay 是对实际显示设备的抽象。
EGLSurface 是对用来存储图像的内存区域 FrameBuffer 的抽象，包括 Color Buffer， Stencil Buffer ，Depth Buffer。
EGLContext 存储 OpenGL ES绘图的一些状态信息。

创建流程

第一步通常就获取默认的显示设备 EGL_DEF]]></description><category></category></item><item><title><![CDATA[OpenGL ES基本流程总结]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/107611585</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/107611585</guid><author>Bleach3</author><pubDate>Mon, 27 Jul 2020 16:15:19 +0800</pubDate><description><![CDATA[作为一个学习总结，绘制了OpenGL中完成一次渲染所需要的一些基本步骤。
离屏渲染
此处是以离屏渲染为例，离屏渲染是不直接上屏的，而是渲染到缓冲区中，那么这块缓冲区就需要我们手动创建，也就是上图所示的Framebuffer。其中需要三个部分来存储数据，分别是COLOR_ATTACHMENT, DEPTH_ATTACHMEN 和 STENCIL_ATTACHMENT。其中color部分就用普通的texture即可。depth 和 stencil 部分应该用renderbuffer来实现，另外也有用绑定tex.]]></description><category></category></item><item><title><![CDATA[NDK下监听sensor数据]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/107381719</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/107381719</guid><author>Bleach3</author><pubDate>Thu, 16 Jul 2020 15:55:57 +0800</pubDate><description><![CDATA[Android NDK中提供了一系列接口来监听传感器数据，都包含在 &lt;android/sensor.h&gt; 中，所以首先要在代码中添加引用：
#include &lt;android/sensor.h&gt;


ASensorManager

首先就是要获取 sensor manager，在应用里它是一个单例，只能通过接口来获取它的引用：
ASensorManager * mpSensorManager = ASensorManager_getInstance();


ASensorRef

]]></description><category></category></item><item><title><![CDATA[Vulkan教程翻译之十六 绘制立方体]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/107252510</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/107252510</guid><author>Bleach3</author><pubDate>Wed, 15 Jul 2020 11:19:27 +0800</pubDate><description><![CDATA[原文链接：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()函数是用来获取]]></description><category></category></item><item><title><![CDATA[Vulkan教程翻译之十五 创建Graphics Pipeline]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/107057805</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/107057805</guid><author>Bleach3</author><pubDate>Thu, 02 Jul 2020 15:52:27 +0800</pubDate><description><![CDATA[原文链接：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..]]></description><category></category></item><item><title><![CDATA[Vulkan教程翻译之十四 创建 Vertex Buffer]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/106908181</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/106908181</guid><author>Bleach3</author><pubDate>Wed, 24 Jun 2020 10:00:49 +0800</pubDate><description><![CDATA[原文链接：https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/13-init_vertex_buffer.html

创建 Vertex Buffer

本章节代码文件是13-init_vertex_buffer.cpp

vertex buffer 是 CPU 和 GPU 都可见的缓冲区，它包含描述你想要渲染的物体网格的顶点数据。一般来说，顶点数据包含位置数据（x,y,z）和可选颜色，法线，或其他信息。像其他 3D API一.]]></description><category></category></item><item><title><![CDATA[利用 OpenCV 转换图片颜色格式]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/106824946</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/106824946</guid><author>Bleach3</author><pubDate>Thu, 18 Jun 2020 11:16:34 +0800</pubDate><description><![CDATA[首先说一下遇到的需求，想要做个展示camera的demo，输出的图像有 YUV 格式的 和 16位深度图。显示画面用opengl渲染到glSurfaceView上，得先把图像都转换成 RGB 格式，然后才能作为贴图渲染。

这种处理用 OpenCV 就能轻易实现了，对刚接触的人来说，只是要注意颜色格式等等的设置。

下面是把 yuv 转换成 rgb 的步骤：


cv::Mat rawMat = cv::Mat((height + (height &gt;&gt; 1)), width, CV_8UC1, ]]></description><category></category></item><item><title><![CDATA[对字符串进行 DES 加密解密]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/106808550</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/106808550</guid><author>Bleach3</author><pubDate>Wed, 17 Jun 2020 16:01:00 +0800</pubDate><description><![CDATA[加密和解密的过程，步骤大致相同，首先用 key 字符串生成 key_sets，然后把原文按每 8 个字符为一组进行计算，最后拼接起来。

唯一的区别是在处理最后一组字符的时候，在加密的时候，如果最后一组不够 8 个，那么空余的数目作为 padding 值填到最后几个字符里。这样能保证最后一组字符长度足够。


  		if (block_count == number_of_blocks) {
			padding = 8 - length % 8;

			copyUChar(data_block, so]]></description><category></category></item><item><title><![CDATA[Vulkan教程翻译之十三 创建 Framebuffer]]></title><link>https://blog.youkuaiyun.com/Bleach3/article/details/106782045</link><guid>https://blog.youkuaiyun.com/Bleach3/article/details/106782045</guid><author>Bleach3</author><pubDate>Tue, 16 Jun 2020 11:28:13 +0800</pubDate><description><![CDATA[原文链接：https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/12-init_frame_buffers.html

创建 Framebuffer

本章节的代码文件是12-init_frame_buffers.cpp

Vulkan Framebuffer

Framebuffer 代表了一个 render pass 实例中使用的内存附件的集合。这些内存附件的例子包括我们在前面示例中创建的 color image buffe.]]></description><category></category></item></channel></rss>