wingstone / wingstone.github.io Goto Github PK
View Code? Open in Web Editor NEWwingtone's blog
Home Page: http://wingstone.github.io
wingtone's blog
Home Page: http://wingstone.github.io
针孔相机就是传统的透视相机,由于针孔无限小,这样从针孔投射的光线是唯一的,针对投影平面来说;投射光线的唯一也就导致无法多采样产生景深效果;
薄透镜相机是对传统透镜的模拟,只不过忽略了透镜的实际厚度影响;为了模拟真实的相机,需要加入光圈、焦距、焦平面距透镜距离(像距);整个相机的示意图,光圈所在位置实际就是透镜所在位置;关键的问题是如何根据相机模型,以及屏幕(像平面)上坐标获取所发射出来的射线;过程如下:
猫眼效应与暗角形成的原因,要从实际的相机模型来思考;实际的相机镜头是圆筒状的,这就导致光圈中心的光通量比较充足,而沿着光圈边缘的光线有很大概率会被镜筒遮挡住;从而导致屏幕边缘的亮度较弱,且会产生轻微畸变;
知道原理后,模拟方法就比较简单了:
实际的相机是放置相应的透光图案至于镜头前产生该效果(及镜筒的头部)
模拟方法一:我们只需要在光圈采样时,能在相应图案的范围内进行采样即可;
模拟方法二:根据实际产生的原理,去计算采样光线与镜头头部平面的交点,然后判断该交点是否在相应图案内,舍弃图案外的光线即可;
一般的投射相机在广角很大时,会产生很大的透视畸变;采用鱼眼镜头可以处理超过后180度广角的情况,和一般的镜头不一样,鱼眼镜头拍摄的相片允许很重的Barrel Distortion,也就是说现实中的一条直线在相片中允许被扭曲成弯曲的形状。
鱼眼镜头类似于环境相机,只不过同样是将像素坐标映射到球坐标系,两者的映射方法不同;环境相机是将像素坐标x、y作为球坐标系下的两个夹角维度;而鱼眼镜头的映射要看具体的模拟方法;
鱼眼镜头的一种模拟方法叫做等立体角投影(Equisolid Angle Projection);等立体角投影的定义是,图像上每个像素位置到图像中心位置的距离与此像素出射光线方向和相机方向间的夹角大小成正比。也就是说,每个像素所覆盖的立体角大小是相等的。
模拟方法为:
参考,
所谓管线就是一个流程,针对硬件来说,处理一个图元有一个硬件渲染流程(Graphic Pipeline);针对实际应用来说,渲染一帧画面也需要一个渲染流程(Render Path);
具体的管线流程要看实际的硬件驱动,Direct3D每一个版本都有很大的改动,这里以Direct3D11为例进行介绍;具体的文章参考可以看这里:Direct3D 11 Graphics Pipeline,Direct3D 12 Graphics Pipeline;
这一阶段主要进行图元的装配,先从用户填充的缓冲中读取数据,然后将数据装配成图元;此阶段可装配成不同的图元类型(如 line lists, triangle strips, or primitives with adjacency)
一个可编程shader阶段,此阶段主要处理IA阶段输入的顶点,执行每顶点的处理(如变换、蒙皮、变形,顶点光照等);VS阶段总是处理单一顶点,并输出单一顶点;VS阶段必须处于激活状态,VS必须提供;
该阶段实际上有三个小阶段来完成图元的细分;通过硬件实现细分,GPU Graphic Pipeline能将低细节的模型转换为高细节模型进行渲染;
一个可编程shader阶段,用来生成一个patch(和patch constants),每个patch对应一个输入的patch(quad, triangle, or line);
有点像一个基本的图元类型;
一个固定处理阶段,用来生成简单格式的域,一个域代表一个geometry patch并用来生成更小物体的集合(triangles, points, or lines),通过连接domain sample来实现;
一个可编程shader阶段,用来计算每个domain sample的顶点的位置,
一个可编程shader阶段,该阶段同样以顶点作为输入,以顶点作为输出;但与VS有很大不同;
该阶段的目的在于能够从不断的GS阶段输出顶点数据,至一个或多个缓存中;
此阶段,将每个图元光栅化为像素,通过顶点差值来计算像素信息;光栅化过程总是运行顶点裁剪,透视除法,将顶点转换为齐次裁剪空间,然后将顶点映射到视口上;
一个可编程shader阶段,该阶段能够使用更加丰富的着色技术(每像素光照,后处理效果);该阶段能够将常量,纹理数据,顶点差值数据以及其他数据进行计算,从而产生像素的输出;
该阶段生成最终的像素颜色,通过管线状态的整合,即:PS阶段生成的数据,如render target、depth/stencil buffer;OM阶段是用来决定可见颜色的最后一步,并且会Blend最终的像素颜色;
由于github blog暂时还没有安装成功,所以这些想法想写到这里,之后再移至博客
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.