用 WebRTC 创建相机预览,不到 50 行核心代码就可以轻松搞定了。
WebRTC 依赖版本
直接使用官方给的版本就好了,不需要再去额外编译。
implementation 'org.webrtc:google-webrtc:1.0.30039'
后面都会使用该版本做测试的。
[阅读全文]用 WebRTC 创建相机预览,不到 50 行核心代码就可以轻松搞定了。
直接使用官方给的版本就好了,不需要再去额外编译。
implementation 'org.webrtc:google-webrtc:1.0.30039'
后面都会使用该版本做测试的。
[阅读全文]Half Lambert 模型(也叫作半兰伯特模型)在 Lambert 模型的基础之上做了一些优化。
在 Lambert 模型中,光照无法到达的区域,比如模型的背面,模型外观通常是全黑的,没有任何明暗变化,而 Half Lambert 模型就是改善这一状况。
回顾 Lambert 模型的计算公式如下:
$c_{diffuse} = (c_{light} \cdot m_{diffuse}) \cdot max (0,n \cdot I)$
[阅读全文]在标准光照模型中,可以把光照分为四种:
用一张图来表示各个光照:
而 Lambert 光照模型主要是处理物体漫反射的。
[阅读全文]光照可以说是整个计算机图形学里面最重要的部分了,当展现物体时如何模拟真实世界中的光照环境,这往往是很复杂的。
由于光是可以散射的,一个物体不仅仅可以接收来自直接光源的照射,还可以接收来自周围环境的散射光,而在渲染时,要计算周围环境的散射光就无疑加大了计算量,因为周围环境远比光源复杂多了。
下面就是一张很逼真的光照渲染实例:
如果说这是用手机拍的照片,可能我都分不出来哪里有问题,而计算机模拟真实感渲染就是追求这一目标吧。
[阅读全文]用 Unity 去显示一张图片纹理比用 OpenGL 代码去显示图片要简单多了,而这正是因为 Unity 在背后做了很多封装工作。
要显示的图片如下所示:
它的分辨率是 2560x1600 ,也就是矩形图片,并非正方形。
[阅读全文]Unity 中的 Shader 不同于 OpenGL 的 GLSL ,它是通过 ShaderLab 语言编写的。
ShaderLab 是 Unity 为开发者提供的高层级的渲染抽象层,它是一种说明性语言。
[阅读全文]在使用模板时可以显示指定模板类型,尤其是针对有返回类型的模板,显示指定可以避免类型转换带来的困扰。
但有时候显示指定模板实参类型会给用户增添额外负担,而且不会带来什么好处。
比如如下代码,接受表示序列的一对迭代器和返回序列中的一个元素的引用:
template<typename It>
??? &fcn(It beg,It end){
return *beg;
}
我们并不知道返回结果的准确类型,但知道所需类型是所处理的序列的元素类型。
vector<int> vi = {1,2,3,4,5};
auto &i =fcn(vi.begin,vi.end());
如上代码,知道函数应该返回 *beg,而且知道我们可以用 decltype(*beg) 来获取此表达式的类型。
但是,在编译器遇到函数的参数列表之前,beg 都是不存在的。为此,我们需要使用尾置返回类型。
[阅读全文]C++11 中引入了可变参数模板的特性,可变参数模板就是一个接受可变数目参数的模板函数或者模板类。
可变数目的参数被称为参数包,存在如下两种参数包:
具体如下所示,声明了一个可变参数函数模板。
// Args 是一个模板参数包;rest 是一个函数参数包
// Args 表示零个或多个模板类型参数
// rest 表示零个或多个函数参数
template <typename T,typename... Args>
void foo(const T &t, const Args&... rest);
C++ 11 引入了 std::thread 标准库,方便了多线程相关的开发工作。
说到多线程开发,可不仅仅是创建一个新线程就好了,不可避免的要涉及到线程同步的问题。
而保证线程同步,实现线程安全,就要用到相关的工具了,比如信号量、互斥量、条件变量、原子变量等等。
这些名词概念都是来操作系统里面引申来的,并不是属于哪一种编程语言所特有的,在不同语言上的表现形式不一样,但其背后的原理是一致的。
C++ 11 同样引入了 mutex、condition_variable、future 等实现线程安全的类,下面就来一一了解它们。
[阅读全文]