Introduce eye_offset for correcting stereoscopic reflections
Use view instead of vertex for reflections.
This commit is contained in:
parent
7cc99d213f
commit
b4821fe2e0
13 changed files with 32 additions and 8 deletions
|
@ -1923,11 +1923,11 @@ void RasterizerSceneGLES3::render_scene(RID p_render_buffers, const CameraData *
|
|||
render_data.cam_transform = p_camera_data->main_transform;
|
||||
render_data.inv_cam_transform = render_data.cam_transform.affine_inverse();
|
||||
render_data.cam_projection = p_camera_data->main_projection;
|
||||
render_data.view_projection[0] = p_camera_data->main_projection;
|
||||
render_data.cam_orthogonal = p_camera_data->is_orthogonal;
|
||||
|
||||
render_data.view_count = p_camera_data->view_count;
|
||||
for (uint32_t v = 0; v < p_camera_data->view_count; v++) {
|
||||
render_data.view_eye_offset[v] = p_camera_data->view_offset[v].origin;
|
||||
render_data.view_projection[v] = p_camera_data->view_projection[v];
|
||||
}
|
||||
|
||||
|
|
|
@ -100,6 +100,7 @@ struct RenderDataGLES3 {
|
|||
|
||||
// For stereo rendering
|
||||
uint32_t view_count = 1;
|
||||
Vector3 view_eye_offset[RendererSceneRender::MAX_RENDER_VIEWS];
|
||||
CameraMatrix view_projection[RendererSceneRender::MAX_RENDER_VIEWS];
|
||||
|
||||
float z_near = 0.0;
|
||||
|
|
|
@ -692,6 +692,11 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat
|
|||
projection = correction * p_render_data->view_projection[v];
|
||||
RendererStorageRD::store_camera(projection, scene_state.ubo.projection_matrix_view[v]);
|
||||
RendererStorageRD::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix_view[v]);
|
||||
|
||||
scene_state.ubo.eye_offset[v][0] = p_render_data->view_eye_offset[v].x;
|
||||
scene_state.ubo.eye_offset[v][1] = p_render_data->view_eye_offset[v].y;
|
||||
scene_state.ubo.eye_offset[v][2] = p_render_data->view_eye_offset[v].z;
|
||||
scene_state.ubo.eye_offset[v][3] = 0.0;
|
||||
}
|
||||
|
||||
scene_state.ubo.taa_jitter[0] = p_render_data->taa_jitter.x;
|
||||
|
|
|
@ -237,6 +237,7 @@ class RenderForwardClustered : public RendererSceneRenderRD {
|
|||
|
||||
float projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16];
|
||||
float inv_projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16];
|
||||
float eye_offset[RendererSceneRender::MAX_RENDER_VIEWS][4];
|
||||
|
||||
float viewport_size[2];
|
||||
float screen_pixel_size[2];
|
||||
|
|
|
@ -1542,6 +1542,11 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,
|
|||
projection = correction * p_render_data->view_projection[v];
|
||||
RendererStorageRD::store_camera(projection, scene_state.ubo.projection_matrix_view[v]);
|
||||
RendererStorageRD::store_camera(projection.inverse(), scene_state.ubo.inv_projection_matrix_view[v]);
|
||||
|
||||
scene_state.ubo.eye_offset[v][0] = p_render_data->view_eye_offset[v].x;
|
||||
scene_state.ubo.eye_offset[v][1] = p_render_data->view_eye_offset[v].y;
|
||||
scene_state.ubo.eye_offset[v][2] = p_render_data->view_eye_offset[v].z;
|
||||
scene_state.ubo.eye_offset[v][3] = 0.0;
|
||||
}
|
||||
|
||||
scene_state.ubo.z_far = p_render_data->z_far;
|
||||
|
|
|
@ -260,6 +260,7 @@ protected:
|
|||
|
||||
float projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16];
|
||||
float inv_projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16];
|
||||
float eye_offset[RendererSceneRender::MAX_RENDER_VIEWS][4];
|
||||
|
||||
float viewport_size[2];
|
||||
float screen_pixel_size[2];
|
||||
|
|
|
@ -5115,12 +5115,12 @@ void RendererSceneRenderRD::render_scene(RID p_render_buffers, const CameraData
|
|||
// Our first camera is used by default
|
||||
render_data.cam_transform = p_camera_data->main_transform;
|
||||
render_data.cam_projection = p_camera_data->main_projection;
|
||||
render_data.view_projection[0] = p_camera_data->main_projection;
|
||||
render_data.cam_orthogonal = p_camera_data->is_orthogonal;
|
||||
render_data.taa_jitter = p_camera_data->taa_jitter;
|
||||
|
||||
render_data.view_count = p_camera_data->view_count;
|
||||
for (uint32_t v = 0; v < p_camera_data->view_count; v++) {
|
||||
render_data.view_eye_offset[v] = p_camera_data->view_offset[v].origin;
|
||||
render_data.view_projection[v] = p_camera_data->view_projection[v];
|
||||
}
|
||||
|
||||
|
|
|
@ -58,6 +58,7 @@ struct RenderDataRD {
|
|||
|
||||
// For stereo rendering
|
||||
uint32_t view_count = 1;
|
||||
Vector3 view_eye_offset[RendererSceneRender::MAX_RENDER_VIEWS];
|
||||
CameraMatrix view_projection[RendererSceneRender::MAX_RENDER_VIEWS];
|
||||
|
||||
Transform3D prev_cam_transform;
|
||||
|
|
|
@ -634,7 +634,11 @@ void fragment_shader(in SceneData scene_data) {
|
|||
|
||||
//lay out everything, whatever is unused is optimized away anyway
|
||||
vec3 vertex = vertex_interp;
|
||||
#ifdef USE_MULTIVIEW
|
||||
vec3 view = -normalize(vertex_interp - scene_data.eye_offset[ViewIndex].xyz);
|
||||
#else
|
||||
vec3 view = -normalize(vertex_interp);
|
||||
#endif
|
||||
vec3 albedo = vec3(1.0);
|
||||
vec3 backlight = vec3(0.0);
|
||||
vec4 transmittance_color = vec4(0.0, 0.0, 0.0, 1.0);
|
||||
|
@ -1191,7 +1195,7 @@ void fragment_shader(in SceneData scene_data) {
|
|||
if (sc_use_forward_gi && bool(instances.data[instance_index].flags & INSTANCE_FLAGS_USE_VOXEL_GI)) { // process voxel_gi_instances
|
||||
|
||||
uint index1 = instances.data[instance_index].gi_offset & 0xFFFF;
|
||||
vec3 ref_vec = normalize(reflect(normalize(vertex), normal));
|
||||
vec3 ref_vec = normalize(reflect(-view, normal));
|
||||
//find arbitrary tangent and bitangent, then build a matrix
|
||||
vec3 v0 = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 1.0, 0.0);
|
||||
vec3 tangent = normalize(cross(v0, normal));
|
||||
|
@ -1309,7 +1313,7 @@ void fragment_shader(in SceneData scene_data) {
|
|||
#else
|
||||
vec3 bent_normal = normal;
|
||||
#endif
|
||||
reflection_process(reflection_index, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum);
|
||||
reflection_process(reflection_index, view, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -180,6 +180,7 @@ struct SceneData {
|
|||
// only used for multiview
|
||||
mat4 projection_matrix_view[MAX_VIEWS];
|
||||
mat4 inv_projection_matrix_view[MAX_VIEWS];
|
||||
vec4 eye_offset[MAX_VIEWS];
|
||||
|
||||
vec2 viewport_size;
|
||||
vec2 screen_pixel_size;
|
||||
|
@ -250,7 +251,7 @@ struct SceneData {
|
|||
|
||||
bool pancake_shadows;
|
||||
vec2 taa_jitter;
|
||||
uvec2 pad;
|
||||
uvec2 pad2;
|
||||
};
|
||||
|
||||
layout(set = 1, binding = 0, std140) uniform SceneDataBlock {
|
||||
|
|
|
@ -869,7 +869,7 @@ void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 v
|
|||
diffuse_light, specular_light);
|
||||
}
|
||||
|
||||
void reflection_process(uint ref_index, vec3 vertex, vec3 normal, float roughness, vec3 ambient_light, vec3 specular_light, inout vec4 ambient_accum, inout vec4 reflection_accum) {
|
||||
void reflection_process(uint ref_index, vec3 view, vec3 vertex, vec3 normal, float roughness, vec3 ambient_light, vec3 specular_light, inout vec4 ambient_accum, inout vec4 reflection_accum) {
|
||||
vec3 box_extents = reflections.data[ref_index].box_extents;
|
||||
vec3 local_pos = (reflections.data[ref_index].local_matrix * vec4(vertex, 1.0)).xyz;
|
||||
|
||||
|
@ -877,7 +877,7 @@ void reflection_process(uint ref_index, vec3 vertex, vec3 normal, float roughnes
|
|||
return;
|
||||
}
|
||||
|
||||
vec3 ref_vec = normalize(reflect(vertex, normal));
|
||||
vec3 ref_vec = normalize(reflect(-view, normal));
|
||||
|
||||
vec3 inner_pos = abs(local_pos / box_extents);
|
||||
float blend = max(inner_pos.x, max(inner_pos.y, inner_pos.z));
|
||||
|
|
|
@ -586,7 +586,11 @@ void main() {
|
|||
|
||||
//lay out everything, whatever is unused is optimized away anyway
|
||||
vec3 vertex = vertex_interp;
|
||||
#ifdef USE_MULTIVIEW
|
||||
vec3 view = -normalize(vertex_interp - scene_data.eye_offset[ViewIndex].xyz);
|
||||
#else
|
||||
vec3 view = -normalize(vertex_interp);
|
||||
#endif
|
||||
vec3 albedo = vec3(1.0);
|
||||
vec3 backlight = vec3(0.0);
|
||||
vec4 transmittance_color = vec4(0.0);
|
||||
|
@ -1051,7 +1055,7 @@ void main() {
|
|||
#else
|
||||
vec3 bent_normal = normal;
|
||||
#endif
|
||||
reflection_process(reflection_index, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum);
|
||||
reflection_process(reflection_index, view, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum);
|
||||
}
|
||||
|
||||
if (reflection_accum.a > 0.0) {
|
||||
|
|
|
@ -134,6 +134,7 @@ struct SceneData {
|
|||
// only used for multiview
|
||||
highp mat4 projection_matrix_view[MAX_VIEWS];
|
||||
highp mat4 inv_projection_matrix_view[MAX_VIEWS];
|
||||
highp vec4 eye_offset[MAX_VIEWS];
|
||||
|
||||
highp vec2 viewport_size;
|
||||
highp vec2 screen_pixel_size;
|
||||
|
|
Loading…
Reference in a new issue