mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 11:26:18 -04:00
[graphics] fix ocean alpha and ocean near depth (#1236)
* fix up some graphics bugs * less of a hack fix
This commit is contained in:
parent
c80147119d
commit
d136aec00f
|
@ -361,7 +361,8 @@ void DirectRenderer::update_gl_blend() {
|
||||||
// (Cs - Cd) * As + Cd
|
// (Cs - Cd) * As + Cd
|
||||||
// Cs * As + (1 - As) * Cd
|
// Cs * As + (1 - As) * Cd
|
||||||
// s, d
|
// s, d
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
} else if (state.a == GsAlpha::BlendMode::SOURCE &&
|
} else if (state.a == GsAlpha::BlendMode::SOURCE &&
|
||||||
state.b == GsAlpha::BlendMode::ZERO_OR_FIXED &&
|
state.b == GsAlpha::BlendMode::ZERO_OR_FIXED &&
|
||||||
|
@ -370,7 +371,7 @@ void DirectRenderer::update_gl_blend() {
|
||||||
// Cs * As + (1) * Cd
|
// Cs * As + (1) * Cd
|
||||||
// s, d
|
// s, d
|
||||||
ASSERT(state.fix == 0);
|
ASSERT(state.fix == 0);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ZERO);
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
} else if (state.a == GsAlpha::BlendMode::ZERO_OR_FIXED &&
|
} else if (state.a == GsAlpha::BlendMode::ZERO_OR_FIXED &&
|
||||||
state.b == GsAlpha::BlendMode::SOURCE && state.c == GsAlpha::BlendMode::SOURCE &&
|
state.b == GsAlpha::BlendMode::SOURCE && state.c == GsAlpha::BlendMode::SOURCE &&
|
||||||
|
@ -378,26 +379,26 @@ void DirectRenderer::update_gl_blend() {
|
||||||
// (0 - Cs) * As + Cd
|
// (0 - Cs) * As + Cd
|
||||||
// Cd - Cs * As
|
// Cd - Cs * As
|
||||||
// s, d
|
// s, d
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ZERO);
|
||||||
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
|
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
|
||||||
} else if (state.a == GsAlpha::BlendMode::SOURCE && state.b == GsAlpha::BlendMode::DEST &&
|
} else if (state.a == GsAlpha::BlendMode::SOURCE && state.b == GsAlpha::BlendMode::DEST &&
|
||||||
state.c == GsAlpha::BlendMode::ZERO_OR_FIXED &&
|
state.c == GsAlpha::BlendMode::ZERO_OR_FIXED &&
|
||||||
state.d == GsAlpha::BlendMode::DEST) {
|
state.d == GsAlpha::BlendMode::DEST) {
|
||||||
// (Cs - Cd) * fix + Cd
|
// (Cs - Cd) * fix + Cd
|
||||||
// Cs * fix + (1 - fx) * Cd
|
// Cs * fix + (1 - fx) * Cd
|
||||||
glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
|
glBlendFuncSeparate(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA, GL_ONE, GL_ZERO);
|
||||||
glBlendColor(0, 0, 0, state.fix / 127.f);
|
glBlendColor(0, 0, 0, state.fix / 127.f);
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
} else if (state.a == GsAlpha::BlendMode::SOURCE && state.b == GsAlpha::BlendMode::SOURCE &&
|
} else if (state.a == GsAlpha::BlendMode::SOURCE && state.b == GsAlpha::BlendMode::SOURCE &&
|
||||||
state.c == GsAlpha::BlendMode::SOURCE && state.d == GsAlpha::BlendMode::SOURCE) {
|
state.c == GsAlpha::BlendMode::SOURCE && state.d == GsAlpha::BlendMode::SOURCE) {
|
||||||
// this is very weird...
|
// this is very weird...
|
||||||
glBlendFunc(GL_ONE, GL_ZERO);
|
glBlendFuncSeparate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO);
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
} else if (state.a == GsAlpha::BlendMode::SOURCE &&
|
} else if (state.a == GsAlpha::BlendMode::SOURCE &&
|
||||||
state.b == GsAlpha::BlendMode::ZERO_OR_FIXED &&
|
state.b == GsAlpha::BlendMode::ZERO_OR_FIXED &&
|
||||||
state.c == GsAlpha::BlendMode::DEST && state.d == GsAlpha::BlendMode::DEST) {
|
state.c == GsAlpha::BlendMode::DEST && state.d == GsAlpha::BlendMode::DEST) {
|
||||||
// (Cs - 0) * Ad + Cd
|
// (Cs - 0) * Ad + Cd
|
||||||
glBlendFunc(GL_DST_ALPHA, GL_ONE);
|
glBlendFuncSeparate(GL_DST_ALPHA, GL_ONE, GL_ONE, GL_ZERO);
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
m_ogl.color_mult = 0.5;
|
m_ogl.color_mult = 0.5;
|
||||||
} else {
|
} else {
|
||||||
|
@ -412,16 +413,9 @@ void DirectRenderer::update_gl_blend() {
|
||||||
if (state.a == GsAlpha::BlendMode::SOURCE && state.b == GsAlpha::BlendMode::DEST &&
|
if (state.a == GsAlpha::BlendMode::SOURCE && state.b == GsAlpha::BlendMode::DEST &&
|
||||||
state.c == GsAlpha::BlendMode::SOURCE && state.d == GsAlpha::BlendMode::DEST) {
|
state.c == GsAlpha::BlendMode::SOURCE && state.d == GsAlpha::BlendMode::DEST) {
|
||||||
if (m_prim_gl_state.fogging_enable) {
|
if (m_prim_gl_state.fogging_enable) {
|
||||||
// first draw.
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
m_ogl.alpha_mult = .5f;
|
m_ogl.alpha_mult = .5f;
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
|
||||||
} else {
|
} else {
|
||||||
// second draw.
|
glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_ONE, GL_ZERO);
|
||||||
m_ogl.alpha_mult = 2.f;
|
|
||||||
glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_ALPHA, GL_ZERO);
|
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -457,7 +451,10 @@ void DirectRenderer::update_gl_test() {
|
||||||
ASSERT(false);
|
ASSERT(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.depth_writes) {
|
bool alpha_trick_to_disable = m_test_state.alpha_test_enable &&
|
||||||
|
m_test_state.alpha_test == GsTest::AlphaTest::NEVER &&
|
||||||
|
m_test_state.afail == GsTest::AlphaFail::FB_ONLY;
|
||||||
|
if (state.depth_writes && !alpha_trick_to_disable) {
|
||||||
glDepthMask(GL_TRUE);
|
glDepthMask(GL_TRUE);
|
||||||
} else {
|
} else {
|
||||||
glDepthMask(GL_FALSE);
|
glDepthMask(GL_FALSE);
|
||||||
|
@ -831,7 +828,6 @@ void DirectRenderer::handle_zbuf1(u64 val,
|
||||||
|
|
||||||
bool write = !x.zmsk();
|
bool write = !x.zmsk();
|
||||||
// ASSERT(write);
|
// ASSERT(write);
|
||||||
|
|
||||||
if (write != m_test_state.depth_writes) {
|
if (write != m_test_state.depth_writes) {
|
||||||
m_stats.flush_from_zbuf++;
|
m_stats.flush_from_zbuf++;
|
||||||
flush_pending(render_state, prof);
|
flush_pending(render_state, prof);
|
||||||
|
|
|
@ -251,35 +251,35 @@ void DirectRenderer2::setup_opengl_for_draw_mode(const Draw& draw,
|
||||||
// (Cs - Cd) * As + Cd
|
// (Cs - Cd) * As + Cd
|
||||||
// Cs * As + (1 - As) * Cd
|
// Cs * As + (1 - As) * Cd
|
||||||
// s, d
|
// s, d
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
} else if (draw.mode.get_alpha_blend() == DrawMode::AlphaBlend::SRC_0_SRC_DST) {
|
} else if (draw.mode.get_alpha_blend() == DrawMode::AlphaBlend::SRC_0_SRC_DST) {
|
||||||
// (Cs - 0) * As + Cd
|
// (Cs - 0) * As + Cd
|
||||||
// Cs * As + (1) * Cd
|
// Cs * As + (1) * Cd
|
||||||
// s, d
|
// s, d
|
||||||
ASSERT(draw.fix == 0);
|
ASSERT(draw.fix == 0);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ZERO);
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
} else if (draw.mode.get_alpha_blend() == DrawMode::AlphaBlend::ZERO_SRC_SRC_DST) {
|
} else if (draw.mode.get_alpha_blend() == DrawMode::AlphaBlend::ZERO_SRC_SRC_DST) {
|
||||||
// (0 - Cs) * As + Cd
|
// (0 - Cs) * As + Cd
|
||||||
// Cd - Cs * As
|
// Cd - Cs * As
|
||||||
// s, d
|
// s, d
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ZERO);
|
||||||
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
|
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
|
||||||
} else if (draw.mode.get_alpha_blend() == DrawMode::AlphaBlend::SRC_DST_FIX_DST) {
|
} else if (draw.mode.get_alpha_blend() == DrawMode::AlphaBlend::SRC_DST_FIX_DST) {
|
||||||
// (Cs - Cd) * fix + Cd
|
// (Cs - Cd) * fix + Cd
|
||||||
// Cs * fix + (1 - fx) * Cd
|
// Cs * fix + (1 - fx) * Cd
|
||||||
glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
|
glBlendFuncSeparate(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA, GL_ONE, GL_ZERO);
|
||||||
glBlendColor(0, 0, 0, draw.fix / 127.f);
|
glBlendColor(0, 0, 0, draw.fix / 127.f);
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
} else if (draw.mode.get_alpha_blend() == DrawMode::AlphaBlend::SRC_SRC_SRC_SRC) {
|
} else if (draw.mode.get_alpha_blend() == DrawMode::AlphaBlend::SRC_SRC_SRC_SRC) {
|
||||||
// this is very weird...
|
// this is very weird...
|
||||||
// Cs
|
// Cs
|
||||||
glBlendFunc(GL_ONE, GL_ZERO);
|
glBlendFuncSeparate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO);
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
} else if (draw.mode.get_alpha_blend() == DrawMode::AlphaBlend::SRC_0_DST_DST) {
|
} else if (draw.mode.get_alpha_blend() == DrawMode::AlphaBlend::SRC_0_DST_DST) {
|
||||||
// (Cs - 0) * Ad + Cd
|
// (Cs - 0) * Ad + Cd
|
||||||
glBlendFunc(GL_DST_ALPHA, GL_ONE);
|
glBlendFuncSeparate(GL_DST_ALPHA, GL_ONE, GL_ONE, GL_ZERO);
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
color_mult = 0.5;
|
color_mult = 0.5;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -37,26 +37,26 @@ DoubleDraw setup_opengl_from_draw_mode(DrawMode mode, u32 tex_unit, bool mipmap)
|
||||||
switch (mode.get_alpha_blend()) {
|
switch (mode.get_alpha_blend()) {
|
||||||
case DrawMode::AlphaBlend::SRC_DST_SRC_DST:
|
case DrawMode::AlphaBlend::SRC_DST_SRC_DST:
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
||||||
break;
|
break;
|
||||||
case DrawMode::AlphaBlend::SRC_0_SRC_DST:
|
case DrawMode::AlphaBlend::SRC_0_SRC_DST:
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ZERO);
|
||||||
break;
|
break;
|
||||||
case DrawMode::AlphaBlend::SRC_0_FIX_DST:
|
case DrawMode::AlphaBlend::SRC_0_FIX_DST:
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
glBlendFunc(GL_ONE, GL_ONE);
|
glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ZERO);
|
||||||
break;
|
break;
|
||||||
case DrawMode::AlphaBlend::SRC_DST_FIX_DST:
|
case DrawMode::AlphaBlend::SRC_DST_FIX_DST:
|
||||||
// Cv = (Cs - Cd) * FIX + Cd
|
// Cv = (Cs - Cd) * FIX + Cd
|
||||||
// Cs * FIX * 0.5
|
// Cs * FIX * 0.5
|
||||||
// Cd * FIX * 0.5
|
// Cd * FIX * 0.5
|
||||||
glBlendEquation(GL_FUNC_ADD);
|
glBlendEquation(GL_FUNC_ADD);
|
||||||
glBlendFunc(GL_CONSTANT_COLOR, GL_CONSTANT_COLOR);
|
glBlendFuncSeparate(GL_CONSTANT_COLOR, GL_CONSTANT_COLOR, GL_ONE, GL_ZERO);
|
||||||
glBlendColor(0.5, 0.5, 0.5, 0.5);
|
glBlendColor(0.5, 0.5, 0.5, 0.5);
|
||||||
break;
|
break;
|
||||||
case DrawMode::AlphaBlend::ZERO_SRC_SRC_DST:
|
case DrawMode::AlphaBlend::ZERO_SRC_SRC_DST:
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ZERO);
|
||||||
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
|
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -305,7 +305,7 @@ void OceanTexture::make_texture_with_mipmaps(SharedRenderState* render_state,
|
||||||
FramebufferTexturePairContext ctxt(m_result_texture, i);
|
FramebufferTexturePairContext ctxt(m_result_texture, i);
|
||||||
glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::OCEAN_TEXTURE_MIPMAP].id(),
|
glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::OCEAN_TEXTURE_MIPMAP].id(),
|
||||||
"alpha_intensity"),
|
"alpha_intensity"),
|
||||||
std::max(0.f, 1.f - 0.4f * i));
|
std::max(0.f, 1.f - 0.51f * i));
|
||||||
glUniform1f(
|
glUniform1f(
|
||||||
glGetUniformLocation(render_state->shaders[ShaderId::OCEAN_TEXTURE_MIPMAP].id(), "scale"),
|
glGetUniformLocation(render_state->shaders[ShaderId::OCEAN_TEXTURE_MIPMAP].id(), "scale"),
|
||||||
1.f / (1 << i));
|
1.f / (1 << i));
|
||||||
|
|
Loading…
Reference in a new issue