LightLut/LightEnv: generate/use proper LUTs for the [0,1] domain

This commit is contained in:
fincs 2017-03-30 23:39:39 +02:00
parent 07d380221e
commit 370e938520
3 changed files with 12 additions and 10 deletions

View File

@ -62,7 +62,7 @@ void C3D_LightEnvBind(C3D_LightEnv* env);
void C3D_LightEnvMaterial(C3D_LightEnv* env, const C3D_Material* mtl); void C3D_LightEnvMaterial(C3D_LightEnv* env, const C3D_Material* mtl);
void C3D_LightEnvAmbient(C3D_LightEnv* env, float r, float g, float b); void C3D_LightEnvAmbient(C3D_LightEnv* env, float r, float g, float b);
void C3D_LightEnvLut(C3D_LightEnv* env, int lutId, int input, bool abs, C3D_LightLut* lut); void C3D_LightEnvLut(C3D_LightEnv* env, GPU_LIGHTLUTID lutId, GPU_LIGHTLUTINPUT input, bool negative, C3D_LightLut* lut);
enum enum
{ {

View File

@ -192,7 +192,7 @@ void C3D_LightEnvAmbient(C3D_LightEnv* env, float r, float g, float b)
env->flags |= C3DF_LightEnv_MtlDirty; env->flags |= C3DF_LightEnv_MtlDirty;
} }
void C3D_LightEnvLut(C3D_LightEnv* env, int lutId, int input, bool abs, C3D_LightLut* lut) void C3D_LightEnvLut(C3D_LightEnv* env, GPU_LIGHTLUTID lutId, GPU_LIGHTLUTINPUT input, bool negative, C3D_LightLut* lut)
{ {
static const s8 ids[] = { 0, 1, -1, 2, 3, 4, 5, -1 }; static const s8 ids[] = { 0, 1, -1, 2, 3, 4, 5, -1 };
int id = ids[lutId]; int id = ids[lutId];
@ -215,7 +215,7 @@ void C3D_LightEnvLut(C3D_LightEnv* env, int lutId, int input, bool abs, C3D_Ligh
u32 absbit = 1 << (lutId*4 + 1); u32 absbit = 1 << (lutId*4 + 1);
env->conf.lutInput.abs &= ~absbit; env->conf.lutInput.abs &= ~absbit;
if (!abs) if (negative)
env->conf.lutInput.abs |= absbit; env->conf.lutInput.abs |= absbit;
env->flags |= C3DF_LightEnv_Dirty; env->flags |= C3DF_LightEnv_Dirty;

View File

@ -35,15 +35,17 @@ void LightLut_FromFunc(C3D_LightLut* lut, C3D_LightLutFunc func, float param, bo
int i; int i;
float data[512]; float data[512];
memset(data, 0, sizeof(data)); memset(data, 0, sizeof(data));
int start = negative ? (-128) : 0; int min = negative ? (-128) : 0;
for (i = start; i <= 128; i ++) int max = negative ? 128 : 256;
for (i = min; i <= max; i ++)
{ {
float x = i/128.0f; float x = (float)i/max;
float val = func(x, param); float val = func(x, param);
if (i < 128) int idx = negative ? (i & 0xFF) : i;
data[i & 0xFF] = val; if (i < max)
if (i > start) data[idx] = val;
data[(i & 0xFF) + 255] = val - data[(i-1) & 0xFF]; if (i > min)
data[idx+255] = val-data[idx-1];
} }
LightLut_FromArray(lut, data); LightLut_FromArray(lut, data);
} }