mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
glgsg: support gl-depth-zero-to-one to get same NDC Z range as D3D
This commit is contained in:
parent
16daf08e42
commit
828233a8f2
@ -864,14 +864,22 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot,
|
|||||||
case RTP_depth_stencil:
|
case RTP_depth_stencil:
|
||||||
if (_fb_properties.get_depth_bits() > 24 ||
|
if (_fb_properties.get_depth_bits() > 24 ||
|
||||||
_fb_properties.get_float_depth()) {
|
_fb_properties.get_float_depth()) {
|
||||||
|
if (!glgsg->_use_remapped_depth_range) {
|
||||||
gl_format = GL_DEPTH32F_STENCIL8;
|
gl_format = GL_DEPTH32F_STENCIL8;
|
||||||
|
} else {
|
||||||
|
gl_format = GL_DEPTH32F_STENCIL8_NV;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
gl_format = GL_DEPTH24_STENCIL8;
|
gl_format = GL_DEPTH24_STENCIL8;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RTP_depth:
|
case RTP_depth:
|
||||||
if (_fb_properties.get_float_depth()) {
|
if (_fb_properties.get_float_depth()) {
|
||||||
|
if (!glgsg->_use_remapped_depth_range) {
|
||||||
gl_format = GL_DEPTH_COMPONENT32F;
|
gl_format = GL_DEPTH_COMPONENT32F;
|
||||||
|
} else {
|
||||||
|
gl_format = GL_DEPTH_COMPONENT32F_NV;
|
||||||
|
}
|
||||||
} else if (_fb_properties.get_depth_bits() > 24) {
|
} else if (_fb_properties.get_depth_bits() > 24) {
|
||||||
gl_format = GL_DEPTH_COMPONENT32;
|
gl_format = GL_DEPTH_COMPONENT32;
|
||||||
} else if (_fb_properties.get_depth_bits() > 16) {
|
} else if (_fb_properties.get_depth_bits() > 16) {
|
||||||
|
@ -2997,6 +2997,50 @@ reset() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Set depth range from zero to one if requested.
|
||||||
|
#ifndef OPENGLES
|
||||||
|
_use_depth_zero_to_one = false;
|
||||||
|
_use_remapped_depth_range = false;
|
||||||
|
|
||||||
|
if (gl_depth_zero_to_one) {
|
||||||
|
if (is_at_least_gl_version(4, 5) || has_extension("GL_ARB_clip_control")) {
|
||||||
|
PFNGLCLIPCONTROLPROC pglClipControl =
|
||||||
|
(PFNGLCLIPCONTROLPROC)get_extension_func("glClipControl");
|
||||||
|
|
||||||
|
if (pglClipControl != nullptr) {
|
||||||
|
pglClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE);
|
||||||
|
_use_depth_zero_to_one = true;
|
||||||
|
|
||||||
|
if (GLCAT.is_debug()) {
|
||||||
|
GLCAT.debug()
|
||||||
|
<< "Set zero-to-one depth using glClipControl\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}/* else if (has_extension("GL_NV_depth_buffer_float")) {
|
||||||
|
// Alternatively, all GeForce 8+ and even some AMD drivers support this
|
||||||
|
// extension, which (unlike the core glDepthRange, which clamps its
|
||||||
|
// input parameters) can compensate for the built-in depth remapping.
|
||||||
|
_glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)get_extension_func("glDepthRangedNV");
|
||||||
|
|
||||||
|
if (_glDepthRangedNV != nullptr) {
|
||||||
|
_glDepthRangedNV(-1.0, 1.0);
|
||||||
|
_use_depth_zero_to_one = true;
|
||||||
|
_use_remapped_depth_range = true;
|
||||||
|
|
||||||
|
if (GLCAT.is_debug()) {
|
||||||
|
GLCAT.debug()
|
||||||
|
<< "Set zero-to-one depth using glDepthRangedNV\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
if (!_use_depth_zero_to_one) {
|
||||||
|
GLCAT.warning()
|
||||||
|
<< "Zero-to-one depth was requested, but driver does not support it.\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Set up all the enableddisabled flags to GL's known initial values:
|
// Set up all the enableddisabled flags to GL's known initial values:
|
||||||
// everything off.
|
// everything off.
|
||||||
_multisample_mode = 0;
|
_multisample_mode = 0;
|
||||||
@ -3646,6 +3690,19 @@ calc_projection_mat(const Lens *lens) {
|
|||||||
lens->get_coordinate_system()) *
|
lens->get_coordinate_system()) *
|
||||||
lens->get_projection_mat(_current_stereo_channel);
|
lens->get_projection_mat(_current_stereo_channel);
|
||||||
|
|
||||||
|
#ifndef OPENGLES
|
||||||
|
if (_use_depth_zero_to_one) {
|
||||||
|
// If we requested that the OpenGL NDC Z goes from zero to one like in
|
||||||
|
// Direct3D, we need to scale the projection matrix, which assumes -1..1.
|
||||||
|
static const LMatrix4 rescale_mat
|
||||||
|
(1, 0, 0, 0,
|
||||||
|
0, 1, 0, 0,
|
||||||
|
0, 0, 0.5, 0,
|
||||||
|
0, 0, 0.5, 1);
|
||||||
|
result *= rescale_mat;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (_scene_setup->get_inverted()) {
|
if (_scene_setup->get_inverted()) {
|
||||||
// If the scene is supposed to be inverted, then invert the projection
|
// If the scene is supposed to be inverted, then invert the projection
|
||||||
// matrix.
|
// matrix.
|
||||||
@ -7452,7 +7509,13 @@ do_issue_depth_offset() {
|
|||||||
glDepthRangef((GLclampf)min_value, (GLclampf)max_value);
|
glDepthRangef((GLclampf)min_value, (GLclampf)max_value);
|
||||||
#else
|
#else
|
||||||
// Mainline OpenGL uses a double-precision call.
|
// Mainline OpenGL uses a double-precision call.
|
||||||
|
if (!_use_remapped_depth_range) {
|
||||||
glDepthRange((GLclampd)min_value, (GLclampd)max_value);
|
glDepthRange((GLclampd)min_value, (GLclampd)max_value);
|
||||||
|
} else {
|
||||||
|
// If we have a remapped depth range, we should adjust the values to range
|
||||||
|
// from -1 to 1. We need to use an NV extension to pass unclamped values.
|
||||||
|
_glDepthRangedNV(min_value * 2.0 - 1.0, max_value * 2.0 - 1.0);
|
||||||
|
}
|
||||||
#endif // OPENGLES
|
#endif // OPENGLES
|
||||||
|
|
||||||
report_my_gl_errors();
|
report_my_gl_errors();
|
||||||
|
@ -743,6 +743,12 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
#ifndef OPENGLES
|
||||||
|
bool _use_depth_zero_to_one;
|
||||||
|
bool _use_remapped_depth_range;
|
||||||
|
PFNGLDEPTHRANGEDNVPROC _glDepthRangedNV;
|
||||||
|
#endif
|
||||||
|
|
||||||
bool _supports_point_parameters;
|
bool _supports_point_parameters;
|
||||||
PFNGLPOINTPARAMETERFVPROC _glPointParameterfv;
|
PFNGLPOINTPARAMETERFVPROC _glPointParameterfv;
|
||||||
bool _supports_point_sprite;
|
bool _supports_point_sprite;
|
||||||
|
@ -313,6 +313,13 @@ ConfigVariableEnum<CoordinateSystem> gl_coordinate_system
|
|||||||
"creating a shader-only application, it may be easier and "
|
"creating a shader-only application, it may be easier and "
|
||||||
"more efficient to set this to default."));
|
"more efficient to set this to default."));
|
||||||
|
|
||||||
|
ConfigVariableBool gl_depth_zero_to_one
|
||||||
|
("gl-depth-zero-to-one", false,
|
||||||
|
PRC_DESC("Normally, OpenGL uses an NDC coordinate space wherein the Z "
|
||||||
|
"ranges from -1 to 1. This setting can be used to instead use a "
|
||||||
|
"range from 0 to 1, matching other graphics APIs. This setting "
|
||||||
|
"requires OpenGL 4.5, or NVIDIA GeForce 8+ hardware."));
|
||||||
|
|
||||||
extern ConfigVariableBool gl_parallel_arrays;
|
extern ConfigVariableBool gl_parallel_arrays;
|
||||||
|
|
||||||
void CLP(init_classes)() {
|
void CLP(init_classes)() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user