Android emulator
步骤一:下载并放置 Command Line Tools
打开
https://developer.android.com/studio?hl=zh-cn#command-line-tools-only,下载 Windows 版的 command line tools 压缩包(名字类似commandlinetools-win-xxxxxxx_latest.zip)。在某个目录创建 SDK 根文件夹,比如
C:\android-sdk。解压压缩包,你会得到一个
cmdline-tools文件夹,里面有bin、lib等。注意:需要再套一层latest,最终目录结构必须是这样:
1 | C:\android-sdk\ |
全屏Pass的效率
之前在Bufferless rendering in OpenGL提到使用一个三角形渲染全屏的方法,没想到此处犹有后续。使用包含全屏范围的三角形和scissor test,实现一个三角形渲染全屏的效率,比两个三角形组合成一个全屏quad的方法更高效。
截帧工具在渲染子进程中的使用
记录一下渲染子进程中的截帧工具的使用,记录原因是,一开始并不顺利。目标程序是一个launcher进程,然后需要截帧的是子进程,渲染时OpenGL的,话说几个月前,通过RenderDoc的Capture Child Processes配置是成功截取过的,但是这次失效了,连同Nsight Graphics也遇到了问题。经过一些摸索,最终在两个工具中都能顺利截帧,在此记录一下。
RenderDoc
RenderDoc设置Capture Child Processes,但是启动子进程一直失败,先是尝试使用File>Attach
to runing Instance未奏效,然后尝试进程注入。
文本生成图表方法
不太会画各种流程图,但是有时候又不得不画一个糙图交差。之前倒是用过puml,但是想用一个又简单又能立即显示的工具,简单找了一下文本生成流程图的做法,第一种markdown中写mermaid最为简单直观;第二种\(\LaTeX\)的TikZ,很重型了,但是排版起来会很好看。
Mermaid
Mermaid 是一个用纯文本生成图表的 JavaScript 库。通过mermaid语法描述图的结构和关系,它就能自动渲染成流程图、时序图、甘特图等可视化图表,不需要手动拖拽画图。
近平面焦平面成像平面
GLSL-PathTracer
1 | float scale = tan(camera.fov * 0.5); |
刚开始看这段代码的时候,没有想清楚代码里预设的内容,也即成像平面的距离是1;这里面注意两个地方,成像平面(的距离,z方向的位移)上的点来确定光线的方向,以及对焦距离确定对焦点。
Reflective Shadow Maps
- 方法
- A reflective shadow map is an extension to a standard shadow map, where every pixel is considered as an indirect light source.
- 一次bounce间接光照的粗糙近似
- survey
- soft shadow方法
- RSM都可以结合
- Instant Radiosity
- pass太多
- ray tracing
- 难做到高分辨率的交互/实时
- soft shadow方法
- 算法
- 公式
- reflective shadow map,from light view
- depth
- world-space position
- normal
- reflected flux
- 光照计算
- 采样shading位置周围的rsm像素,作为间接光照光源
- screen space interpolation
- 先渲染低分辨率的间接光照,然后在渲染完整分辨率的间接光照,如果着色点周围的低分辨率位置可用(世界坐标足够近),就使用低分辨率结果插值得到,否则,就通过完整的采样计算
- 采样shading位置周围的rsm像素,作为间接光照光源
- 公式
- 局限
- 只考虑diffuse
- 不考虑间接光照光源的遮挡关系
- 着色点只考虑距离范围内的像素影响
- 细节
- 次级光源的可视性,是通过发现和光线方向的cos判断的(
),也就是文章里的 their normal points away from x
- 次级光源的可视性,是通过发现和光线方向的cos判断的(
C++ vector扩容导致的OpenGL资源析构
问题
Mesh类,包含vao/vbo/ibo这些OpenGL资源,包含了析构函数,在释放资源时候通过glDeleteBuffers 和 glDeleteVertexArrays销毁了这些资源。Mesh通过std::vector管理,添加Mesh使用了push_back或emplace_back,会导致不同的Mesh持有的vao/vbo/ibo一样。 几个问题:
- 析构后,vao/vbo/ibo应该设置成一个无效值
- std::vector没有分配足够内存,插入元素后,可能导致空间的重新分配,旧元素的拷贝或移动到新位置,旧元素内存析构掉。
- 一个OpenGL资源申请、释放、在申请,可能是同一个id
