已解决!! 尤里卡!哦,伙计......这是我在这个问题上挣扎的5天,我一求得帮忙就解决了! O_O 我必须在查找(tex2dproj)之前和之后以及在Linear01Depth之前反转片段着色器ONCE内的纹理。 像那样:
//Fragment Shader
half4 frag (v2f i) : COLOR{
i.scrPos.y = 1 - i.scrPos.y;
fixed4 preRender = tex2Dproj(_PreTex, i.scrPos);
i.scrPos.y = 1 - i.scrPos.y;
float depthValue = Linear01Depth (tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.scrPos)).r);
etc........
我正在使用Unity,我有一个带有renderTexture的正交相机,可以使用顶点/片段着色器从botton到顶部获得场景的深度。
我知道DirectX和OpenGL之间有关于如何渲染y轴以及简单的周转是在顶点翻转它的行为。这是我的基本着色器。
Shader "Custom/DepthGrayscale" {
SubShader {
Tags { "RenderType"="Transparent" }
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _CameraDepthTexture;
struct v2f {
float4 pos : SV_POSITION;
float4 scrPos : TEXCOORD0;
};
//Vertex Shader
v2f vert (appdata_base v){
v2f o;
o.pos = UnityObjectToClipPos (v.vertex);
o.scrPos = ComputeScreenPos(o.pos);
o.scrPos.y = 1 - o.scrPos.y; //here's where the magic happens!
return o;
}
//Fragment Shader
half4 frag (v2f i) : COLOR{
float depthValue = Linear01Depth (tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.scrPos)).r);
fixed4 depth;
depth.r = depthValue;
depth.g = depthValue;
depth.b = depthValue;
depth.a = depthValue;
return depth;
}
ENDCG
}
}
FallBack "Diffuse" }
现在,我想在物体移动时获得物体的“痕迹”。为了实现这一点,我使用了一个具有纹理属性的类似着色器,这是另一个我保存渲染输出的renderTexture,同时用于混合当前帧。这是DepthTrace Shader。
Shader "Custom/DepthTrace" {
Properties {
_PreTex ("", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Transparent" }
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _CameraDepthTexture;
struct v2f {
float4 pos : SV_POSITION;
float4 scrPos : TEXCOORD0;
};
//Vertex Shader
v2f vert (appdata_base v){
v2f o;
o.pos = UnityObjectToClipPos (v.vertex);
o.scrPos = ComputeScreenPos(o.pos);
o.scrPos.y = 1 - o.scrPos.y;
return o;
}
sampler2D _PreTex;
//Fragment Shader
half4 frag (v2f i) : COLOR{
fixed4 preRender = tex2Dproj(_PreTex, i.scrPos);
float depthValue = Linear01Depth (tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.scrPos)).r);
fixed4 depth;
if (preRender.r < depthValue) {
depthValue = preRender.r;
}
depth.r = depthValue;
depth.g = depthValue;
depth.b = depthValue;
depth.a = depthValue;
return depth;
}
ENDCG
}
}
FallBack "Diffuse" }
现在,“踪迹”效果很好但我得到了 double specular image
如果我没有翻转y轴,我得到一个good image,当然完全在y轴上翻转。
似乎深度输入被翻转而_PreTex不是!
我不会简单地在常规脚本中翻转输出,在性能方面我已经失去了GPU计算的所有优势。
你知道为什么会这样吗?谢谢。