mirror of
https://github.com/Xaymar/obs-StreamFX
synced 2024-11-30 07:13:01 +00:00
obs/gs/mipmapper: Enable support for sRGB mip-mapping
This commit is contained in:
parent
9f035deaaa
commit
9859b44b1c
1 changed files with 20 additions and 15 deletions
|
@ -284,6 +284,21 @@ void streamfx::obs::gs::mipmapper::rebuild(std::shared_ptr<streamfx::obs::gs::te
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up rendering state.
|
||||||
|
gs_blend_state_push();
|
||||||
|
gs_reset_blend_state();
|
||||||
|
gs_enable_blending(false);
|
||||||
|
gs_blend_function(GS_BLEND_ONE, GS_BLEND_ZERO);
|
||||||
|
gs_enable_color(true, true, true, true);
|
||||||
|
gs_enable_depth_test(false);
|
||||||
|
gs_enable_stencil_test(false);
|
||||||
|
gs_enable_stencil_write(false);
|
||||||
|
gs_set_cull_mode(GS_NEITHER);
|
||||||
|
|
||||||
|
// sRGB support.
|
||||||
|
bool old_srgb = gs_framebuffer_srgb_enabled();
|
||||||
|
gs_enable_framebuffer_srgb(gs_get_linear_srgb());
|
||||||
|
|
||||||
// Render each mip map level.
|
// Render each mip map level.
|
||||||
for (size_t mip = 1; mip < max_mip_level; mip++) {
|
for (size_t mip = 1; mip < max_mip_level; mip++) {
|
||||||
#ifdef ENABLE_PROFILING
|
#ifdef ENABLE_PROFILING
|
||||||
|
@ -296,22 +311,11 @@ void streamfx::obs::gs::mipmapper::rebuild(std::shared_ptr<streamfx::obs::gs::te
|
||||||
float_t iwidth = 1.f / static_cast<float_t>(cwidth);
|
float_t iwidth = 1.f / static_cast<float_t>(cwidth);
|
||||||
float_t iheight = 1.f / static_cast<float_t>(cheight);
|
float_t iheight = 1.f / static_cast<float_t>(cheight);
|
||||||
|
|
||||||
// Set up rendering state.
|
|
||||||
gs_blend_state_push();
|
|
||||||
gs_reset_blend_state();
|
|
||||||
gs_enable_blending(false);
|
|
||||||
gs_blend_function(GS_BLEND_ONE, GS_BLEND_ZERO);
|
|
||||||
gs_enable_color(true, true, true, true);
|
|
||||||
gs_enable_depth_test(false);
|
|
||||||
gs_enable_stencil_test(false);
|
|
||||||
gs_enable_stencil_write(false);
|
|
||||||
gs_set_cull_mode(GS_NEITHER);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto op = _rt->render(cwidth, cheight);
|
auto op = _rt->render(cwidth, cheight);
|
||||||
gs_ortho(0, 1, 0, 1, 0, 1);
|
gs_ortho(0, 1, 0, 1, 0, 1);
|
||||||
|
|
||||||
_effect.get_parameter("image").set_texture(target);
|
_effect.get_parameter("image").set_texture(target, gs_get_linear_srgb());
|
||||||
_effect.get_parameter("imageTexel").set_float2(iwidth, iheight);
|
_effect.get_parameter("imageTexel").set_float2(iwidth, iheight);
|
||||||
_effect.get_parameter("level").set_int(int32_t(mip - 1));
|
_effect.get_parameter("level").set_int(int32_t(mip - 1));
|
||||||
while (gs_effect_loop(_effect.get_object(), "Draw")) {
|
while (gs_effect_loop(_effect.get_object(), "Draw")) {
|
||||||
|
@ -320,9 +324,6 @@ void streamfx::obs::gs::mipmapper::rebuild(std::shared_ptr<streamfx::obs::gs::te
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean up rendering state.
|
|
||||||
gs_blend_state_pop();
|
|
||||||
|
|
||||||
// Copy from the render target to the target mip level.
|
// Copy from the render target to the target mip level.
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (gs_get_device_type() == GS_DEVICE_DIRECT3D_11) {
|
if (gs_get_device_type() == GS_DEVICE_DIRECT3D_11) {
|
||||||
|
@ -334,6 +335,10 @@ void streamfx::obs::gs::mipmapper::rebuild(std::shared_ptr<streamfx::obs::gs::te
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clean up rendering state.
|
||||||
|
gs_enable_framebuffer_srgb(old_srgb);
|
||||||
|
gs_blend_state_pop();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
throw std::runtime_error("Only 2D Textures support Mip-mapping.");
|
throw std::runtime_error("Only 2D Textures support Mip-mapping.");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue