投影融合软件 总结系列 网格篇

写在前面:

如果融合软件是运行在window系统,一定要选择d3d11做绘制低层api,不要使用OpenGL!不要使用OpenGL!不要使用OpenGL。

网格是投影融合矫正的基础,投影融合的矫正部分的网格要求并不高,普通的坐标变形,极坐标表示,加一些逻辑操作 90%的投影项目都已经可以胜任了。网格做为数字几何的重要组成部分,其实是非常深奥的 比如  细分,简化,正则化 ,delauny ....幸好融合软件用的网格都是基本的,所见即所得

网格篇难点:

1:融合带处理:

融合带补偿曲线,这个可以是指数函数来定义,还可以是贝塞尔曲线来替代。

市场上的融合带大部分都是曲线+Gamm矫正,其实单靠Gamm矫正是不够。

我觉得 目视粗调(投影机自身的调节) + 摄像头(机器视觉算法)细调,是最佳的方案。这

部分后面会讲到。

处理过程:

原始投影叠加:

过调节函数后:

经 Gamma 校正公式:f(x) = x^(1/g) (x归一化处理 g区间【1.8-2。2】)

最终:

还有融合带的调整必须在片段着色器里完成,下面给出伪代码: 

struct HyperParameters{

float p;

float a;

float gamma;

float can;

float4 fusion_left_right_up_down;

float4 bound_left_right_up_down;

};

cbuffer cbHyperParameters : register(b1){

HyperParameters hyperPar;

};

 float edgeBlend(float p,float a,float t){

if(t>=0&&t<=0.5){

           return a*(pow(2*t,p));

}else{

  return 1-(1-a)*(pow(2*(1-t),p));

}

} ;

float4 rh(float2 Tex,float4 color_){

float4 finalColor = color_;

if(Tex.x<hyperPar.fusion_left_right_up_down.x){

    float t =(hyperPar.fusion_left_right_up_down.x-Tex.x)/(hyperPar.fusion_left_right_up_down.x-hyperPar.bound_left_right_up_down.x);

float bs=edgeBlend(,t);

finalColor.xyz*=(1.0-bs);

}

if(Tex.x>hyperPar.fusion_left_right_up_down.y){

float t =(Tex.x-hyperPar.fusion_left_right_up_down.y)/(hyperPar.bound_left_right_up_down.y-hyperPar.fusion_left_right_up_down.y);

float bs=edgeBlend(hyperPar.fusion_bessel_key_right,t);

finalColor.xyz*=(1.0-bs);

}

if(Tex.y<hyperPar.fusion_left_right_up_down.z){

   float t =(hyperPar.fusion_left_right_up_down.z-Tex.y)/(hyperPar.fusion_left_right_up_down.z-hyperPar.bound_left_right_up_down.z);

float bs=edgeBlend(hyperPar.fusion_bessel_key_up,t);

finalColor.xyz*=(1.0-bs);

}

if(Tex.y>hyperPar.fusion_left_right_up_down.w){

float t =(Tex.y-hyperPar.fusion_left_right_up_down.w)/(hyperPar.bound_left_right_up_down.w-hyperPar.fusion_left_right_up_down.w);

float bs=edgeBlend(hyperPar.fusion_bessel_key_down,t);

finalColor.xyz*=(1.0-bs);

}

return finalColor;

}

2:反向精确定位:

其实融合软件在面对沙盘 拍拍墙 mapping 的时候,都需要做内容和投影的位置对位,在网格极度变形的时候,获取网格上任何一点的纹理坐标是困难的。对图形学敏感的朋友应该会想起插值,进而想到 重心坐标参考 重心坐标(Barycentric coordinates) - 知乎 (zhihu.com)

很多技术文档原理和推导已经给出,我这里直接贴伪代码了:

bool BarycentricCoordinates(DirectX::XMFLOAT3 orig_f, DirectX::XMFLOAT3 dir_f, DirectX::XMFLOAT3 v0_f, DirectX::XMFLOAT3 v1_f, DirectX::XMFLOAT3 v2_f,DirectX::XMFLOAT2 uv0_f, DirectX::XMFLOAT2 uv1_f, DirectX::XMFLOAT2 uv2_f, DirectX::XMFLOAT2 &uvdst) {



DirectX::XMVECTOR dir = XMLoadFloat3(&dir_f);

DirectX::XMVECTOR orig = XMLoadFloat3(&orig_f);

DirectX::XMVECTOR v0=XMLoadFloat3(&v0_f);

DirectX::XMVECTOR v1 = XMLoadFloat3(&v1_f);

DirectX::XMVECTOR v2 = XMLoadFloat3(&v2_f);

DirectX::XMVECTOR  E1 = DirectX::XMVectorSubtract(v1 , v0);

DirectX::XMVECTOR  E2 = DirectX::XMVectorSubtract(v2, v0);

DirectX::XMVECTOR  P = DirectX::XMVector3Cross(dir, E2);

float det = 0.0f;

DirectX::XMStoreFloat(&det, DirectX::XMVector3Dot(E1, P));

DirectX::XMVECTOR T;

if (det > 0){

T = DirectX::XMVectorSubtract(orig , v0);

}

else{

T = DirectX::XMVectorSubtract(v0 , orig);

det = -det;

}

if (det < 0.0001f) {

return false;

}

float u_t = 0.0f;

DirectX::XMStoreFloat(&u_t, DirectX::XMVector3Dot(T, P));

float u = u_t;

if (u < 0.0f || u > det)

{

return false;

}

DirectX::XMVECTOR Q = DirectX::XMVector3Cross(T, E1);

float v_t = 0.0f;

DirectX::XMStoreFloat(&v_t, DirectX::XMVector3Dot(dir, Q));

 float v = v_t;

if (v < 0.0f || u + v > det){

return false;

}

float t_t = 0.0f;

DirectX::XMStoreFloat(&t_t, DirectX::XMVector3Dot(E2, Q));

float t = t_t;

float t_f_invdet = 1.0f / det;

t *= t_f_invdet;

DirectX::XMFLOAT3 t_direction = { t * this->direction.x,t * this->direction.y,t * this->direction.z };

hit.x = u;

hit.y = v;

    uvdst.x =uv1_f.x* hit.x + uv2_f.x * hit.y +=uv0_f.x * (1.0f- hit.x- hit.y);

    uvdst.y = uv1_f.y * hit.x +uv2_f.y * hit.y +uv0_f.y * (1.0f - hit.x - hit.y);

return true;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
科领投影融合软件,传统情况,我们一个投影仪投射出来的画面是有限的,并且画面是常规的矩形,通过此软件,可以将多个投影仪的画面无缝拼接为一个整体,并且可以对每一个投影仪的光度进行光线补偿,防止投影仪因灯泡衰老而造成颜色不均匀。 科领投影融合软件功能 科领融合参数 ●最多16通道。 ●拥有中英文双语版本,默认中文,全球唯一,可以自行切换 ●支持桌面融合视频融合。 ●内置播放器,播放器可接收其他中控命令(UDP协议), 支持单屏 ,扩展屏或跨屏三个模式 ●拥有安装向导,让安装变得简单,简单三部曲,搞定安装 ●最多支持16通道,且向下兼容,并且可以自定义融合边, 可实现一字型、田字形等融合画面自由组合 ●支持windows7及最新windows8,windows10系统(不支持XP),32位,64位皆可运行 ●支持几何校正,适用于弧幕、360°环幕、异型幕、折幕等 ●支持针对每个信号进行融合,比如可以融主屏信号,融扩展屏信号 ●第一次配置好后,开机自动启动融合拼接 ●如果用ATI显卡卡,12通道以内无需购买多屏宝,直接购买ATI多屏显卡。NVIDIA显卡需要购买多屏宝 ●简单友好的操作界面,支持鼠标和快捷键快速校正,并提供简单模式和复杂模式,也可以通过VNC远程调试。 ●超绚的安装向导,跟随向导即可实现傻瓜安装 ●支持调投影仪的偏色 ●支持投影画面的遮罩 ●打击盗版,本产品为最新的v1.99R版,比国内其他版本要新,所以支持win10 ●支持加密狗时间锁,可以自行设置到期时间和解除到期时间,全球唯一开发接口,每个厂商可以自行设定解锁密码 科领投影融合软件截图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值