Shader Post-Processing Distortion【后处理之镜头畸变】

畸变(Distortion)定义

光学畸变: 现实中的光学畸变是由于摄像头镜头的物理特性造成的。例如,广角镜头可能会产生桶形畸变(Barrel Distortion),其中图像的边缘向中心凹陷;而长焦镜头可能会产生枕形畸变(Pincushion Distortion),其中图像的边缘向外膨胀。这些畸变可以通过后期处理软件进行校正。

桶形(barrel)畸变

枕形(pinchushion)畸变

Shader实现

顶点着色器:

#version 450

layout (location = 0) out vec2 outUV;

void main() 
{
	outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
	gl_Position = vec4(outUV * 2.0f - 1.0f, 0.0f, 1.0f);
}

实现的解读,参考:Vulkan 渲染不带缓冲区的全屏四边形

片段着色器:

#version 450

//用来访问一个包含多个2D纹理的纹理数组。它将采样器绑定到纹理单元1。
layout (binding = 1) uniform sampler2DArray samplerView;

layout (binding = 0) uniform UBO 
{
	layout(offset = 2576) float distortionAlpha;		//结构体字节偏移272,扭曲参数。
} ubo;

layout (location = 0) in vec2 inUV;
layout (location = 0) out vec4 outColor;

//一个常量表达式,表示纹理数组中视图层的索引。
layout (constant_id = 0) const float VIEW_LAYER = 0.0f;

void main() 
{
	const float alpha = ubo.distortionAlpha;

	//将输入纹理坐标从[0, 1]范围转换为[-1, 1]范围,并将它们存储在一个局部向量变量
	vec2 p1 = vec2(2.0 * inUV - 1.0);

	//对p1应用一个扭曲函数,并将结果存储在另一个局部向量变量,名为p2。
	//length(p1)是p1从原点的欧几里得距离。
	//这创建了一个径向扭曲效果,根据alpha的符号和大小,将纹理坐标推向或拉远中心。
	vec2 p2 = p1 / (1.0 - alpha * length(p1));
	//将p2转换回[0, 1]范围
	p2 = (p2 + 1.0) * 0.5;

	//检查p2是否在[0, 1]范围内
	bool inside = ((p2.x >= 0.0) && (p2.x <= 1.0) && (p2.y >= 0.0 ) && (p2.y <= 1.0));
	
	//根据inside的值赋值输出颜色。
	//如果inside为真,它使用samplerView和p2作为参数采样纹理数组,并将结果赋给outColor。
	//p2的第三个分量用作纹理数组的层索引,可以通过将VIEW_LAYER设置为不同的值来改变。
	//如果inside为假,它将黑色(vec4(0.0))赋给outColor。
	outColor = inside ? texture(samplerView, vec3(p2, VIEW_LAYER)) : vec4(0.0);
	//vec3(p2, VIEW_LAYER):纹理坐标+层的采样
}

alpha > 0,p2 > p1,原来位置处的纹理替换为离中心点更远处的纹理,表现出纹理坐标的 “收缩” ,是桶形畸变;

alpha < 0,p2 < p1,原来位置处的纹理替换为离中心点更近处的纹理,表现出纹理坐标的 “扩张” ,是枕形畸变。


渲染效果:

左:alpha = 0.4;右:alpha = -0.4

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: b'f-theta畸变'是激光加工中一种常见的畸变形式,因为激光束从激光源射出时会发生不同程度的偏折和聚散,进而导致在平面工作区域内形成类似于梯形形状的加工轨迹,从而影响整个加工过程的精度和质量。这种畸变通常可以通过合适的光学系统和控制算法等手段进行有效的矫正和优化。 ### 回答2: f-theta畸变是一种常见的光学畸变,也被称为二次畸变。在激光打印机、扫描仪、激光切割等光学系统中经常出现。对于一些需要非常高精度成像的光学系统,f-theta畸变就是一个非常显著的问题。 f-theta畸变的原因是来自于扫描镜的工作原理。扫描镜通过在两个方向上扫描光束来实现扫描图像,但光束在针孔前聚集和聚焦。这种聚焦在扫描平台上成像时形成了非线性畸变。一个光束的入射位置越靠近光学轴线,该光束的成像位置就越接近光学轴线,这种畸变可以表述为一个简单的二次方程,其中与第一次畸变一样的线性畸变很小,通常可以忽略不计。相对于中央的成像像素,边缘的成像像素会被扭曲。 为了抵消f-theta畸变,可以使用光学元件来调整光路。f-theta校正透镜是一种光学元件,特别设计用于矫正f-theta畸变。该透镜使光束沿着目标平面内的二维线性扫描。f-theta透镜的形状在镜面上具有非常准确的二次曲率。这种曲率可以矫正光束聚焦性,从而削弱非线性畸变。经过f-theta透镜后,成像像素的位置应该符合预期。 总之,f-theta畸变是光学系统中常见的畸变,具有非线性畸变的特征。通过使用f-theta透镜可以矫正该畸变,达到更准确的成像效果。 ### 回答3: f-theta 束流扭曲,也被称为相位扭曲,在激光加工中经常出现。俗称“瓶底形扭曲”或者“鱼眼效应”。在使用激光进行雕刻或者切割时,激光束会经过扫描镜或者光学镜头来聚焦光斑,然后精确的进行雕刻或者切割。 然而,激光束在被聚焦的过程中,由于传播不同方向的光子速度不同,导致在扫描镜或光学镜头的横向位置和纵向位置上抵消不完全的相位差异,形成了所谓的f-theta distortion。这种扭曲会导致加工的工件出现变形,这是一种主要的质量问题。 所以,在激光加工中,我们需要使扫描镜或者光学镜头聚焦所有同心圆上的光束,从而减少f-theta distortion的影响。一种减少f-theta distortion的方法是使用特殊的f-theta透镜,该透镜可以消除相位扭曲,使得所有光束在焦点处汇聚,实现更高精度的雕刻和切割。除此之外,我们也可以通过减少光路长度的方法来减轻f-theta distortion,例如,使用简短的光学路径来减小穿越光长的时间,减小激光束的扭曲程度。 总结来说,f-theta distortion是激光加工中的一个质量问题,通过使用特殊的f-theta透镜或者减小光路长度来消除扭曲,可以实现更高精度的激光加工。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值