mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 13:49:12 +02:00
Merge pull request #12784 from Zvork/zeye
Potential bug correction when constructing eye position from Z-buffer depths in shaders
This commit is contained in:
commit
20ae247185
4 changed files with 20 additions and 15 deletions
|
@ -118,7 +118,7 @@ DeferredFragment unpackDeferredFragmentNoPositionNoAmbient(vec2 texcoord) {
|
||||||
<@include DeferredTransform.slh@>
|
<@include DeferredTransform.slh@>
|
||||||
<$declareDeferredFrameTransform()$>
|
<$declareDeferredFrameTransform()$>
|
||||||
|
|
||||||
vec4 unpackDeferredPosition(DeferredFrameTransform deferredTransform, float depthValue, vec2 texcoord) {
|
vec4 unpackDeferredPosition(float depthValue, vec2 texcoord) {
|
||||||
int side = 0;
|
int side = 0;
|
||||||
if (isStereo()) {
|
if (isStereo()) {
|
||||||
if (texcoord.x > 0.5) {
|
if (texcoord.x > 0.5) {
|
||||||
|
@ -127,9 +127,14 @@ vec4 unpackDeferredPosition(DeferredFrameTransform deferredTransform, float dept
|
||||||
}
|
}
|
||||||
texcoord.x *= 2.0;
|
texcoord.x *= 2.0;
|
||||||
}
|
}
|
||||||
float Zeye = evalZeyeFromZdb(depthValue);
|
|
||||||
|
|
||||||
return vec4(evalEyePositionFromZeye(side, Zeye, texcoord), 1.0);
|
return vec4(evalEyePositionFromZdb(side, depthValue, texcoord), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method to unpack position is fastesst
|
||||||
|
vec4 unpackDeferredPositionFromZdb(vec2 texcoord) {
|
||||||
|
float Zdb = texture(depthMap, texcoord).x;
|
||||||
|
return unpackDeferredPosition(Zdb, texcoord);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 unpackDeferredPositionFromZeye(vec2 texcoord) {
|
vec4 unpackDeferredPositionFromZeye(vec2 texcoord) {
|
||||||
|
@ -152,7 +157,7 @@ DeferredFragment unpackDeferredFragment(DeferredFrameTransform deferredTransform
|
||||||
DeferredFragment frag = unpackDeferredFragmentNoPosition(texcoord);
|
DeferredFragment frag = unpackDeferredFragmentNoPosition(texcoord);
|
||||||
|
|
||||||
frag.depthVal = depthValue;
|
frag.depthVal = depthValue;
|
||||||
frag.position = unpackDeferredPosition(deferredTransform, frag.depthVal, texcoord);
|
frag.position = unpackDeferredPosition(frag.depthVal, texcoord);
|
||||||
|
|
||||||
return frag;
|
return frag;
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,17 +122,12 @@ float evalZeyeFromZdb(float depth) {
|
||||||
return frameTransform._depthInfo.x / (depth * frameTransform._depthInfo.y + frameTransform._depthInfo.z);
|
return frameTransform._depthInfo.x / (depth * frameTransform._depthInfo.y + frameTransform._depthInfo.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 evalEyeNormal(vec3 C) {
|
float evalZdbFromZeye(float Zeye) {
|
||||||
//return normalize(cross(dFdy(C), dFdx(C)));
|
return (frameTransform._depthInfo.x - Zeye * frameTransform._depthInfo.z) / (Zeye * frameTransform._depthInfo.y);
|
||||||
return normalize(cross(dFdx(C), dFdy(C)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 evalEyePositionFromZeye(int side, float Zeye, vec2 texcoord) {
|
vec3 evalEyeNormal(vec3 C) {
|
||||||
// compute the view space position using the depth
|
return normalize(cross(dFdx(C), dFdy(C)));
|
||||||
// basically manually pick the proj matrix components to do the inverse
|
|
||||||
float Xe = (-Zeye * (texcoord.x * 2.0 - 1.0) - Zeye * frameTransform._projection[side][2][0] - frameTransform._projection[side][3][0]) / frameTransform._projection[side][0][0];
|
|
||||||
float Ye = (-Zeye * (texcoord.y * 2.0 - 1.0) - Zeye * frameTransform._projection[side][2][1] - frameTransform._projection[side][3][1]) / frameTransform._projection[side][1][1];
|
|
||||||
return vec3(Xe, Ye, Zeye);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 evalEyePositionFromZdb(int side, float Zdb, vec2 texcoord) {
|
vec3 evalEyePositionFromZdb(int side, float Zdb, vec2 texcoord) {
|
||||||
|
@ -143,6 +138,11 @@ vec3 evalEyePositionFromZdb(int side, float Zdb, vec2 texcoord) {
|
||||||
return eyePos.xyz / eyePos.w;
|
return eyePos.xyz / eyePos.w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec3 evalEyePositionFromZeye(int side, float Zeye, vec2 texcoord) {
|
||||||
|
float Zdb = evalZdbFromZeye(Zeye);
|
||||||
|
return evalEyePositionFromZdb(side, Zdb, texcoord);
|
||||||
|
}
|
||||||
|
|
||||||
ivec2 getPixelPosTexcoordPosAndSide(in vec2 glFragCoord, out ivec2 pixelPos, out vec2 texcoordPos, out ivec4 stereoSide) {
|
ivec2 getPixelPosTexcoordPosAndSide(in vec2 glFragCoord, out ivec2 pixelPos, out vec2 texcoordPos, out ivec4 stereoSide) {
|
||||||
ivec2 fragPos = ivec2(glFragCoord.xy);
|
ivec2 fragPos = ivec2(glFragCoord.xy);
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ void main(void) {
|
||||||
// Grab the fragment data from the uv
|
// Grab the fragment data from the uv
|
||||||
vec2 texCoord = varTexCoord0.st;
|
vec2 texCoord = varTexCoord0.st;
|
||||||
|
|
||||||
vec4 fragEyePos = unpackDeferredPositionFromZeye(texCoord);
|
vec4 fragEyePos = unpackDeferredPositionFromZdb(texCoord);
|
||||||
vec4 fragWorldPos = getViewInverse() * fragEyePos;
|
vec4 fragWorldPos = getViewInverse() * fragEyePos;
|
||||||
|
|
||||||
// From frag world pos find the cluster
|
// From frag world pos find the cluster
|
||||||
|
|
|
@ -29,7 +29,7 @@ void main(void) {
|
||||||
// Grab the fragment data from the uv
|
// Grab the fragment data from the uv
|
||||||
vec2 texCoord = varTexCoord0.st;
|
vec2 texCoord = varTexCoord0.st;
|
||||||
|
|
||||||
vec4 fragEyePos = unpackDeferredPositionFromZeye(texCoord);
|
vec4 fragEyePos = unpackDeferredPositionFromZdb(texCoord);
|
||||||
vec4 fragWorldPos = getViewInverse() * fragEyePos;
|
vec4 fragWorldPos = getViewInverse() * fragEyePos;
|
||||||
|
|
||||||
// From frag world pos find the cluster
|
// From frag world pos find the cluster
|
||||||
|
|
Loading…
Reference in a new issue