[Mesa-dev] [PATCH 2/2] glsl: Fix gl_NormalScale.
Brian Paul
brianp at vmware.com
Wed Nov 29 22:56:52 UTC 2017
Reviewed-by: Brian Paul <brianp at vmware.com>
On 11/23/2017 01:48 PM, Fabian Bieler wrote:
> GLSL shaders can access the normal scale factor with the built-in
> gl_NormalScale. Mesa's modelspace lighting optimization uses a different
> normal scale factor than defined in the spec. We have to take care not
> to use this factor for gl_NormalScale.
>
> Mesa already defines two seperate states: state.normalScale and
> state.internal.normalScale. The first is used by the glsl compiler while the
> later is used by the fixed function T&L pipeline. Previously the only
> difference was some component swizzling. With this commit state.normalScale
> always uses the normal scale factor for eyespace lighting.
> ---
> src/mesa/main/light.c | 3 +++
> src/mesa/main/mtypes.h | 3 ++-
> src/mesa/program/prog_statevars.c | 2 +-
> 3 files changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/main/light.c b/src/mesa/main/light.c
> index f52ed8e..67faf8a 100644
> --- a/src/mesa/main/light.c
> +++ b/src/mesa/main/light.c
> @@ -1032,6 +1032,7 @@ static void
> update_modelview_scale( struct gl_context *ctx )
> {
> ctx->_ModelViewInvScale = 1.0F;
> + ctx->_ModelViewInvScaleEyespace = 1.0F;
> if (!_math_matrix_is_length_preserving(ctx->ModelviewMatrixStack.Top)) {
> const GLfloat *m = ctx->ModelviewMatrixStack.Top->inv;
> GLfloat f = m[2] * m[2] + m[6] * m[6] + m[10] * m[10];
> @@ -1040,6 +1041,7 @@ update_modelview_scale( struct gl_context *ctx )
> ctx->_ModelViewInvScale = 1.0f / sqrtf(f);
> else
> ctx->_ModelViewInvScale = sqrtf(f);
> + ctx->_ModelViewInvScaleEyespace = 1.0f / sqrtf(f);
> }
> }
>
> @@ -1216,4 +1218,5 @@ _mesa_init_lighting( struct gl_context *ctx )
> ctx->_NeedEyeCoords = GL_FALSE;
> ctx->_ForceEyeCoords = GL_FALSE;
> ctx->_ModelViewInvScale = 1.0;
> + ctx->_ModelViewInvScaleEyespace = 1.0;
> }
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 4682e02..1bd0d2a 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -4953,7 +4953,8 @@ struct gl_context
> /** \name Derived state */
> GLbitfield _ImageTransferState;/**< bitwise-or of IMAGE_*_BIT flags */
> GLfloat _EyeZDir[3];
> - GLfloat _ModelViewInvScale;
> + GLfloat _ModelViewInvScale; /* may be for model- or eyespace lighting */
> + GLfloat _ModelViewInvScaleEyespace; /* always factor defined in spec */
> GLboolean _NeedEyeCoords;
> GLboolean _ForceEyeCoords;
>
> diff --git a/src/mesa/program/prog_statevars.c b/src/mesa/program/prog_statevars.c
> index 91178e3..b69895c 100644
> --- a/src/mesa/program/prog_statevars.c
> +++ b/src/mesa/program/prog_statevars.c
> @@ -422,7 +422,7 @@ _mesa_fetch_state(struct gl_context *ctx, const gl_state_index state[],
> return;
>
> case STATE_NORMAL_SCALE:
> - ASSIGN_4V(value, ctx->_ModelViewInvScale, 0, 0, 1);
> + ASSIGN_4V(value, ctx->_ModelViewInvScaleEyespace, 0, 0, 1);
> return;
>
> case STATE_INTERNAL:
>
More information about the mesa-dev
mailing list