In place change to reverse Z rendering and 32 bit float offscreen depth buffer
This commit is contained in:
@@ -39,15 +39,6 @@ typedef enum mjtFramebuffer_ { // OpenGL framebuffer option
|
|||||||
mjFB_OFFSCREEN // offscreen buffer
|
mjFB_OFFSCREEN // offscreen buffer
|
||||||
} mjtFramebuffer;
|
} mjtFramebuffer;
|
||||||
|
|
||||||
typedef enum mjtDepthMapping_ { // OpenGL depth buffer mapping (from znear to zfar)
|
|
||||||
mjDB_NEGONETOONE = 0, // Negative one to one (OpenGL default)
|
|
||||||
mjDB_ONETOZERO // Reversed Z buffer (decreases numerical error)
|
|
||||||
} mjtDepthMapping;
|
|
||||||
|
|
||||||
typedef enum mjtDepthPrecision_ { // OpenGL depth buffer precision
|
|
||||||
mjDB_INT24 = 0, // 24 bit integer buffer (OpenGL default)
|
|
||||||
mjDB_FLOAT32 // 32 bit float buffer
|
|
||||||
} mjtDepthPrecision;
|
|
||||||
|
|
||||||
typedef enum mjtFontScale_ { // font scale, used at context creation
|
typedef enum mjtFontScale_ { // font scale, used at context creation
|
||||||
mjFONTSCALE_50 = 50, // 50% scale, suitable for low-res rendering
|
mjFONTSCALE_50 = 50, // 50% scale, suitable for low-res rendering
|
||||||
@@ -160,12 +151,6 @@ struct mjrContext_ { // custom OpenGL context
|
|||||||
|
|
||||||
// pixel output format
|
// pixel output format
|
||||||
int readPixelFormat; // default color pixel format for mjr_readPixels
|
int readPixelFormat; // default color pixel format for mjr_readPixels
|
||||||
|
|
||||||
// depth buffer mode
|
|
||||||
int depthMapping; // depth buffer mapping from [znear zfar] to normalized device coordinates: mjDB_NEGONETOONE or mjDB_ONETOZERO
|
|
||||||
|
|
||||||
// depth buffer precision
|
|
||||||
int depthPrecision; // depth buffer precision: mjDB_INT24 or mjDB_FLOAT32
|
|
||||||
};
|
};
|
||||||
typedef struct mjrContext_ mjrContext;
|
typedef struct mjrContext_ mjrContext;
|
||||||
|
|
||||||
|
|||||||
@@ -621,24 +621,6 @@ ENUMS: Mapping[str, EnumDecl] = dict([
|
|||||||
('mjFB_OFFSCREEN', 1),
|
('mjFB_OFFSCREEN', 1),
|
||||||
]),
|
]),
|
||||||
)),
|
)),
|
||||||
('mjtDepthMapping',
|
|
||||||
EnumDecl(
|
|
||||||
name='mjtDepthMapping',
|
|
||||||
declname='enum mjtDepthMapping_',
|
|
||||||
values=dict([
|
|
||||||
('mjDB_NEGONETOONE', 0),
|
|
||||||
('mjDB_ONETOZERO', 1),
|
|
||||||
]),
|
|
||||||
)),
|
|
||||||
('mjtDepthPrecision',
|
|
||||||
EnumDecl(
|
|
||||||
name='mjtDepthPrecision',
|
|
||||||
declname='enum mjtDepthPrecision_',
|
|
||||||
values=dict([
|
|
||||||
('mjDB_INT24', 0),
|
|
||||||
('mjDB_FLOAT32', 1),
|
|
||||||
]),
|
|
||||||
)),
|
|
||||||
('mjtFontScale',
|
('mjtFontScale',
|
||||||
EnumDecl(
|
EnumDecl(
|
||||||
name='mjtFontScale',
|
name='mjtFontScale',
|
||||||
|
|||||||
@@ -7126,16 +7126,6 @@ STRUCTS: Mapping[str, StructDecl] = dict([
|
|||||||
type=ValueType(name='int'),
|
type=ValueType(name='int'),
|
||||||
doc='default color pixel format for mjr_readPixels',
|
doc='default color pixel format for mjr_readPixels',
|
||||||
),
|
),
|
||||||
StructFieldDecl(
|
|
||||||
name='depthMapping',
|
|
||||||
type=ValueType(name='int'),
|
|
||||||
doc='depth buffer mapping from [znear zfar] to normalized device coordinates: mjDB_NEGONETOONE or mjDB_ONETOZERO', # pylint: disable=line-too-long
|
|
||||||
),
|
|
||||||
StructFieldDecl(
|
|
||||||
name='depthPrecision',
|
|
||||||
type=ValueType(name='int'),
|
|
||||||
doc='depth buffer precision: mjDB_INT24 or mjDB_FLOAT32',
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
)),
|
)),
|
||||||
('mjuiState',
|
('mjuiState',
|
||||||
|
|||||||
@@ -34,10 +34,6 @@ class MjWrapper<raw::MjrContext> : public WrapperBase<raw::MjrContext> {
|
|||||||
public:
|
public:
|
||||||
MjWrapper();
|
MjWrapper();
|
||||||
MjWrapper(const MjModelWrapper& model, int fontscale);
|
MjWrapper(const MjModelWrapper& model, int fontscale);
|
||||||
MjWrapper(const MjModelWrapper& model,
|
|
||||||
int fontscale,
|
|
||||||
mjtDepthMapping depthmapping,
|
|
||||||
mjtDepthPrecision depthprecision);
|
|
||||||
MjWrapper(const MjWrapper&) = delete;
|
MjWrapper(const MjWrapper&) = delete;
|
||||||
MjWrapper(MjWrapper&&) = default;
|
MjWrapper(MjWrapper&&) = default;
|
||||||
~MjWrapper() = default;
|
~MjWrapper() = default;
|
||||||
@@ -126,35 +122,6 @@ MjrContextWrapper::MjWrapper(const MjModelWrapper& model, int fontscale)
|
|||||||
X_SKIN(skinfaceVBO),
|
X_SKIN(skinfaceVBO),
|
||||||
X(charWidth),
|
X(charWidth),
|
||||||
X(charWidthBig) {}
|
X(charWidthBig) {}
|
||||||
|
|
||||||
MjrContextWrapper::MjWrapper(const MjModelWrapper& model,
|
|
||||||
int fontscale,
|
|
||||||
mjtDepthMapping depthmapping,
|
|
||||||
mjtDepthPrecision depthprecision)
|
|
||||||
: WrapperBase([fontscale, depthmapping, depthprecision](const raw::MjModel* m) {
|
|
||||||
raw::MjrContext *const ctx = new raw::MjrContext;
|
|
||||||
mjr_defaultContext(ctx);
|
|
||||||
ctx->depthMapping = depthmapping;
|
|
||||||
ctx->depthPrecision = depthprecision;
|
|
||||||
InterceptMjErrors(mjr_makeContext)(m, ctx, fontscale);
|
|
||||||
return ctx;
|
|
||||||
}(model.get()), &MjrContextCapsuleDestructor),
|
|
||||||
X(fogRGBA),
|
|
||||||
X(auxWidth),
|
|
||||||
X(auxHeight),
|
|
||||||
X(auxSamples),
|
|
||||||
X(auxFBO),
|
|
||||||
X(auxFBO_r),
|
|
||||||
X(auxColor),
|
|
||||||
X(auxColor_r),
|
|
||||||
X(textureType),
|
|
||||||
X(texture),
|
|
||||||
X_SKIN(skinvertVBO),
|
|
||||||
X_SKIN(skinnormalVBO),
|
|
||||||
X_SKIN(skintexcoordVBO),
|
|
||||||
X_SKIN(skinfaceVBO),
|
|
||||||
X(charWidth),
|
|
||||||
X(charWidthBig) {}
|
|
||||||
#undef X_SKIN
|
#undef X_SKIN
|
||||||
#undef X
|
#undef X
|
||||||
|
|
||||||
@@ -199,7 +166,6 @@ PYBIND11_MODULE(_render, pymodule) {
|
|||||||
py::class_<MjrContextWrapper> mjrContext(pymodule, "MjrContext");
|
py::class_<MjrContextWrapper> mjrContext(pymodule, "MjrContext");
|
||||||
mjrContext.def(py::init<>());
|
mjrContext.def(py::init<>());
|
||||||
mjrContext.def(py::init<const MjModelWrapper&, int>());
|
mjrContext.def(py::init<const MjModelWrapper&, int>());
|
||||||
mjrContext.def(py::init<const MjModelWrapper&, int, mjtDepthMapping, mjtDepthPrecision>());
|
|
||||||
mjrContext.def(
|
mjrContext.def(
|
||||||
"free", [](MjrContextWrapper& self) { self.Free(); },
|
"free", [](MjrContextWrapper& self) { self.Free(); },
|
||||||
py::doc("Frees resources in current active OpenGL context, sets struct "
|
py::doc("Frees resources in current active OpenGL context, sets struct "
|
||||||
|
|||||||
@@ -32,9 +32,7 @@ class Renderer:
|
|||||||
model: _structs.MjModel,
|
model: _structs.MjModel,
|
||||||
height: int = 240,
|
height: int = 240,
|
||||||
width: int = 320,
|
width: int = 320,
|
||||||
max_geom: int = 10000,
|
max_geom: int = 10000
|
||||||
depth_mapping: _enums.mjtDepthMapping = _enums.mjtDepthMapping.mjDB_NEGONETOONE,
|
|
||||||
depth_precision: _enums.mjtDepthPrecision = _enums.mjtDepthPrecision.mjDB_INT24,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Initializes a new `Renderer`.
|
"""Initializes a new `Renderer`.
|
||||||
|
|
||||||
@@ -45,8 +43,6 @@ class Renderer:
|
|||||||
max_geom: Optional integer specifying the maximum number of geoms that can
|
max_geom: Optional integer specifying the maximum number of geoms that can
|
||||||
be rendered in the same scene. If None this will be chosen automatically
|
be rendered in the same scene. If None this will be chosen automatically
|
||||||
based on the estimated maximum number of renderable geoms in the model.
|
based on the estimated maximum number of renderable geoms in the model.
|
||||||
depth_mapping: Type of mapping from znear to zfar to z buffer ndc values
|
|
||||||
depth_precision: Precision of z buffer
|
|
||||||
Raises:
|
Raises:
|
||||||
ValueError: If `camera_id` is outside the valid range, or if `width` or
|
ValueError: If `camera_id` is outside the valid range, or if `width` or
|
||||||
`height` exceed the dimensions of MuJoCo's offscreen framebuffer.
|
`height` exceed the dimensions of MuJoCo's offscreen framebuffer.
|
||||||
@@ -74,7 +70,6 @@ the clause:
|
|||||||
self._width = width
|
self._width = width
|
||||||
self._height = height
|
self._height = height
|
||||||
self._model = model
|
self._model = model
|
||||||
self._depth_mapping = depth_mapping
|
|
||||||
|
|
||||||
self._scene = _structs.MjvScene(model=model, maxgeom=max_geom)
|
self._scene = _structs.MjvScene(model=model, maxgeom=max_geom)
|
||||||
self._scene_option = _structs.MjvOption()
|
self._scene_option = _structs.MjvOption()
|
||||||
@@ -86,7 +81,7 @@ the clause:
|
|||||||
self._gl_context = gl_context.GLContext(width, height) # type: ignore
|
self._gl_context = gl_context.GLContext(width, height) # type: ignore
|
||||||
self._gl_context.make_current()
|
self._gl_context.make_current()
|
||||||
self._mjr_context = _render.MjrContext(
|
self._mjr_context = _render.MjrContext(
|
||||||
model, _enums.mjtFontScale.mjFONTSCALE_150.value, depth_mapping, depth_precision
|
model, _enums.mjtFontScale.mjFONTSCALE_150.value
|
||||||
)
|
)
|
||||||
_render.mjr_setBuffer(
|
_render.mjr_setBuffer(
|
||||||
_enums.mjtFramebuffer.mjFB_OFFSCREEN.value, self._mjr_context
|
_enums.mjtFramebuffer.mjFB_OFFSCREEN.value, self._mjr_context
|
||||||
@@ -188,20 +183,16 @@ the clause:
|
|||||||
D = -(np.float32(2)*zfar*znear)/(zfar - znear)
|
D = -(np.float32(2)*zfar*znear)/(zfar - znear)
|
||||||
|
|
||||||
# In reverse Z mode the perspective matrix is transformed by the following
|
# In reverse Z mode the perspective matrix is transformed by the following
|
||||||
if self._depth_mapping == _enums.mjtDepthMapping.mjDB_ONETOZERO:
|
C = np.float32(-0.5)*C - np.float32(0.5)
|
||||||
C = np.float32(-0.5)*C - np.float32(0.5)
|
D = np.float32(-0.5)*D
|
||||||
D = np.float32(-0.5)*D
|
|
||||||
|
|
||||||
# We need 64 bits to convert Z from ndc to metric depth without noticeable losses in precision
|
# We need 64 bits to convert Z from ndc to metric depth without noticeable losses in precision
|
||||||
out_64 = out.astype(np.float64)
|
out_64 = out.astype(np.float64)
|
||||||
|
|
||||||
# Convert depth from window coordinates to normalized device coordinates
|
|
||||||
# In reversed Z mode the mapping is identity
|
|
||||||
# https://registry.khronos.org/OpenGL-Refpages/gl4/html/glDepthRange.xhtml
|
|
||||||
if self._depth_mapping == _enums.mjtDepthMapping.mjDB_NEGONETOONE:
|
|
||||||
out_64 = 2.0*out_64 - 1.0
|
|
||||||
|
|
||||||
# Undo OpenGL projection
|
# Undo OpenGL projection
|
||||||
|
# Note: We do not need to take action to convert from window coordinates to
|
||||||
|
# normalized device coordinates because in reversed Z mode the mapping
|
||||||
|
# is identity
|
||||||
out_64 = D / (out_64 + C)
|
out_64 = D / (out_64 + C)
|
||||||
|
|
||||||
# Cast result back to float32 for backwards compatibility
|
# Cast result back to float32 for backwards compatibility
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ void PlatformUIAdapter::FreeMjrContext() {
|
|||||||
|
|
||||||
bool PlatformUIAdapter::RefreshMjrContext(const mjModel* m, int fontscale) {
|
bool PlatformUIAdapter::RefreshMjrContext(const mjModel* m, int fontscale) {
|
||||||
if (m != last_model_ || fontscale != last_fontscale_) {
|
if (m != last_model_ || fontscale != last_fontscale_) {
|
||||||
// con_.depthMapping = mjDB_ONETOZERO;
|
|
||||||
mjr_makeContext(m, &con_, fontscale);
|
mjr_makeContext(m, &con_, fontscale);
|
||||||
last_model_ = m;
|
last_model_ = m;
|
||||||
last_fontscale_ = fontscale;
|
last_fontscale_ = fontscale;
|
||||||
|
|||||||
@@ -1062,11 +1062,7 @@ static void makeShadow(const mjModel* m, mjrContext* con) {
|
|||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
|
||||||
if (con->depthMapping == mjDB_ONETOZERO) {
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_GEQUAL);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_GEQUAL);
|
|
||||||
} else {
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
|
|
||||||
}
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
|
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
|
||||||
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
|
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
|
||||||
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
|
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
|
||||||
@@ -1125,17 +1121,16 @@ static void makeOff(mjrContext* con) {
|
|||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, con->offColor);
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, con->offColor);
|
||||||
|
|
||||||
// create depth and stencil buffer
|
// create depth and stencil buffer
|
||||||
GLenum depth_buffer_format = con->depthPrecision == mjDB_FLOAT32 ? GL_DEPTH32F_STENCIL8 : GL_DEPTH24_STENCIL8;
|
|
||||||
glGenRenderbuffers(1, &con->offDepthStencil);
|
glGenRenderbuffers(1, &con->offDepthStencil);
|
||||||
if (!con->offDepthStencil) {
|
if (!con->offDepthStencil) {
|
||||||
mju_error("Could not allocate offscreen depth and stencil buffer");
|
mju_error("Could not allocate offscreen depth and stencil buffer");
|
||||||
}
|
}
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, con->offDepthStencil);
|
glBindRenderbuffer(GL_RENDERBUFFER, con->offDepthStencil);
|
||||||
if (con->offSamples) {
|
if (con->offSamples) {
|
||||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, con->offSamples, depth_buffer_format,
|
glRenderbufferStorageMultisample(GL_RENDERBUFFER, con->offSamples, GL_DEPTH32F_STENCIL8,
|
||||||
con->offWidth, con->offHeight);
|
con->offWidth, con->offHeight);
|
||||||
} else {
|
} else {
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, depth_buffer_format, con->offWidth, con->offHeight);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH32F_STENCIL8, con->offWidth, con->offHeight);
|
||||||
}
|
}
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
|
||||||
GL_RENDERBUFFER, con->offDepthStencil);
|
GL_RENDERBUFFER, con->offDepthStencil);
|
||||||
@@ -1174,7 +1169,7 @@ static void makeOff(mjrContext* con) {
|
|||||||
mju_error("Could not allocate offscreen depth and stencil buffer_r");
|
mju_error("Could not allocate offscreen depth and stencil buffer_r");
|
||||||
}
|
}
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, con->offDepthStencil_r);
|
glBindRenderbuffer(GL_RENDERBUFFER, con->offDepthStencil_r);
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, depth_buffer_format, con->offWidth, con->offHeight);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH32F_STENCIL8, con->offWidth, con->offHeight);
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
|
||||||
GL_RENDERBUFFER, con->offDepthStencil_r);
|
GL_RENDERBUFFER, con->offDepthStencil_r);
|
||||||
|
|
||||||
@@ -1546,15 +1541,7 @@ void mjr_makeContext_offSize(const mjModel* m, mjrContext* con, int fontscale,
|
|||||||
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
|
||||||
// free previous context but keep depth settings
|
|
||||||
// Doing this is the only way users can control these
|
|
||||||
// settings without breaking changes to either the
|
|
||||||
// behaviour of mjr_makeContext or the signature
|
|
||||||
int oldDepthMapping = con->depthMapping;
|
|
||||||
int oldDepthPrecision = con->depthPrecision;
|
|
||||||
mjr_freeContext(con);
|
mjr_freeContext(con);
|
||||||
con->depthMapping = oldDepthMapping;
|
|
||||||
con->depthPrecision = oldDepthPrecision;
|
|
||||||
|
|
||||||
// no model: offscreen and font only
|
// no model: offscreen and font only
|
||||||
if (!m) {
|
if (!m) {
|
||||||
@@ -1847,13 +1834,12 @@ MJAPI void mjr_resizeOffscreen(int width, int height, mjrContext* con) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GLenum depth_buffer_format = con->depthPrecision == mjDB_FLOAT32 ? GL_DEPTH32F_STENCIL8 : GL_DEPTH24_STENCIL8;
|
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, con->offDepthStencil);
|
glBindRenderbuffer(GL_RENDERBUFFER, con->offDepthStencil);
|
||||||
if (con->offSamples) {
|
if (con->offSamples) {
|
||||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, con->offSamples, depth_buffer_format,
|
glRenderbufferStorageMultisample(GL_RENDERBUFFER, con->offSamples, GL_DEPTH32F_STENCIL8,
|
||||||
con->offWidth, con->offHeight);
|
con->offWidth, con->offHeight);
|
||||||
} else {
|
} else {
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, depth_buffer_format, con->offWidth, con->offHeight);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH32F_STENCIL8, con->offWidth, con->offHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (con->offSamples) {
|
if (con->offSamples) {
|
||||||
@@ -1861,6 +1847,6 @@ MJAPI void mjr_resizeOffscreen(int width, int height, mjrContext* con) {
|
|||||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, con->offWidth, con->offHeight);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, con->offWidth, con->offHeight);
|
||||||
|
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, con->offDepthStencil_r);
|
glBindRenderbuffer(GL_RENDERBUFFER, con->offDepthStencil_r);
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, depth_buffer_format, con->offWidth, con->offHeight);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH32F_STENCIL8, con->offWidth, con->offHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-38
@@ -498,11 +498,7 @@ static void initGL3(const mjvScene* scn, const mjrContext* con) {
|
|||||||
// common options
|
// common options
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glEnable(GL_NORMALIZE);
|
glEnable(GL_NORMALIZE);
|
||||||
if (con->depthMapping == mjDB_ONETOZERO) {
|
glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE);
|
||||||
glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE);
|
|
||||||
} else {
|
|
||||||
glClipControl(GL_LOWER_LEFT, GL_NEGATIVE_ONE_TO_ONE);
|
|
||||||
}
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glDepthMask(GL_TRUE);
|
glDepthMask(GL_TRUE);
|
||||||
if (scn->flags[mjRND_CULL_FACE]) {
|
if (scn->flags[mjRND_CULL_FACE]) {
|
||||||
@@ -511,19 +507,11 @@ static void initGL3(const mjvScene* scn, const mjrContext* con) {
|
|||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
glShadeModel(GL_SMOOTH);
|
glShadeModel(GL_SMOOTH);
|
||||||
if (con->depthMapping == mjDB_ONETOZERO) {
|
glDepthFunc(GL_GEQUAL);
|
||||||
glDepthFunc(GL_GEQUAL);
|
|
||||||
} else {
|
|
||||||
glDepthFunc(GL_LEQUAL);
|
|
||||||
}
|
|
||||||
glDepthRange(0, 1);
|
glDepthRange(0, 1);
|
||||||
glAlphaFunc(GL_GEQUAL, 0.99f);
|
glAlphaFunc(GL_GEQUAL, 0.99f);
|
||||||
glClearColor(0, 0, 0, 0);
|
glClearColor(0, 0, 0, 0);
|
||||||
if (con->depthMapping == mjDB_ONETOZERO) {
|
glClearDepth(0);
|
||||||
glClearDepth(0);
|
|
||||||
} else {
|
|
||||||
glClearDepth(1);
|
|
||||||
}
|
|
||||||
glClearStencil(0);
|
glClearStencil(0);
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
|
||||||
@@ -613,11 +601,9 @@ static void setView(int view, mjrRect viewport, const mjvScene* scn, const mjrCo
|
|||||||
// set projection
|
// set projection
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
if (con->depthMapping == mjDB_ONETOZERO) {
|
// reverse Z rendering mapping (znear, zfar) -> (1, 0)
|
||||||
// account for GL_ZERO_TO_ONE and reverse Z
|
glTranslatef(0,0,0.5);
|
||||||
glTranslatef(0,0,0.5);
|
glScalef(1,1,-0.5);
|
||||||
glScalef(1,1,-0.5);
|
|
||||||
}
|
|
||||||
glFrustum(cam.frustum_center - halfwidth,
|
glFrustum(cam.frustum_center - halfwidth,
|
||||||
cam.frustum_center + halfwidth,
|
cam.frustum_center + halfwidth,
|
||||||
cam.frustum_bottom,
|
cam.frustum_bottom,
|
||||||
@@ -690,24 +676,12 @@ void mjr_render(mjrRect viewport, mjvScene* scn, const mjrContext* con) {
|
|||||||
float temp[4], headpos[3], forward[3], skyboxdst;
|
float temp[4], headpos[3], forward[3], skyboxdst;
|
||||||
float camProject[16], camView[16], lightProject[16], lightView[16];
|
float camProject[16], camView[16], lightProject[16], lightView[16];
|
||||||
double clipplane[4];
|
double clipplane[4];
|
||||||
float biasMatrixOneToZero[16] = {
|
float biasMatrix[16] = {
|
||||||
0.5f, 0.0f, 0.0f, 0.0f,
|
0.5f, 0.0f, 0.0f, 0.0f,
|
||||||
0.0f, 0.5f, 0.0f, 0.0f,
|
0.0f, 0.5f, 0.0f, 0.0f,
|
||||||
0.0f, 0.0f, 1.0f, 0.0f,
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
0.5f, 0.5f, 0.0f, 1.0f
|
0.5f, 0.5f, 0.0f, 1.0f
|
||||||
};
|
};
|
||||||
float biasMatrixNegOneToOne[16] = {
|
|
||||||
0.5f, 0.0f, 0.0f, 0.0f,
|
|
||||||
0.0f, 0.5f, 0.0f, 0.0f,
|
|
||||||
0.0f, 0.0f, 0.5f, 0.0f,
|
|
||||||
0.5f, 0.5f, 0.5f, 1.0f
|
|
||||||
};
|
|
||||||
float* biasMatrix;
|
|
||||||
if (con->depthMapping == mjDB_ONETOZERO) {
|
|
||||||
biasMatrix = biasMatrixOneToZero;
|
|
||||||
} else {
|
|
||||||
biasMatrix = biasMatrixNegOneToOne;
|
|
||||||
}
|
|
||||||
|
|
||||||
float tempMatrix[16], textureMatrix[16];
|
float tempMatrix[16], textureMatrix[16];
|
||||||
mjvGeom *thisgeom, tempgeom;
|
mjvGeom *thisgeom, tempgeom;
|
||||||
@@ -1056,11 +1030,9 @@ void mjr_render(mjrRect viewport, mjvScene* scn, const mjrContext* con) {
|
|||||||
// set projection: from light viewpoint
|
// set projection: from light viewpoint
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
if (con->depthMapping == mjDB_ONETOZERO) {
|
// reverse Z rendering mapping (znear, zfar) -> (1, 0)
|
||||||
// account for GL_ZERO_TO_ONE and reverse Z
|
glTranslatef(0,0,0.5);
|
||||||
glTranslatef(0,0,0.5);
|
glScalef(1,1,-0.5);
|
||||||
glScalef(1,1,-0.5);
|
|
||||||
}
|
|
||||||
if (thislight->directional) {
|
if (thislight->directional) {
|
||||||
glOrtho(-con->shadowClip, con->shadowClip,
|
glOrtho(-con->shadowClip, con->shadowClip,
|
||||||
-con->shadowClip, con->shadowClip,
|
-con->shadowClip, con->shadowClip,
|
||||||
|
|||||||
@@ -389,14 +389,6 @@ public enum mjtFramebuffer : int{
|
|||||||
mjFB_WINDOW = 0,
|
mjFB_WINDOW = 0,
|
||||||
mjFB_OFFSCREEN = 1,
|
mjFB_OFFSCREEN = 1,
|
||||||
}
|
}
|
||||||
public enum mjtDepthMapping : int{
|
|
||||||
mjDB_NEGONETOONE = 0,
|
|
||||||
mjDB_ONETOZERO = 1,
|
|
||||||
}
|
|
||||||
public enum mjtDepthPrecision : int{
|
|
||||||
mjDB_INT24 = 0,
|
|
||||||
mjDB_FLOAT32 = 1,
|
|
||||||
}
|
|
||||||
public enum mjtFontScale : int{
|
public enum mjtFontScale : int{
|
||||||
mjFONTSCALE_50 = 50,
|
mjFONTSCALE_50 = 50,
|
||||||
mjFONTSCALE_100 = 100,
|
mjFONTSCALE_100 = 100,
|
||||||
|
|||||||
Reference in New Issue
Block a user