Unity3d unity单机版播放器构建中的错误转换

Unity3d unity单机版播放器构建中的错误转换,unity3d,Unity3d,我正在为unity(2018.1.0f2)开发本机(c++)插件(目前仅限windows)。 该插件下载纹理和网格,并将它们提供给unity。 有很多样板代码,我想让你省去。 无论如何,渲染是这样完成的: CommandBuffer(CommandBuffer buffer,列出任务) { buffer.Clear(); buffer.SetProjectionMatrix(cam.projectionMatrix);//受保护的摄影机cam;cam=GetComponent(); foreac

我正在为unity(2018.1.0f2)开发本机(c++)插件(目前仅限windows)。 该插件下载纹理和网格,并将它们提供给unity。 有很多样板代码,我想让你省去。 无论如何,渲染是这样完成的:

CommandBuffer(CommandBuffer buffer,列出任务)
{
buffer.Clear();
buffer.SetProjectionMatrix(cam.projectionMatrix);//受保护的摄影机cam;cam=GetComponent();
foreach(任务中的DrawTask t)
{
如果(t.mesh==null)
继续;
MaterialPropertyBlock mat=新的MaterialPropertyBlock();
布尔单色=假;
如果(t.texColor!=null)
{
var tt=t.texColor作为VtsTexture;
mat.SetTexture(shaderPropertyMatex,tt.Get());
单色=tt.单色;
}
if(t.texMask!=null)
{
var tt=t.texMask作为VtsTexture;
mat.SetTexture(shaderPropertyMaskTex,tt.Get());
}
mat.SetMatrix(shaderPropertyUvMat,VtsUtil.V2U33(t.data.uvm));
mat.SetVector(shaderPropertyUvClip,VtsUtil.V2U4(t.data.uvClip));
mat.SetVector(shaderPropertyColor,VtsUtil.V2U4(t.data.color));
//标志:遮罩、单色、平面着色、uv源
mat.SetVector(shaderPropertyFlags,新矢量4(t.texMask==null?0:1,单色?1:0,0,t.data.externalUv?1:0));
DrawMesh((t.mesh作为VtsMesh.Get(),VtsUtil.V2U44(t.data.mv),material,0,-1,mat);
}
}
有两种控制模式。unity摄像机由插件中的摄像机控制,或者插件摄像机由unity摄像机控制。在我当前的场景中,插件相机由unity相机控制。幕后没有什么特别的魔力,但有些变换需要以双精度进行,才能在网格不“跳跃”的情况下工作

void CamOverrideView(参考双[]值)
{
Matrix4x4 Mu=mapTrans.localToWorldMatrix*VtsUtil.UnityToVtsMatrix;
//视图矩阵
if(controlTransformation==VtsDataControl.Vts)
cam.worldToCameraMatrix=VtsUtil.V2U44(数学Mul44x44(值,数学逆44(VtsUtil.U2V44(Mu)));
其他的
值=Math.Mul44x44(VtsUtil.U2V44(cam.worldToCameraMatrix),VtsUtil.U2V44(Mu));
}
无效凸轮超越参数(参考双视野、参考双方向、参考双近、参考双远)
{
//视野
if(controlFov==VtsDataControl.Vts)
cam.fieldOfView=(浮动)视野;
其他的
视场=凸轮视场;
//远近
if(controlNearFar==VtsDataControl.Vts)
{
cam.nearClipPlane=(浮动)near;
cam.farClipPlane=(浮动)far;
}
其他的
{
near=cam.nearClipPlane;
远=凸轮。远平面;
}
}
和一个着色器:

着色器“Vts/UnlitShader”
{
子阴影
{
标记{“RenderType”=“不透明”}
LOD 100
通过
{
混合SrcAlpha ONEMUSSRCALPHA
CGP程序
#pragma顶点顶点
#布拉格碎片碎片
#包括“UnityCG.cginc”
结构vIn
{
浮动4顶点:位置;
浮动2 uvInternal:TEXCOORD0;
浮动2:TEXCOORD1;
};
结构v2f
{
浮动4顶点:SV_位置;
float2-uvTex:TEXCOORD0;
浮动2 uvClip:TEXCOORD1;
};
结构物
{
浮动4颜色:SV_目标;
};
取样器2D_MainTex;
采样器2D_MaskTex;
浮动4x4_UvMat;
浮动4_UvClip;
浮色;
float4 _Flags;//遮罩,单色,平面着色,uv源
v2f垂直(vIn i)
{
v2fo;
o、 顶点=UnityObjectToClipPos(即顶点);
o、 uvTex=mul((float3x3)_UvMat,float3(_Flags.w>0?i.uvExternal:i.uvInternal,1.0)).xy;
o、 uvClip=i.uvExternal;
返回o;
}
fOut frag(v2f i)
{
福托;
//纹理颜色
o、 颜色=tex2D(_MainTex,i.uvTex);
如果(_Flags.y>0)
o、 color=o.color.rrra;//单色纹理
//紫外削波
如果(i.uvClip.x<_uvClip.x
||i.uvClip.y<\u uvClip.y
||i.uvClip.x>\u uvClip.z
||i.uvClip.y>\u uvClip.w)
丢弃;
//面具
如果(_Flags.x>0)
{
if(tex2D(_MaskTex,i.uvTex).r<0.5)
丢弃;
}
//均匀色调
o、 颜色*=\u颜色;
返回o;
}
ENDCG
}
}
}
这一切都在编辑器中完美运行。它在独立开发构建中也能很好地工作。但在“部署”构建中,转换会出错。渲染的部分看起来好像绕着错误的轴旋转,或者具有不同的极性

你能找出一些明显的错误吗

我的第一个怀疑是OpenGL和DirectX的区别,但是“部署”和“开发”版本应该使用相同的版本,不是吗?此外,我尝试过改变玩家设置来强制其中一个,但没有任何区别

编辑:

良好形象:

坏图像:

注意地形是如何与大气正确对齐的

复制步骤

1) 在unity中创建一个新项目

2) 下载资产并将其解压缩到新创建的项目中

3) 在编辑器->中尝试它应该可以正常工作(它将开始从我们这里下载网格和纹理,所以请耐心等待;下载的资源是c
buffer.SetProjectionMatrix(GL.GetGPUProjectionMatrix(cam.projectionMatrix, false));