View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0004888 | The Dark Mod | Coding | public | 27.09.2018 15:39 | 28.11.2021 12:18 |
Reporter | duzenko | Assigned To | stgatilov | ||
Priority | normal | Severity | normal | Reproducibility | have not tried |
Status | resolved | Resolution | fixed | ||
Product Version | TDM 2.07 | ||||
Target Version | TDM 2.10 | Fixed in Version | TDM 2.10 | ||
Summary | 0004888: Terrible precision in light frustums | ||||
Description | Light->lightDef->frustum and Light->frustumTris don't match | ||||
Steps To Reproduce | Use the map from attached map (originally posted on http://forums.thedarkmod.com/topic/19659-feature-request-emissive-materialsvolumetric-lights/) and the shaders | ||||
Tags | No tags attached. | ||||
Attached Files | volumetric.fs (2,307 bytes)
#version 430 layout(binding=0) uniform sampler2D s_projection; layout(binding=1) uniform sampler2D s_falloff; layout(binding=2) uniform sampler2D s_depth; layout (location = 0) uniform mat4 u_MVP; //layout (location = 1) uniform vec3 u_lightOrigin; layout (location = 2) uniform vec3 u_viewOrigin; layout (location = 3) uniform mat4 u_lightProject; layout (location = 4) uniform vec4 u_lightFrustum[6]; in vec4 csLight; in vec4 csThis; in vec4 lightProject; in vec4 worldPosition; void main() { vec2 wrCoord = csThis.xy/csThis.w * .5 + .5; float depth = texture2D(s_depth, wrCoord ).r; /* if(depth < gl_FragCoord.z) discard;*/ vec3 dirToViewer = normalize(u_viewOrigin - worldPosition.xyz); // where does the fragment-viewer ray leave the light frustum? float minRayCoord = -1e11; vec3 rayPlaneIntersection[6]; for(int i=0; i<6; i++) { // https://stackoverflow.com/questions/23975555/how-to-do-ray-plane-intersection if(i!=2) ;//continue; float top = dot(u_lightFrustum[i], worldPosition); float bottom = dot(u_lightFrustum[i].xyz, dirToViewer); if(abs(bottom) < 1e-3) { // special case, ray parallel to plane continue; } float rayCoord = top / bottom; if(rayCoord > -1e-1) { // tested plane is the rendered plane continue; // at least one of these must be zero (the plane being rendered now) } if(rayCoord < minRayCoord) continue; minRayCoord = rayCoord; } vec3 exitPoint = worldPosition.xyz - minRayCoord * dirToViewer; vec4 samplePos = worldPosition; vec3 color = vec3(0); color = vec3(distance(exitPoint, worldPosition.xyz)*1e-2); if(minRayCoord > 0) minRayCoord *= sin(gl_FragCoord.x*1e-1); color = vec3(abs(minRayCoord))*vec3(1e-2, 1e-3, 1e-4)*1e0; for(int i=0; i<20; i++) { vec4 sampleClip = u_MVP * samplePos; if(sampleClip.z <= 0) break; float sampleDepth = sampleClip.z/sampleClip.w * .5 + .5; if(sampleDepth < depth) { vec4 lightProject = samplePos * u_lightProject; vec4 t0 = texture2DProj(s_projection, lightProject.xyz ); //color += t0.rgb * 0.05; //color += .05; } samplePos.xyz += dirToViewer * 3e0; //color += vec3(1e-2); } gl_FragColor.rgb = color.rgb * 1e0; //gl_FragColor.rg = wrCoord; //gl_FragColor.b = .1; } | ||||
Oops, I got assigned =) Any detail? What to look at? Or it would be obvious after loading map? And also: Why do you think it is precision problem? Any place in the code where to start looking from? I'm pretty sure you know more, so I'm trying to extract additional information from you =) |
|
There might be more than one issue here, but let's start with the most obvious one You can see on any "projected" light, e.g. on the window light in the room on the screenshot (It's below the water reservoir in the tower, map St Albans Cathedral) http://bugs.thedarkmod.com/file_download.php?file_id=660&type=bug r_singleLight x where x is the window light index, then r_showlights 3, then noclip inside the light frustum and close up enough to see frustum edge cracks This does not show up on the existing maps but the new experimental volumetric light make it very visible. |
|
I was able to track it down briefly to R_PolytopeSurface where I logged tri->verts for the 'projected' light and, after text-sorting vertex coordinates, can see that the same frustum corner has slightly different coordinates on different frustum planes (this particular data is for a light in Vol.L. demo map, not StAlbans) 1014.867188 316.531250 -64.437500 1014.867432 316.544800 -64.448486 1014.869507 316.562500 -64.453125 1016.601563 525.773438 -210.953125 1016.606506 525.751282 -210.936584 1016.609070 525.780579 -210.949265 774.837097 316.049744 -64.101852 774.843750 316.062500 -64.125000 774.843750 316.092590 -64.124115 776.585938 526.242188 -211.296875 776.598999 526.250000 -211.281250 776.625427 526.242981 -211.280823 896.000000 568.000000 72.000000 896.001953 568.000000 72.031250 896.007813 567.968750 72.000000 896.007813 567.988281 71.968750 EDIT The real calculation seems to occur in idWinding::ClipInPlace |
|
Now I finally understand what is it about. I guess I'll fix it the the extent possible when working on projected lights (0005815). I mean: frustum and frustumTris won't match exactly, because one contains vertices, and the other one contains planes. But at least frustumTris and frustumWindings will exactly match with each other and within themselves. |
|
Here is the list of commits (shared with 0005815): r9658 Added new function R_PolytopeSurfaceFrustumLike for precise light volume polytope construction. r9659 Use the new R_PolytopeSurfaceFrustumLike function to create frustum windings and triangles. r9663 Removed frustumTrisExact, hopefully set frustumTri orientation correctly r9664 Added good check and fixed winding orientations in R_PolytopeSurfaceFrustumLike. r9665 Removed old debug code for frustum triangles, based on plane distances. |
|
Date Modified | Username | Field | Change |
---|---|---|---|
27.09.2018 15:39 | duzenko | New Issue | |
27.09.2018 15:39 | duzenko | File Added: volumetric.fs | |
27.09.2018 15:39 | duzenko | File Added: volumetric.vs | |
27.09.2018 15:42 | duzenko | File Added: glowtest_v03.pk4 | |
06.12.2018 16:22 | duzenko | Assigned To | => stgatilov |
06.12.2018 16:22 | duzenko | Status | new => assigned |
07.12.2018 08:38 | stgatilov | Note Added: 0010844 | |
07.12.2018 14:24 | duzenko | File Added: Untitled.jpg | |
07.12.2018 14:24 | duzenko | Note Added: 0010845 | |
07.12.2018 14:28 | duzenko | Note Added: 0010846 | |
07.12.2018 14:30 | duzenko | Note Edited: 0010846 | |
18.11.2021 17:47 | stgatilov | Note Added: 0014550 | |
18.11.2021 17:47 | stgatilov | Relationship added | related to 0005815 |
19.11.2021 04:40 | stgatilov | Relationship added | related to 0005816 |
28.11.2021 12:13 | stgatilov | Note Added: 0014576 | |
28.11.2021 12:16 | stgatilov | Product Version | => TDM 2.07 |
28.11.2021 12:16 | stgatilov | Target Version | => TDM 2.10 |
28.11.2021 12:16 | stgatilov | Summary | Teriible precision in light frustums => Terrible precision in light frustums |
28.11.2021 12:18 | stgatilov | Status | assigned => resolved |
28.11.2021 12:18 | stgatilov | Resolution | open => fixed |
28.11.2021 12:18 | stgatilov | Fixed in Version | => TDM 2.10 |