3d: Implement SealEngine.{Set,Get}InstanceGrayscaleRate

Add a per-instance grayscale rate that desaturates the final fragment
color after tone mapping.
This commit is contained in:
kichikuou
2026-09-13 09:40:42 +09:00
parent 5cc163ab16
commit 021187752b
5 changed files with 28 additions and 4 deletions
+1
View File
@@ -199,6 +199,7 @@ struct RE_instance {
float pitch, roll, yaw; // in degrees
vec3 scale;
float alpha;
float grayscale_rate;
bool draw;
bool draw_edge;
bool draw_shadow;
+4
View File
@@ -108,6 +108,7 @@ in vec3 specular_dir;
uniform vec4 tonemap_param; // (ExposureBias, WhitePoint, A, B)
uniform vec4 tonemap_param2; // (C, D, E, F)
uniform bool nolighting;
uniform float grayscale_rate;
vec3 hable(vec3 v)
{
@@ -239,6 +240,9 @@ void main() {
#if ENGINE == SEAL_ENGINE
if (!nolighting)
frag_rgb = tone_map(frag_rgb);
if (grayscale_rate != 0.0)
frag_rgb = mix(frag_rgb, vec3(dot(frag_rgb, vec3(0.299, 0.587, 0.114))), grayscale_rate);
#endif
// Alpha mapping
+1
View File
@@ -195,6 +195,7 @@ struct RE_renderer {
GLint tonemap_param;
GLint tonemap_param2;
GLint nolighting;
GLint grayscale_rate;
GLint alpha_mode;
GLint alpha_texture;
GLint uv_scroll;
+3
View File
@@ -283,6 +283,7 @@ struct RE_renderer *RE_renderer_new(void)
r->tonemap_param = glGetUniformLocation(r->program, "tonemap_param");
r->tonemap_param2 = glGetUniformLocation(r->program, "tonemap_param2");
r->nolighting = glGetUniformLocation(r->program, "nolighting");
r->grayscale_rate = glGetUniformLocation(r->program, "grayscale_rate");
r->alpha_mode = glGetUniformLocation(r->program, "alpha_mode");
r->alpha_texture = glGetUniformLocation(r->program, "alpha_texture");
r->uv_scroll = glGetUniformLocation(r->program, "uv_scroll");
@@ -1012,6 +1013,8 @@ static void render_particle_effect(struct RE_instance *inst, struct RE_renderer
static void render_instance(struct RE_instance *inst, struct RE_renderer *r, mat4 view_mat, enum draw_phase phase)
{
glUniform1f(r->grayscale_rate, inst->grayscale_rate);
switch (inst->type) {
case RE_ITYPE_STATIC:
render_static_model(inst, r, phase);
+19 -4
View File
@@ -2422,8 +2422,23 @@ static bool SealEngine_GetInstanceAlpha(int plugin, int instance, float *alpha)
return true;
}
//bool SealEngine_SetInstanceGrayscaleRate(int PluginNumber, int InstanceNumber, float GrayscaleRate);
//bool SealEngine_GetInstanceGrayscaleRate(int PluginNumber, int InstanceNumber, float *GrayscaleRate);
static bool SealEngine_SetInstanceGrayscaleRate(int plugin, int instance, float rate)
{
struct RE_instance *ri = get_instance(plugin, instance);
if (!ri)
return false;
ri->grayscale_rate = rate;
return true;
}
static bool SealEngine_GetInstanceGrayscaleRate(int plugin, int instance, float *rate)
{
struct RE_instance *ri = get_instance(plugin, instance);
if (!ri)
return false;
*rate = ri->grayscale_rate;
return true;
}
static bool SealEngine_IsExistInstanceMotion(int plugin, int instance, struct string *motion_name)
{
@@ -2644,8 +2659,8 @@ HLL_QUIET_UNIMPLEMENTED(false, bool, SealEngine, IsThreadLoadingMode, int Plugin
HLL_TODO_EXPORT(GetInstanceDiffuse, SealEngine_GetInstanceDiffuse), \
HLL_TODO_EXPORT(GetInstanceAmbient, SealEngine_GetInstanceAmbient), \
HLL_EXPORT(GetInstanceAlpha, SealEngine_GetInstanceAlpha), \
HLL_TODO_EXPORT(SetInstanceGrayscaleRate, SealEngine_SetInstanceGrayscaleRate), \
HLL_TODO_EXPORT(GetInstanceGrayscaleRate, SealEngine_GetInstanceGrayscaleRate), \
HLL_EXPORT(SetInstanceGrayscaleRate, SealEngine_SetInstanceGrayscaleRate), \
HLL_EXPORT(GetInstanceGrayscaleRate, SealEngine_GetInstanceGrayscaleRate), \
HLL_EXPORT(IsExistInstanceMotion, SealEngine_IsExistInstanceMotion), \
HLL_TODO_EXPORT(GetInstanceNumofBone, SealEngine_GetInstanceNumofBone), \
HLL_TODO_EXPORT(GetInstanceBoneName, SealEngine_GetInstanceBoneName), \