/*---------------------------------------------------------------------------

    NN Library for LINDBERGH Standard Vertex Shader

    Copyright (C) 2004 - 2007 SEGA Corporation Creative Center Graphics Sect.
    All Rights Reserved.

    Module  : NN Standard Shader
    File    : 
    Create  : 2004/11/04
    Modify  : 2007/12/05
    Version : 1.14.04
    Note    : 

---------------------------------------------------------------------------*/
/******************************/
/* パラメータバインド用マクロ */
/******************************/
#ifdef NNGLD_PRECOMPILE_BY_CGC
	#define NNGLD_BINDATTR_TANGENT		: ATTR6
	#define NNGLD_BINDATTR_BINORMAL		: ATTR7
	#define NNGLD_BINDATTR_MTXIDX		: ATTR5
	#define NNGLD_BINDATTR_WEIGHT		: ATTR1

	#define NNGLD_BINDUNIF_NUMPARALLELLIGHT				: register(c0)
	#define NNGLD_BINDUNIF_NUMPOINTLIGHT				: register(c1)
	#define NNGLD_BINDUNIF_NUMSPOTLIGHT					: register(c2)
	#define NNGLD_BINDUNIF_POINTLIGHTFALLOFFEND			: register(c3)		/* 0 - 4 */
	#define NNGLD_BINDUNIF_POINTLIGHTFALLOFFSCALE		: register(c7)		/* 0 - 4 */
	#define NNGLD_BINDUNIF_SPOTLIGHTFALLOFFEND			: register(c11)		/* 0 - 4 */
	#define NNGLD_BINDUNIF_SPOTLIGHTFALLOFFSCALE		: register(c15)		/* 0 - 4 */
	#define NNGLD_BINDUNIF_SPOTLIGHTANGLESCALE			: register(c19)		/* 0 - 4 */
	#define NNGLD_BINDUNIF_TEXUSER1PARAM				: register(c23)
	#define NNGLD_BINDUNIF_TEXUSER2PARAM				: register(c24)
	#define NNGLD_BINDUNIF_TEXUSER3PARAM				: register(c25)
	#define NNGLD_BINDUNIF_TEXUSER4PARAM				: register(c26)
	#define NNGLD_BINDUNIF_TEXUSER5PARAM				: register(c27)
	#define NNGLD_BINDUNIF_TEXUSER6PARAM				: register(c28)
	#define NNGLD_BINDUNIF_TEXUSER7PARAM				: register(c29)
	#define NNGLD_BINDUNIF_TEXUSER8PARAM				: register(c30)
	#define NNGLD_BINDUNIF_POSITIONMATRIX				: register(c31)		/* 0 or 4*16 */
	#define NNGLD_BINDUNIF_NORMALMATRIX					: register(c95)		/* 0 or 3*16 */
	#define NNGLD_BINDUNIF_USERUNIFORM					: register(c143)	/* 0 - 256 */
#else
	#define NNGLD_BINDATTR_TANGENT
	#define NNGLD_BINDATTR_BINORMAL
	#define NNGLD_BINDATTR_MTXIDX
	#define NNGLD_BINDATTR_WEIGHT

	#define NNGLD_BINDUNIF_NUMPARALLELLIGHT
	#define NNGLD_BINDUNIF_NUMPOINTLIGHT
	#define NNGLD_BINDUNIF_NUMSPOTLIGHT
	#define NNGLD_BINDUNIF_POINTLIGHTFALLOFFEND
	#define NNGLD_BINDUNIF_POINTLIGHTFALLOFFSCALE
	#define NNGLD_BINDUNIF_SPOTLIGHTFALLOFFEND
	#define NNGLD_BINDUNIF_SPOTLIGHTFALLOFFSCALE
	#define NNGLD_BINDUNIF_SPOTLIGHTANGLESCALE
	#define NNGLD_BINDUNIF_TEXUSER1PARAM
	#define NNGLD_BINDUNIF_TEXUSER2PARAM
	#define NNGLD_BINDUNIF_TEXUSER3PARAM
	#define NNGLD_BINDUNIF_TEXUSER4PARAM
	#define NNGLD_BINDUNIF_TEXUSER5PARAM
	#define NNGLD_BINDUNIF_TEXUSER6PARAM
	#define NNGLD_BINDUNIF_TEXUSER7PARAM
	#define NNGLD_BINDUNIF_TEXUSER8PARAM
	#define NNGLD_BINDUNIF_POSITIONMATRIX
	#define NNGLD_BINDUNIF_NORMALMATRIX
	#define NNGLD_BINDUNIF_USERUNIFORM
#endif

/********************/
/* プロファイル定数 */
/********************/
/* 定義されていない場合のデフォルト値設定 */

/* 変換後法線正規化 */
#ifndef NNGLD_PROF_NORMALIZE_VTX_NORMAL
	#define NNGLD_PROF_NORMALIZE_VTX_NORMAL		(1)			/* bool */
#endif

/* 変換後法線再スケール */
#ifndef NNGLD_PROF_RESCALE_NORMAL
	#define NNGLD_PROF_RESCALE_NORMAL			(0)			/* bool */
#endif

/* 頂点スペキュラーカラー */
#ifndef NNGLD_PROF_VTX_SPECULAR
	#define NNGLD_PROF_VTX_SPECULAR				(1)			/* bool */
#endif

/* 最大パラレルライト数 */
#ifndef NNGLD_PROF_MAX_PARALLEL_LIGHT
	#define NNGLD_PROF_MAX_PARALLEL_LIGHT		(4)			/* int 0〜4 */
#endif

/* 最大ポイントライト数 */
#ifndef NNGLD_PROF_MAX_POINT_LIGHT
	#define NNGLD_PROF_MAX_POINT_LIGHT			(2)			/* int 0〜4 */
#endif

/* 最大スポットライト数 */
#ifndef NNGLD_PROF_MAX_SPOT_LIGHT
	#define NNGLD_PROF_MAX_SPOT_LIGHT			(1)			/* int 0〜4 */
#endif

/* ライトアンビエントパラメータ有効 */
#ifndef NNGLD_PROF_LIGHT_AMBIENT
	#define NNGLD_PROF_LIGHT_AMBIENT			(0)			/* bool */
#endif

/* ポイントライト距離減衰モデル */
#ifndef NNGLD_PROF_POINTLIGHT_DISTATTEN
	#define NNGLD_PROF_POINTLIGHT_DISTATTEN		(0)
										/* 0: 減衰なし 1: 逆 2: 逆２乗 */
#endif

/* スポットライト距離減衰モデル */
#ifndef NNGLD_PROF_SPOTLIGHT_DISTATTEN
	#define NNGLD_PROF_SPOTLIGHT_DISTATTEN		(0)
										/* 0: 減衰なし 1: 逆 2: 逆２乗 */
#endif

/* 従法線を法線接線から計算 */
#ifndef NNGLD_PROF_CALC_VTX_BINORMAL
	#define NNGLD_PROF_CALC_VTX_BINORMAL		(1)			/* bool */
#endif

/* フォグモデル */
#ifndef NNGLD_PROF_FOG_MODEL	
	#define NNGLD_PROF_FOG_MODEL				(0)
									/* 0:フォグなし 1:LINEAR 2:EXP 3:EXP2 */
#endif

/* 距離フォグ */
#ifndef NNGLD_PROF_DISTANCE_FOG
	#define NNGLD_PROF_DISTANCE_FOG				(1)			/* bool */
#endif

/* フラグメント単位のフォグ計算 */
#ifndef NNGLD_PROF_FRAG_FOG
	#define NNGLD_PROF_FRAG_FOG					(1)			/* bool */
#endif

/* 最大ユーザーユニフォーム数 */
#ifndef NNGLD_PROF_MAX_USER_UNIFORM
	#define NNGLD_PROF_MAX_USER_UNIFORM			(4)			/* int */
#endif

/* 16bit浮動小数使用 */
#ifndef NNGLD_PROF_HALF_FLOAT
	#define NNGLD_PROF_HALF_FLOAT				(1)			/* bool */
#endif

/* 法線エンベロープスケールなし */
#ifndef NNGLD_PROF_NO_SCALE_ENVELOPE
	#define NNGLD_PROF_NO_SCALE_ENVELOPE		(0)			/* bool */
#endif


/**********************************/
/* シェーダ最適化プロファイル定数 */
/**********************************/
/* 定義されていない場合のデフォルト値設定 */

/* ライティングをする */
#ifndef NNGLD_OPT_LIGHTING
	#define NNGLD_OPT_LIGHTING					(1)			/* bool */
#endif

/* フラグメント単位ライティングをする */
#ifndef NNGLD_OPT_FRAG_LIGHTING
	#define NNGLD_OPT_FRAG_LIGHTING				(1)			/* bool */
#endif

/* フラグメント単位ライティングパラレルライト数 */
#ifndef NNGLD_OPT_NUM_FRAG_PARALLEL_LIGHT
	#define NNGLD_OPT_NUM_FRAG_PARALLEL_LIGHT	(1)
#endif

/* フラグメント単位ライティングポイントライト数 */
#ifndef NNGLD_OPT_NUM_FRAG_POINT_LIGHT
	#define NNGLD_OPT_NUM_FRAG_POINT_LIGHT		(0)
#endif

/* フラグメント単位ライティングスポットライト数 */
#ifndef NNGLD_OPT_NUM_FRAG_SPOT_LIGHT
	#define NNGLD_OPT_NUM_FRAG_SPOT_LIGHT		(0)
#endif

/* スペキュラ有効 */
#ifndef NNGLD_OPT_SPECULAR
	#define NNGLD_OPT_SPECULAR					(1)			/* bool */
#endif

/* 二面ライティングを行なう */
#ifndef NNGLD_OPT_TWOSIDED_LIGHTING
	#define NNGLD_OPT_TWOSIDED_LIGHTING			(0)			/* bool */
#endif

/* 接線、従法線を計算する */
#ifndef NNGLD_OPT_TANGENT_SPACE
	#define NNGLD_OPT_TANGENT_SPACE				(0)			/* bool */
#endif

/* 法線マップインデックス */
#ifndef NNGLD_OPT_TEX_NORMAL
	#define NNGLD_OPT_TEX_NORMAL				(-1)
#endif

/* 法線マップテクスチャ座標種別 */
#ifndef NNGLD_OPT_TEXCOORD_NORMAL
	#define NNGLD_OPT_TEXCOORD_NORMAL			(-1)
#endif

/* ベースディフューズマップインデックス */
#ifndef NNGLD_OPT_TEX_BASE
	#define NNGLD_OPT_TEX_BASE					(-1)
#endif

/* ベースディフューズテクスチャ座標種別 */
#ifndef NNGLD_OPT_TEXCOORD_BASE
	#define NNGLD_OPT_TEXCOORD_BASE				(-1)
#endif

/* デカールマップインデックス */
#ifndef NNGLD_OPT_TEX_DECAL
	#define NNGLD_OPT_TEX_DECAL					(-1)
#endif

/* デカールマップテクスチャ座標種別 */
#ifndef NNGLD_OPT_TEXCOORD_DECAL
	#define NNGLD_OPT_TEXCOORD_DECAL			(-1)
#endif

/* デカールマップ２インデックス */
#ifndef NNGLD_OPT_TEX_DECAL2
	#define NNGLD_OPT_TEX_DECAL2				(-1)
#endif

/* デカールマップ２テクスチャ座標種別 */
#ifndef NNGLD_OPT_TEXCOORD_DECAL2
	#define NNGLD_OPT_TEXCOORD_DECAL2			(-1)
#endif

/* デカールマップ３インデックス */
#ifndef NNGLD_OPT_TEX_DECAL3
	#define NNGLD_OPT_TEX_DECAL3				(-1)
#endif

/* デカールマップ３テクスチャ座標種別 */
#ifndef NNGLD_OPT_TEXCOORD_DECAL3
	#define NNGLD_OPT_TEXCOORD_DECAL3			(-1)
#endif

/* スペキュラマップインデクス */
#ifndef NNGLD_OPT_TEX_SPECULAR
	#define NNGLD_OPT_TEX_SPECULAR				(-1)
#endif

/* スペキュラマップテクスチャ座標種別 */
#ifndef NNGLD_OPT_TEXCOORD_SPECULAR
	#define NNGLD_OPT_TEXCOORD_SPECULAR			(-1)
#endif

/* スペキュラ光沢度マップインデクス */
#ifndef NNGLD_OPT_TEX_SHININESS
	#define NNGLD_OPT_TEX_SHININESS				(-1)
#endif

/* スペキュラ光沢度マップテクスチャ座標種別 */
#ifndef NNGLD_OPT_TEXCOORD_SHININESS
	#define NNGLD_OPT_TEXCOORD_SHININESS		(-1)
#endif

/* 双方物面環境マップインデクス */
#ifndef NNGLD_OPT_TEX_DUALPARABOLOID
	#define NNGLD_OPT_TEX_DUALPARABOLOID		(-1)
#endif

/* 環境マスクマップインデクス */
#ifndef NNGLD_OPT_TEX_ENVMASK
	#define NNGLD_OPT_TEX_ENVMASK				(-1)
#endif

/* 環境マスクマップテクスチャ座標種別 */
#ifndef NNGLD_OPT_TEXCOORD_ENVMASK
	#define NNGLD_OPT_TEXCOORD_ENVMASK			(-1)
#endif

/* 乗算テクスチャインデックス */
#ifndef NNGLD_OPT_TEX_MODULATE
	#define NNGLD_OPT_TEX_MODULATE				(-1)
#endif

/* 乗算テクスチャ座標種別 */
#ifndef NNGLD_OPT_TEXCOORD_MODULATE
	#define NNGLD_OPT_TEXCOORD_MODULATE			(-1)
#endif

/* 加算テクスチャインデックス */
#ifndef NNGLD_OPT_TEX_ADD
	#define NNGLD_OPT_TEX_ADD					(-1)
#endif

/* 加算テクスチャ座標種別 */
#ifndef NNGLD_OPT_TEXCOORD_ADD
	#define NNGLD_OPT_TEXCOORD_ADD				(-1)
#endif

/* 不透明度テクスチャインデックス */
#ifndef NNGLD_OPT_TEX_OPACITY
	#define NNGLD_OPT_TEX_OPACITY				(-1)
#endif

/* 不透明度テクスチャ座標インデックス */
#ifndef NNGLD_OPT_TEXCOORD_OPACITY
	#define NNGLD_OPT_TEXCOORD_OPACITY			(-1)
#endif

/* シャドウマップインデックス */
#ifndef NNGLD_OPT_TEX_SHADOW
	#define NNGLD_OPT_TEX_SHADOW				(-1)
#endif

/* シャドウマップ２インデックス */
#ifndef NNGLD_OPT_TEX_SHADOW2
	#define NNGLD_OPT_TEX_SHADOW2				(-1)
#endif

/* ユーザーマップ１インデックス */
#ifndef NNGLD_OPT_TEX_USER1
	#define NNGLD_OPT_TEX_USER1					(-1)
#endif

/* ユーザーマップ１テクスチャ座標インデックス */
#ifndef NNGLD_OPT_TEXCOORD_USER1
	#define NNGLD_OPT_TEXCOORD_USER1			(-1)
#endif

/* ユーザーマップ２インデックス */
#ifndef NNGLD_OPT_TEX_USER2
	#define NNGLD_OPT_TEX_USER2					(-1)
#endif

/* ユーザーマップ２テクスチャ座標インデックス */
#ifndef NNGLD_OPT_TEXCOORD_USER2
	#define NNGLD_OPT_TEXCOORD_USER2			(-1)
#endif

/* ユーザーマップ３インデックス */
#ifndef NNGLD_OPT_TEX_USER3
	#define NNGLD_OPT_TEX_USER3					(-1)
#endif

/* ユーザーマップ３テクスチャ座標インデックス */
#ifndef NNGLD_OPT_TEXCOORD_USER3
	#define NNGLD_OPT_TEXCOORD_USER3			(-1)
#endif

/* ユーザーマップ４インデックス */
#ifndef NNGLD_OPT_TEX_USER4
	#define NNGLD_OPT_TEX_USER4					(-1)
#endif

/* ユーザーマップ４テクスチャ座標インデックス */
#ifndef NNGLD_OPT_TEXCOORD_USER4
	#define NNGLD_OPT_TEXCOORD_USER4			(-1)
#endif

/* ユーザーマップ５インデックス */
#ifndef NNGLD_OPT_TEX_USER5
	#define NNGLD_OPT_TEX_USER5					(-1)
#endif

/* ユーザーマップ５テクスチャ座標インデックス */
#ifndef NNGLD_OPT_TEXCOORD_USER5
	#define NNGLD_OPT_TEXCOORD_USER5			(-1)
#endif

/* ユーザーマップ６インデックス */
#ifndef NNGLD_OPT_TEX_USER6
	#define NNGLD_OPT_TEX_USER6					(-1)
#endif

/* ユーザーマップ６テクスチャ座標インデックス */
#ifndef NNGLD_OPT_TEXCOORD_USER6
	#define NNGLD_OPT_TEXCOORD_USER6			(-1)
#endif

/* ユーザーマップ７インデックス */
#ifndef NNGLD_OPT_TEX_USER7
	#define NNGLD_OPT_TEX_USER7					(-1)
#endif

/* ユーザーマップ７テクスチャ座標インデックス */
#ifndef NNGLD_OPT_TEXCOORD_USER7
	#define NNGLD_OPT_TEXCOORD_USER7			(-1)
#endif

/* ユーザーマップ８インデックス */
#ifndef NNGLD_OPT_TEX_USER8
	#define NNGLD_OPT_TEX_USER8					(-1)
#endif

/* ユーザーマップ８テクスチャ座標インデックス */
#ifndef NNGLD_OPT_TEXCOORD_USER8
	#define NNGLD_OPT_TEXCOORD_USER8			(-1)
#endif

/* ユーザーサンプラー２Ｄマップ１インデックス */
#ifndef NNGLD_OPT_TEX_SAMPLER2D1
	#define NNGLD_OPT_TEX_SAMPLER2D1			(-1)
#endif

/* ユーザーサンプラー２Ｄマップ２インデックス */
#ifndef NNGLD_OPT_TEX_SAMPLER2D2
	#define NNGLD_OPT_TEX_SAMPLER2D2			(-1)
#endif

/* ユーザーサンプラー３Ｄマップ１インデックス */
#ifndef NNGLD_OPT_TEX_SAMPLER3D1
	#define NNGLD_OPT_TEX_SAMPLER3D1			(-1)
#endif

/* ユーザーサンプラー３Ｄマップ２インデックス */
#ifndef NNGLD_OPT_TEX_SAMPLER3D2
	#define NNGLD_OPT_TEX_SAMPLER3D2			(-1)
#endif

/* ユーザーサンプラーキューブマップ１インデックス */
#ifndef NNGLD_OPT_TEX_SAMPLERCUBE1
	#define NNGLD_OPT_TEX_SAMPLERCUBE1			(-1)
#endif

/* ユーザーサンプラーキューブマップ２インデックス */
#ifndef NNGLD_OPT_TEX_SAMPLERCUBE2
	#define NNGLD_OPT_TEX_SAMPLERCUBE2			(-1)
#endif

/* 頂点シェーダによるエンベロープ計算 */
#ifndef NNGLD_OPT_VERTEX_BLEND
	#define NNGLD_OPT_VERTEX_BLEND				(0)			/* 0 .. 4 */
#endif


/****************************/
/* ユーザープロファイル定数 */
/****************************/
#ifndef NNGLD_USER_PROFILE
	#define NNGLD_USER_PROFILE					(0)			/* 0 .. 15 */
#endif


/*****************************************/
/* 16bit浮動小数を使用しない場合用マクロ */
/*****************************************/
#if !( NNGLD_PROF_HALF_FLOAT )
	#define half	float
	#define half2	vec2
	#define half3	vec3
	#define half4	vec4
#endif


/* 双方物面マップ */
#if ( NNGLD_OPT_TEX_DUALPARABOLOID != -1 || ( ( NNGLD_OPT_TEXCOORD_ADD == -3 ) || ( NNGLD_OPT_TEXCOORD_BASE == -3 ) || ( NNGLD_OPT_TEXCOORD_DECAL == -3 ) || ( NNGLD_OPT_TEXCOORD_DECAL2 == -3 ) || ( NNGLD_OPT_TEXCOORD_DECAL3 == -3 ) || ( NNGLD_OPT_TEXCOORD_SPECULAR == -3 ) || ( NNGLD_OPT_TEXCOORD_SHININESS == -3 ) || ( NNGLD_OPT_TEXCOORD_MODULATE == -3 ) || ( NNGLD_OPT_TEXCOORD_ADD == -3 ) || ( NNGLD_OPT_TEXCOORD_OPACITY == -3 ) || ( NNGLD_OPT_TEXCOORD_USER1 == -3 ) || ( NNGLD_OPT_TEXCOORD_USER2 == -3 ) || ( NNGLD_OPT_TEXCOORD_USER3 == -3 ) || ( NNGLD_OPT_TEXCOORD_USER4 == -3 ) || ( NNGLD_OPT_TEXCOORD_USER5 == -3 ) || ( NNGLD_OPT_TEXCOORD_USER6 == -3 ) || ( NNGLD_OPT_TEXCOORD_USER7 == -3 ) || ( NNGLD_OPT_TEXCOORD_USER8 == -3 ) ) )
#define NNGLD_FRAG_DUALPARAMAP (1)
#else
#define NNGLD_FRAG_DUALPARAMAP (0)
#endif


/********************/
/* ユニフォーム変数 */
/********************/
/* スペキュラ有効 */
//uniform bool nngluSpecular;	/* 廃止 */

/* 頂点パラレルライト数 */
uniform int nngluNumParallelLight NNGLD_BINDUNIF_NUMPARALLELLIGHT;

/* 頂点ポイントライト数 */
uniform int nngluNumPointLight NNGLD_BINDUNIF_NUMPOINTLIGHT;

/* 頂点スポットライト数 */
uniform int nngluNumSpotLight NNGLD_BINDUNIF_NUMSPOTLIGHT;

#if NNGLD_PROF_MAX_POINT_LIGHT
/* ポイントライト減衰終了距離 */
uniform float nngluPointLightFallOffEnd[ NNGLD_PROF_MAX_POINT_LIGHT ] NNGLD_BINDUNIF_POINTLIGHTFALLOFFEND;

/* ポイントライト減衰スケール */
uniform float nngluPointLightFallOffScale[ NNGLD_PROF_MAX_POINT_LIGHT ] NNGLD_BINDUNIF_POINTLIGHTFALLOFFSCALE;
#endif

#if NNGLD_PROF_MAX_SPOT_LIGHT
/* スポットライト距離減衰終了距離 */
uniform float nngluSpotLightFallOffEnd[ NNGLD_PROF_MAX_SPOT_LIGHT ] NNGLD_BINDUNIF_SPOTLIGHTFALLOFFEND;

/* スポットライト距離減衰スケール */
uniform float nngluSpotLightFallOffScale[ NNGLD_PROF_MAX_SPOT_LIGHT ] NNGLD_BINDUNIF_SPOTLIGHTFALLOFFSCALE;

/* スポットライト角度減衰スケール */
uniform float nngluSpotLightAngleScale[ NNGLD_PROF_MAX_SPOT_LIGHT ] NNGLD_BINDUNIF_SPOTLIGHTANGLESCALE;
#endif

/* ユーザーマップ１パラメータ */
uniform float nngluTexUser1Param NNGLD_BINDUNIF_TEXUSER1PARAM;

/* ユーザーマップ２パラメータ */
uniform float nngluTexUser2Param NNGLD_BINDUNIF_TEXUSER2PARAM;

/* ユーザーマップ３パラメータ */
uniform float nngluTexUser3Param NNGLD_BINDUNIF_TEXUSER3PARAM;

/* ユーザーマップ４パラメータ */
uniform float nngluTexUser4Param NNGLD_BINDUNIF_TEXUSER4PARAM;

/* ユーザーマップ５パラメータ */
uniform float nngluTexUser5Param NNGLD_BINDUNIF_TEXUSER5PARAM;

/* ユーザーマップ６パラメータ */
uniform float nngluTexUser6Param NNGLD_BINDUNIF_TEXUSER6PARAM;

/* ユーザーマップ７パラメータ */
uniform float nngluTexUser7Param NNGLD_BINDUNIF_TEXUSER7PARAM;

/* ユーザーマップ８パラメータ */
uniform float nngluTexUser8Param NNGLD_BINDUNIF_TEXUSER8PARAM;

#if ( NNGLD_OPT_VERTEX_BLEND > 0 )
#define NNGLD_MAX_MATRIX_INDEX			(16)		/* 4 * ( 3 + 4 ) uniform */
/* エンベロープ頂点座標用マトリクス */
uniform mat4 nngluPositionMatrix[ NNGLD_MAX_MATRIX_INDEX ] NNGLD_BINDUNIF_POSITIONMATRIX;
/* エンベロープ頂点法線用マトリクス */
uniform mat3 nngluNormalMatrix[ NNGLD_MAX_MATRIX_INDEX ] NNGLD_BINDUNIF_NORMALMATRIX;
#endif

/* ユーザーユニフォーム変数 */
#if ( NNGLD_PROF_MAX_USER_UNIFORM > 0 )
uniform vec4 nngluUserUniform[ NNGLD_PROF_MAX_USER_UNIFORM ] NNGLD_BINDUNIF_USERUNIFORM;
#endif


/*******************************/
/* Varying変数バインド用マクロ */
/*******************************/
#ifdef NNGLD_PRECOMPILE_BY_CGC
	#include "nnstdbindvarying.h"
#else
	#define NNGLD_BINDVARYING_VIEWPOSITIONFOG
	#define NNGLD_BINDVARYING_NORMAL
	#define NNGLD_BINDVARYING_TANGENT
	#define NNGLD_BINDVARYING_BINORMAL
	#define NNGLD_BINDVARYING_TEXCOORD01
	#define NNGLD_BINDVARYING_TEXCOORD23
	#define NNGLD_BINDVARYING_TEXCOORD45
	#define NNGLD_BINDVARYING_TEXCOORD67
	#define NNGLD_BINDVARYING_TEXCOORDSHADOW
	#define NNGLD_BINDVARYING_TEXCOORDSHADOW2
	#define NNGLD_BINDVARYING_USER0
	#define NNGLD_BINDVARYING_USER1
	#define NNGLD_BINDVARYING_USER2
	#define NNGLD_BINDVARYING_USER3
	#define NNGLD_BINDVARYING_USER4
	#define NNGLD_BINDVARYING_USER5
	#define NNGLD_BINDVARYING_USER6
	#define NNGLD_BINDVARYING_USER7
#endif

/**************************/
/* 頂点シェーダ出力変数名 */
/**************************/
/* ビュー座標系での頂点座標とフォグ */
#if ( NNGLD_OPT_FRAG_LIGHTING || NNGLD_PROF_FOG_MODEL || NNGLD_FRAG_DUALPARAMAP )
varying vec4 nnglvViewPositionFog NNGLD_BINDVARYING_VIEWPOSITIONFOG;
#define nnglvViewPosition	nnglvViewPositionFog.xyz
#define nnglvFog			nnglvViewPositionFog.w
#else
vec3 nnglvViewPosition;
float nnglvFog;
#endif

/* フラグメント単位ライティング用法線 */
#if ( NNGLD_OPT_FRAG_LIGHTING || NNGLD_FRAG_DUALPARAMAP )
varying vec3 nnglvNormal NNGLD_BINDVARYING_NORMAL;

/* 接空間基底 */
#if NNGLD_OPT_TANGENT_SPACE
varying vec3 nnglvTangent NNGLD_BINDVARYING_TANGENT;
varying vec3 nnglvBinormal NNGLD_BINDVARYING_BINORMAL;
#endif
#endif

/* テクスチャ座標 */
/* varying変数節約のため、２種類ずつをペアにする */
varying half4 nnglvTexCoord01 NNGLD_BINDVARYING_TEXCOORD01;
varying half4 nnglvTexCoord23 NNGLD_BINDVARYING_TEXCOORD23;
varying half4 nnglvTexCoord45 NNGLD_BINDVARYING_TEXCOORD45;
varying half4 nnglvTexCoord67 NNGLD_BINDVARYING_TEXCOORD67;
#define nnglvTexCoord0	nnglvTexCoord01.xy
#define nnglvTexCoord1	nnglvTexCoord01.zw
#define nnglvTexCoord2	nnglvTexCoord23.xy
#define nnglvTexCoord3	nnglvTexCoord23.zw
#define nnglvTexCoord4	nnglvTexCoord45.xy
#define nnglvTexCoord5	nnglvTexCoord45.zw
#define nnglvTexCoord6	nnglvTexCoord67.xy
#define nnglvTexCoord7	nnglvTexCoord67.zw
#if ( NNGLD_OPT_TEX_SHADOW != -1 )
/* シャドウマップ用 */
varying vec4 nnglvTexCoordShadow NNGLD_BINDVARYING_TEXCOORDSHADOW;
#endif
#if ( NNGLD_OPT_TEX_SHADOW2 != -1 )
/* シャドウマップ２用 */
varying vec4 nnglvTexCoordShadow2 NNGLD_BINDVARYING_TEXCOORDSHADOW2;
#endif

/* テクスチャインデックスから変数名への読み替え */
#if ( NNGLD_OPT_TEX_NORMAL == 0 )
	#define nnglvTexCoordNormal	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_NORMAL == 1 )
	#define nnglvTexCoordNormal	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_NORMAL == 2 )
	#define nnglvTexCoordNormal	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_NORMAL == 3 )
	#define nnglvTexCoordNormal	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_NORMAL == 4 )
	#define nnglvTexCoordNormal	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_NORMAL == 5 )
	#define nnglvTexCoordNormal	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_NORMAL == 6 )
	#define nnglvTexCoordNormal	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_NORMAL == 7 )
	#define nnglvTexCoordNormal	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_BASE == 0 )
	#define nnglvTexCoordBase	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_BASE == 1 )
	#define nnglvTexCoordBase	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_BASE == 2 )
	#define nnglvTexCoordBase	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_BASE == 3 )
	#define nnglvTexCoordBase	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_BASE == 4 )
	#define nnglvTexCoordBase	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_BASE == 5 )
	#define nnglvTexCoordBase	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_BASE == 6 )
	#define nnglvTexCoordBase	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_BASE == 7 )
	#define nnglvTexCoordBase	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_DECAL == 0 )
	#define nnglvTexCoordDecal	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_DECAL == 1 )
	#define nnglvTexCoordDecal	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_DECAL == 2 )
	#define nnglvTexCoordDecal	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_DECAL == 3 )
	#define nnglvTexCoordDecal	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_DECAL == 4 )
	#define nnglvTexCoordDecal	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_DECAL == 5 )
	#define nnglvTexCoordDecal	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_DECAL == 6 )
	#define nnglvTexCoordDecal	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_DECAL == 7 )
	#define nnglvTexCoordDecal	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_DECAL2 == 0 )
	#define nnglvTexCoordDecal2	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_DECAL2 == 1 )
	#define nnglvTexCoordDecal2	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_DECAL2 == 2 )
	#define nnglvTexCoordDecal2	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_DECAL2 == 3 )
	#define nnglvTexCoordDecal2	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_DECAL2 == 4 )
	#define nnglvTexCoordDecal2	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_DECAL2 == 5 )
	#define nnglvTexCoordDecal2	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_DECAL2 == 6 )
	#define nnglvTexCoordDecal2	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_DECAL2 == 7 )
	#define nnglvTexCoordDecal2	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_DECAL3 == 0 )
	#define nnglvTexCoordDecal3	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_DECAL3 == 1 )
	#define nnglvTexCoordDecal3	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_DECAL3 == 2 )
	#define nnglvTexCoordDecal3	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_DECAL3 == 3 )
	#define nnglvTexCoordDecal3	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_DECAL3 == 4 )
	#define nnglvTexCoordDecal3	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_DECAL3 == 5 )
	#define nnglvTexCoordDecal3	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_DECAL3 == 6 )
	#define nnglvTexCoordDecal3	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_DECAL3 == 7 )
	#define nnglvTexCoordDecal3	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_SPECULAR == 0 )
	#define nnglvTexCoordSpecular	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_SPECULAR == 1 )
	#define nnglvTexCoordSpecular	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_SPECULAR == 2 )
	#define nnglvTexCoordSpecular	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_SPECULAR == 3 )
	#define nnglvTexCoordSpecular	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_SPECULAR == 4 )
	#define nnglvTexCoordSpecular	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_SPECULAR == 5 )
	#define nnglvTexCoordSpecular	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_SPECULAR == 6 )
	#define nnglvTexCoordSpecular	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_SPECULAR == 7 )
	#define nnglvTexCoordSpecular	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_SHININESS == 0 )
	#define nnglvTexCoordShininess	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_SHININESS == 1 )
	#define nnglvTexCoordShininess	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_SHININESS == 2 )
	#define nnglvTexCoordShininess	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_SHININESS == 3 )
	#define nnglvTexCoordShininess	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_SHININESS == 4 )
	#define nnglvTexCoordShininess	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_SHININESS == 5 )
	#define nnglvTexCoordShininess	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_SHININESS == 6 )
	#define nnglvTexCoordShininess	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_SHININESS == 7 )
	#define nnglvTexCoordShininess	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_ENVMASK == 0 )
	#define nnglvTexCoordEnvMask	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_ENVMASK == 1 )
	#define nnglvTexCoordEnvMask	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_ENVMASK == 2 )
	#define nnglvTexCoordEnvMask	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_ENVMASK == 3 )
	#define nnglvTexCoordEnvMask	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_ENVMASK == 4 )
	#define nnglvTexCoordEnvMask	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_ENVMASK == 5 )
	#define nnglvTexCoordEnvMask	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_ENVMASK == 6 )
	#define nnglvTexCoordEnvMask	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_ENVMASK == 7 )
	#define nnglvTexCoordEnvMask	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_MODULATE == 0 )
	#define nnglvTexCoordModulate	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_MODULATE == 1 )
	#define nnglvTexCoordModulate	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_MODULATE == 2 )
	#define nnglvTexCoordModulate	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_MODULATE == 3 )
	#define nnglvTexCoordModulate	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_MODULATE == 4 )
	#define nnglvTexCoordModulate	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_MODULATE == 5 )
	#define nnglvTexCoordModulate	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_MODULATE == 6 )
	#define nnglvTexCoordModulate	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_MODULATE == 7 )
	#define nnglvTexCoordModulate	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_ADD == 0 )
	#define nnglvTexCoordAdd	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_ADD == 1 )
	#define nnglvTexCoordAdd	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_ADD == 2 )
	#define nnglvTexCoordAdd	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_ADD == 3 )
	#define nnglvTexCoordAdd	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_ADD == 4 )
	#define nnglvTexCoordAdd	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_ADD == 5 )
	#define nnglvTexCoordAdd	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_ADD == 6 )
	#define nnglvTexCoordAdd	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_ADD == 7 )
	#define nnglvTexCoordAdd	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_OPACITY == 0 )
	#define nnglvTexCoordOpacity	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_OPACITY == 1 )
	#define nnglvTexCoordOpacity	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_OPACITY == 2 )
	#define nnglvTexCoordOpacity	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_OPACITY == 3 )
	#define nnglvTexCoordOpacity	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_OPACITY == 4 )
	#define nnglvTexCoordOpacity	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_OPACITY == 5 )
	#define nnglvTexCoordOpacity	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_OPACITY == 6 )
	#define nnglvTexCoordOpacity	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_OPACITY == 7 )
	#define nnglvTexCoordOpacity	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_USER1 == 0 )
	#define nnglvTexCoordUser1	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_USER1 == 1 )
	#define nnglvTexCoordUser1	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_USER1 == 2 )
	#define nnglvTexCoordUser1	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_USER1 == 3 )
	#define nnglvTexCoordUser1	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_USER1 == 4 )
	#define nnglvTexCoordUser1	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_USER1 == 5 )
	#define nnglvTexCoordUser1	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_USER1 == 6 )
	#define nnglvTexCoordUser1	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_USER1 == 7 )
	#define nnglvTexCoordUser1	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_USER2 == 0 )
	#define nnglvTexCoordUser2	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_USER2 == 1 )
	#define nnglvTexCoordUser2	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_USER2 == 2 )
	#define nnglvTexCoordUser2	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_USER2 == 3 )
	#define nnglvTexCoordUser2	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_USER2 == 4 )
	#define nnglvTexCoordUser2	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_USER2 == 5 )
	#define nnglvTexCoordUser2	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_USER2 == 6 )
	#define nnglvTexCoordUser2	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_USER2 == 7 )
	#define nnglvTexCoordUser2	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_USER3 == 0 )
	#define nnglvTexCoordUser3	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_USER3 == 1 )
	#define nnglvTexCoordUser3	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_USER3 == 2 )
	#define nnglvTexCoordUser3	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_USER3 == 3 )
	#define nnglvTexCoordUser3	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_USER3 == 4 )
	#define nnglvTexCoordUser3	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_USER3 == 5 )
	#define nnglvTexCoordUser3	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_USER3 == 6 )
	#define nnglvTexCoordUser3	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_USER3 == 7 )
	#define nnglvTexCoordUser3	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_USER4 == 0 )
	#define nnglvTexCoordUser4	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_USER4 == 1 )
	#define nnglvTexCoordUser4	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_USER4 == 2 )
	#define nnglvTexCoordUser4	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_USER4 == 3 )
	#define nnglvTexCoordUser4	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_USER4 == 4 )
	#define nnglvTexCoordUser4	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_USER4 == 5 )
	#define nnglvTexCoordUser4	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_USER4 == 6 )
	#define nnglvTexCoordUser4	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_USER4 == 7 )
	#define nnglvTexCoordUser4	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_USER5 == 0 )
	#define nnglvTexCoordUser5	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_USER5 == 1 )
	#define nnglvTexCoordUser5	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_USER5 == 2 )
	#define nnglvTexCoordUser5	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_USER5 == 3 )
	#define nnglvTexCoordUser5	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_USER5 == 4 )
	#define nnglvTexCoordUser5	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_USER5 == 5 )
	#define nnglvTexCoordUser5	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_USER5 == 6 )
	#define nnglvTexCoordUser5	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_USER5 == 7 )
	#define nnglvTexCoordUser5	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_USER6 == 0 )
	#define nnglvTexCoordUser6	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_USER6 == 1 )
	#define nnglvTexCoordUser6	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_USER6 == 2 )
	#define nnglvTexCoordUser6	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_USER6 == 3 )
	#define nnglvTexCoordUser6	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_USER6 == 4 )
	#define nnglvTexCoordUser6	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_USER6 == 5 )
	#define nnglvTexCoordUser6	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_USER6 == 6 )
	#define nnglvTexCoordUser6	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_USER6 == 7 )
	#define nnglvTexCoordUser6	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_USER7 == 0 )
	#define nnglvTexCoordUser7	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_USER7 == 1 )
	#define nnglvTexCoordUser7	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_USER7 == 2 )
	#define nnglvTexCoordUser7	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_USER7 == 3 )
	#define nnglvTexCoordUser7	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_USER7 == 4 )
	#define nnglvTexCoordUser7	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_USER7 == 5 )
	#define nnglvTexCoordUser7	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_USER7 == 6 )
	#define nnglvTexCoordUser7	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_USER7 == 7 )
	#define nnglvTexCoordUser7	nnglvTexCoord7
#endif

#if ( NNGLD_OPT_TEX_USER8 == 0 )
	#define nnglvTexCoordUser8	nnglvTexCoord0
#elif ( NNGLD_OPT_TEX_USER8 == 1 )
	#define nnglvTexCoordUser8	nnglvTexCoord1
#elif ( NNGLD_OPT_TEX_USER8 == 2 )
	#define nnglvTexCoordUser8	nnglvTexCoord2
#elif ( NNGLD_OPT_TEX_USER8 == 3 )
	#define nnglvTexCoordUser8	nnglvTexCoord3
#elif ( NNGLD_OPT_TEX_USER8 == 4 )
	#define nnglvTexCoordUser8	nnglvTexCoord4
#elif ( NNGLD_OPT_TEX_USER8 == 5 )
	#define nnglvTexCoordUser8	nnglvTexCoord5
#elif ( NNGLD_OPT_TEX_USER8 == 6 )
	#define nnglvTexCoordUser8	nnglvTexCoord6
#elif ( NNGLD_OPT_TEX_USER8 == 7 )
	#define nnglvTexCoordUser8	nnglvTexCoord7
#endif


/****************/
/* 追加頂点属性 */
/****************/
/* 法線マップ用 */
#if NNGLD_OPT_TANGENT_SPACE
	/* 頂点接線 */
	attribute vec3 nnglaTangent NNGLD_BINDATTR_TANGENT;
#if !( NNGLD_PROF_CALC_VTX_BINORMAL )
	/* 頂点従法線 */
	attribute vec3 nnglaBinormal NNGLD_BINDATTR_BINORMAL;
#endif
#endif
/* エンベロープ用 */
#if	NNGLD_OPT_VERTEX_BLEND
/* ivecはGLSLで使用できない 071203 */
attribute vec4 nnglaMtxIdx NNGLD_BINDATTR_MTXIDX;
	#if ( NNGLD_OPT_VERTEX_BLEND > 1 )
		attribute vec4  nnglaWeight NNGLD_BINDATTR_WEIGHT;
	#endif
#endif


/******************************************/
/* 頂点シェーダ内で使用するグローバル変数 */
/******************************************/
/* 変換前頂点座標 */
vec4	nnglgVertexPosition;
/* 変換済み法線 */
half3	nnglgNormal;

#if NNGLD_OPT_TANGENT_SPACE
/* 変換済み接線 */
half3	nnglgTangent;
/* 変換済み従法線 */
half3	nnglgBinormal;
#endif

/* カメラから頂点への視線方向 */
half3	nnglgEyeDir;

/* 計算中ディフューズ寄与度 */
half3	nnglgDiffuse = half3( 0.0, 0.0, 0.0 );
/* 計算中スペキュラ寄与度 */
half3	nnglgSpecular = half3( 0.0, 0.0, 0.0 );

#if NNGLD_OPT_TWOSIDED_LIGHTING
/* 計算中裏面ディフューズ寄与度 */
half3	nnglgBackDiffuse = half3( 0.0, 0.0, 0.0 );
/* 計算中裏面スペキュラ寄与度 */
half3	nnglgBackSpecular = half3( 0.0, 0.0, 0.0 );
#endif

#if NNGLD_PROF_LIGHT_AMBIENT
/* 計算中アンビエント寄与度 */
half3	nnglgAmbient = half3( 0.0, 0.0, 0.0 );
#endif


/* １ウェイト分のエンベロープ計算 */
#if ( NNGLD_OPT_VERTEX_BLEND > 0 )
void nnglCalcVertexWeight( int mtxidx, float weight )
{
	#if !( NNGLD_PROF_NO_SCALE_ENVELOPE )
		nnglvViewPosition +=
		( nngluPositionMatrix[ mtxidx ] * nnglgVertexPosition ).xyz * weight;
		#if NNGLD_OPT_TANGENT_SPACE
#if 0
			mat3 normalmtx = nngluNormalMatrix[ mtxidx ] * weight;
			nnglgNormal += normalmtx * gl_Normal;
			nnglgTangent += normalmtx * nnglaTangent;
			#if !( NNGLD_PROF_CALC_VTX_BINORMAL )
			nnglgBinormal += normalmtx * nnglaBinormal;
			#endif
#else	// Cgコンパイラでは下の方が最適化の結果が良い
			nnglgNormal += nngluNormalMatrix[ mtxidx ] * gl_Normal * weight;
			nnglgTangent += nngluNormalMatrix[ mtxidx ] * nnglaTangent * weight;
			#if !( NNGLD_PROF_CALC_VTX_BINORMAL )
			nnglgBinormal += nngluNormalMatrix[ mtxidx ] * nnglaBinormal * weight;
			#endif
#endif
		#else
			nnglgNormal += nngluNormalMatrix[ mtxidx ] * gl_Normal * weight;
		#endif
	#else
		#if NNGLD_OPT_TANGENT_SPACE
#if 0
			mat4 positionmtx = nngluPositionMatrix[ mtxidx ] * weight;
			nnglvViewPosition += ( positionmtx * nnglgVertexPosition ).xyz;
			mat3 normalmtx = mat3( positionmtx );
			nnglgNormal += normalmtx * gl_Normal;
			nnglgTangent += normalmtx * nnglaTangent;
			#if !( NNGLD_PROF_CALC_VTX_BINORMAL )
			nnglgBinormal += normalmtx * nnglaBinormal;
			#endif
#else	// Cgコンパイラでは下の方が最適化の結果が良い
			nnglvViewPosition += ( nngluPositionMatrix[ mtxidx ] * nnglgVertexPosition ).xyz * weight;
			mat3 normalmtx = mat3( nngluPositionMatrix[ mtxidx ] );
			nnglgNormal += normalmtx * gl_Normal * weight;
			nnglgTangent += normalmtx * nnglaTangent * weight;
			#if !( NNGLD_PROF_CALC_VTX_BINORMAL )
			nnglgBinormal += normalmtx * nnglaBinormal * weight;
			#endif
#endif
		#else
			nnglvViewPosition += weight * 
				( nngluPositionMatrix[ mtxidx ] * nnglgVertexPosition ).xyz;
			nnglgNormal += weight * 
				mat3 ( nngluPositionMatrix[ mtxidx ] ) * gl_Normal;
		#endif
	#endif
}
#endif

/********************/
/* 頂点位置法線変換 */
/********************/
void nnglTransformVertexPositionNormal( void )
{
	/* 変換前頂点座標 */
	nnglgVertexPosition = vec4( gl_Vertex.xyz / gl_Vertex.w, 1.0 );

#if ( NNGLD_OPT_VERTEX_BLEND == 0 )
	/* エンベロープでない場合 */

	/* 頂点位置変換 */
	gl_Position = ftransform();

	/* ビュー座標での頂点位置 */
	nnglvViewPosition = ( gl_ModelViewMatrix * nnglgVertexPosition ).xyz;

	/* 法線変換 */
	nnglgNormal = gl_NormalMatrix * gl_Normal;

	/* 法線マップ用属性変換 */
	#if NNGLD_OPT_TANGENT_SPACE
		/* 接線変換 */
		nnglgTangent = gl_NormalMatrix * nnglaTangent;
		#if NNGLD_PROF_CALC_VTX_BINORMAL
			/* 従法線計算 */
			nnglgBinormal = cross( nnglgNormal, nnglgTangent );
		#else
			/* 従法線変換 */
			nnglgBinormal = gl_NormalMatrix * nnglaBinormal;
		#endif
	#endif

#else
	/* エンベロープの場合 */

	nnglvViewPosition = vec3( 0.0, 0.0, 0.0 );
	nnglgNormal = half3( 0.0, 0.0, 0.0 );
	#if NNGLD_OPT_TANGENT_SPACE
		nnglgTangent = half3( 0.0, 0.0, 0.0 );
		nnglgBinormal = half3( 0.0, 0.0, 0.0 );
	#endif

	#if ( NNGLD_OPT_VERTEX_BLEND == 1 )
	/* １ボーン０ウェイト */
	nnglCalcVertexWeight( nnglaMtxIdx.x, 1.0 );
	#elif ( NNGLD_OPT_VERTEX_BLEND == 2 )
	/* ２ボーン１ウェイト */
	nnglCalcVertexWeight( nnglaMtxIdx.x, nnglaWeight.x );
	nnglCalcVertexWeight( nnglaMtxIdx.y, 1.0 - nnglaWeight.x );
	#elif ( NNGLD_OPT_VERTEX_BLEND == 3 )
	nnglCalcVertexWeight( nnglaMtxIdx.x, nnglaWeight.x );
	nnglCalcVertexWeight( nnglaMtxIdx.y, nnglaWeight.y );
	nnglCalcVertexWeight( nnglaMtxIdx.z, 1.0 - nnglaWeight.x - nnglaWeight.y );
	#elif ( NNGLD_OPT_VERTEX_BLEND == 4 )
	nnglCalcVertexWeight( nnglaMtxIdx.x, nnglaWeight.x );
	nnglCalcVertexWeight( nnglaMtxIdx.y, nnglaWeight.y );
	nnglCalcVertexWeight( nnglaMtxIdx.z, nnglaWeight.z );
	nnglCalcVertexWeight( nnglaMtxIdx.w,
						1.0 - nnglaWeight.x - nnglaWeight.y - nnglaWeight.z );
	#endif

	#if NNGLD_OPT_TANGENT_SPACE
		#if NNGLD_PROF_CALC_VTX_BINORMAL
			/* 従法線計算 */
			nnglgBinormal = cross( nnglgNormal, nnglgTangent );
		#endif
	#endif

	/* 頂点プロジェクション変換 */
	gl_Position = gl_ProjectionMatrix * vec4( nnglvViewPosition, 1.0 );

#endif

	/* カメラから頂点への視線方向 */
	nnglgEyeDir = normalize( half3( nnglvViewPosition ) );

	/* 正規化 */
	#if NNGLD_PROF_NORMALIZE_VTX_NORMAL
		nnglgNormal = normalize( nnglgNormal );
		#if NNGLD_OPT_TANGENT_SPACE
			nnglgTangent = normalize( nnglgTangent );
			nnglgBinormal = normalize( nnglgBinormal );
		#endif
	#endif
	/* 再スケール */
	#if NNGLD_PROF_RESCALE_NORMAL
		nnglgNormal *= gl_NormalScale;
		#if NNGLD_OPT_TANGENT_SPACE
			nnglgTangent *= gl_NormalScale;
			nnglgBinormal *= gl_NormalScale;
		#endif
	#endif
}


/* スフィアマップ */
half4 nnglCalcSphereMapTexCoord( void )
{
	half3 r;
	half2 r2;
	r = reflect( nnglgEyeDir, nnglgNormal );
	r.z += 1.0;
	r2 = ( normalize( r ).xy ) * half2( 0.5, -0.5 ) + half2( 0.5, 0.5 );
	return half4( r2.xy, 0.0, 1.0 );
}


/**********************/
/* テクスチャ座標計算 */
/**********************/
void nnglCalcTextureCoordinate( void )
{
	/* 法線マップ */
	#if ( NNGLD_OPT_TEX_NORMAL != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_NORMAL && NNGLD_OPT_TEXCOORD_NORMAL <= 3 )
			nnglvTexCoordNormal = ( gl_TextureMatrix[ NNGLD_OPT_TEX_NORMAL ] *
			#if ( NNGLD_OPT_TEXCOORD_NORMAL == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_NORMAL == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_NORMAL == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_NORMAL == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_NORMAL == -1 )
			nnglvTexCoordNormal = ( gl_TextureMatrix[ NNGLD_OPT_TEX_NORMAL ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_NORMAL == -2 )
			nnglvTexCoordNormal = ( gl_TextureMatrix[ NNGLD_OPT_TEX_NORMAL ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* ベースディフューズマップ */
	#if ( NNGLD_OPT_TEX_BASE != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_BASE && NNGLD_OPT_TEXCOORD_BASE <= 3 )
			nnglvTexCoordBase = ( gl_TextureMatrix[ NNGLD_OPT_TEX_BASE ] *
			#if ( NNGLD_OPT_TEXCOORD_BASE == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_BASE == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_BASE == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_BASE == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_BASE == -1 )
			nnglvTexCoordBase = ( gl_TextureMatrix[ NNGLD_OPT_TEX_BASE ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_BASE == -2 )
			nnglvTexCoordBase = ( gl_TextureMatrix[ NNGLD_OPT_TEX_BASE ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* デカールマップ */
	#if ( NNGLD_OPT_TEX_DECAL != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_DECAL && NNGLD_OPT_TEXCOORD_DECAL <= 3 )
			nnglvTexCoordDecal = ( gl_TextureMatrix[ NNGLD_OPT_TEX_DECAL ] *
			#if ( NNGLD_OPT_TEXCOORD_DECAL == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_DECAL == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_DECAL == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_DECAL == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_DECAL == -1 )
			nnglvTexCoordDecal = ( gl_TextureMatrix[ NNGLD_OPT_TEX_DECAL ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_DECAL == -2 )
			nnglvTexCoordDecal = ( gl_TextureMatrix[ NNGLD_OPT_TEX_DECAL ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* デカールマップ２ */
	#if ( NNGLD_OPT_TEX_DECAL2 != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_DECAL2 && NNGLD_OPT_TEXCOORD_DECAL2 <= 3 )
			nnglvTexCoordDecal2 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_DECAL2 ] *
			#if ( NNGLD_OPT_TEXCOORD_DECAL2 == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_DECAL2 == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_DECAL2 == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_DECAL2 == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_DECAL2 == -1 )
			nnglvTexCoordDecal2 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_DECAL2 ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_DECAL2 == -2 )
			nnglvTexCoordDecal2 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_DECAL2 ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* デカールマップ３ */
	#if ( NNGLD_OPT_TEX_DECAL3 != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_DECAL3 && NNGLD_OPT_TEXCOORD_DECAL3 <= 3 )
			nnglvTexCoordDecal3 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_DECAL3 ] *
			#if ( NNGLD_OPT_TEXCOORD_DECAL3 == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_DECAL3 == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_DECAL3 == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_DECAL3 == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_DECAL3 == -1 )
			nnglvTexCoordDecal3 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_DECAL3 ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_DECAL3 == -2 )
			nnglvTexCoordDecal3 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_DECAL3 ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* スペキュラマップ */
	#if ( NNGLD_OPT_TEX_SPECULAR != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_SPECULAR && NNGLD_OPT_TEXCOORD_SPECULAR <= 3 )
			nnglvTexCoordSpecular = ( gl_TextureMatrix[ NNGLD_OPT_TEX_SPECULAR ] *
			#if ( NNGLD_OPT_TEXCOORD_SPECULAR == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_SPECULAR == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_SPECULAR == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_SPECULAR == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_SPECULAR == -1 )
			nnglvTexCoordSpecular = ( gl_TextureMatrix[ NNGLD_OPT_TEX_SPECULAR ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_SPECULAR == -2 )
			nnglvTexCoordSpecular = ( gl_TextureMatrix[ NNGLD_OPT_TEX_SPECULAR ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* スペキュラ光沢度マップ */
	#if ( NNGLD_OPT_TEX_SHININESS != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_SHININESS && NNGLD_OPT_TEXCOORD_SHININESS <= 3 )
			nnglvTexCoordShininess = ( gl_TextureMatrix[ NNGLD_OPT_TEX_SHININESS ] *
			#if ( NNGLD_OPT_TEXCOORD_SHININESS == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_SHININESS == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_SHININESS == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_SHININESS == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_SHININESS == -1 )
			nnglvTexCoordShininess = ( gl_TextureMatrix[ NNGLD_OPT_TEX_SHININESS ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_SHININESS == -2 )
			nnglvTexCoordShininess = ( gl_TextureMatrix[ NNGLD_OPT_TEX_SHININESS ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* 双方物面環境マップ */
	/* テクスチャ座標生成はしない */

	/* 環境マスクマップ */
	#if ( NNGLD_OPT_TEX_ENVMASK != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_ENVMASK && NNGLD_OPT_TEXCOORD_ENVMASK <= 3 )
			nnglvTexCoordEnvMask = ( gl_TextureMatrix[ NNGLD_OPT_TEX_ENVMASK ] *
			#if ( NNGLD_OPT_TEXCOORD_ENVMASK == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_ENVMASK == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_ENVMASK == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_ENVMASK == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_ENVMASK == -1 )
			nnglvTexCoordEnvMask = ( gl_TextureMatrix[ NNGLD_OPT_TEX_ENVMASK ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_ENVMASK == -2 )
			nnglvTexCoordEnvMask = ( gl_TextureMatrix[ NNGLD_OPT_TEX_ENVMASK ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* 乗算マップ */
	#if ( NNGLD_OPT_TEX_MODULATE != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_MODULATE && NNGLD_OPT_TEXCOORD_MODULATE <= 3 )
			nnglvTexCoordModulate = ( gl_TextureMatrix[ NNGLD_OPT_TEX_MODULATE ] *
			#if ( NNGLD_OPT_TEXCOORD_MODULATE == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_MODULATE == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_MODULATE == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_MODULATE == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_MODULATE == -1 )
			nnglvTexCoordModulate = ( gl_TextureMatrix[ NNGLD_OPT_TEX_MODULATE ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_MODULATE == -2 )
			nnglvTexCoordModulate = ( gl_TextureMatrix[ NNGLD_OPT_TEX_MODULATE ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* 加算マップ */
	#if ( NNGLD_OPT_TEX_ADD != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_ADD && NNGLD_OPT_TEXCOORD_ADD <= 3 )
			nnglvTexCoordAdd = ( gl_TextureMatrix[ NNGLD_OPT_TEX_ADD ] *
			#if ( NNGLD_OPT_TEXCOORD_ADD == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_ADD == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_ADD == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_ADD == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_ADD == -1 )
			nnglvTexCoordAdd = ( gl_TextureMatrix[ NNGLD_OPT_TEX_ADD ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_ADD == -2 )
			nnglvTexCoordAdd = ( gl_TextureMatrix[ NNGLD_OPT_TEX_ADD ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* 不透明度マップ */
	#if ( NNGLD_OPT_TEX_OPACITY != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_OPACITY && NNGLD_OPT_TEXCOORD_OPACITY <= 3 )
			nnglvTexCoordOpacity = ( gl_TextureMatrix[ NNGLD_OPT_TEX_OPACITY ] *
			#if ( NNGLD_OPT_TEXCOORD_OPACITY == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_OPACITY == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_OPACITY == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_OPACITY == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_OPACITY == -1 )
			nnglvTexCoordOpacity = ( gl_TextureMatrix[ NNGLD_OPT_TEX_OPACITY ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_OPACITY == -2 )
			nnglvTexCoordOpacity = ( gl_TextureMatrix[ NNGLD_OPT_TEX_OPACITY ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* ユーザーマップ１ */
	#if ( NNGLD_OPT_TEX_USER1 != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_USER1 && NNGLD_OPT_TEXCOORD_USER1 <= 3 )
			nnglvTexCoordUser1 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER1 ] *
			#if ( NNGLD_OPT_TEXCOORD_USER1 == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER1 == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER1 == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER1 == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER1 == -1 )
			nnglvTexCoordUser1 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER1 ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER1 == -2 )
			nnglvTexCoordUser1 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER1 ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* ユーザーマップ２ */
	#if ( NNGLD_OPT_TEX_USER2 != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_USER2 && NNGLD_OPT_TEXCOORD_USER2 <= 3 )
			nnglvTexCoordUser2 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER2 ] *
			#if ( NNGLD_OPT_TEXCOORD_USER2 == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER2 == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER2 == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER2 == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER2 == -1 )
			nnglvTexCoordUser2 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER2 ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER2 == -2 )
			nnglvTexCoordUser2 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER2 ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* ユーザーマップ３ */
	#if ( NNGLD_OPT_TEX_USER3 != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_USER3 && NNGLD_OPT_TEXCOORD_USER3 <= 3 )
			nnglvTexCoordUser3 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER3 ] *
			#if ( NNGLD_OPT_TEXCOORD_USER3 == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER3 == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER3 == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER3 == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER3 == -1 )
			nnglvTexCoordUser3 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER3 ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER3 == -2 )
			nnglvTexCoordUser3 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER3 ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* ユーザーマップ４ */
	#if ( NNGLD_OPT_TEX_USER4 != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_USER4 && NNGLD_OPT_TEXCOORD_USER4 <= 3 )
			nnglvTexCoordUser4 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER4 ] *
			#if ( NNGLD_OPT_TEXCOORD_USER4 == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER4 == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER4 == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER4 == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER4 == -1 )
			nnglvTexCoordUser4 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER4 ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER4 == -2 )
			nnglvTexCoordUser4 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER4 ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* ユーザーマップ５ */
	#if ( NNGLD_OPT_TEX_USER5 != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_USER5 && NNGLD_OPT_TEXCOORD_USER5 <= 3 )
			nnglvTexCoordUser5 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER5 ] *
			#if ( NNGLD_OPT_TEXCOORD_USER5 == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER5 == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER5 == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER5 == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER5 == -1 )
			nnglvTexCoordUser5 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER5 ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER5 == -2 )
			nnglvTexCoordUser5 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER5 ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* ユーザーマップ６ */
	#if ( NNGLD_OPT_TEX_USER6 != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_USER6 && NNGLD_OPT_TEXCOORD_USER6 <= 3 )
			nnglvTexCoordUser6 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER6 ] *
			#if ( NNGLD_OPT_TEXCOORD_USER6 == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER6 == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER6 == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER6 == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER6 == -1 )
			nnglvTexCoordUser6 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER6 ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER6 == -2 )
			nnglvTexCoordUser6 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER6 ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* ユーザーマップ７ */
	#if ( NNGLD_OPT_TEX_USER7 != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_USER7 && NNGLD_OPT_TEXCOORD_USER7 <= 3 )
			nnglvTexCoordUser7 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER7 ] *
			#if ( NNGLD_OPT_TEXCOORD_USER7 == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER7 == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER7 == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER7 == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER7 == -1 )
			nnglvTexCoordUser7 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER7 ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER7 == -2 )
			nnglvTexCoordUser7 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER7 ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* ユーザーマップ８ */
	#if ( NNGLD_OPT_TEX_USER8 != -1 )
		/* UVマップの場合 */
		#if ( 0 <= NNGLD_OPT_TEXCOORD_USER8 && NNGLD_OPT_TEXCOORD_USER8 <= 3 )
			nnglvTexCoordUser8 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER8 ] *
			#if ( NNGLD_OPT_TEXCOORD_USER8 == 0 )
					gl_MultiTexCoord0 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER8 == 1 )
					gl_MultiTexCoord1 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER8 == 2 )
					gl_MultiTexCoord2 ).xy;
			#elif ( NNGLD_OPT_TEXCOORD_USER8 == 3 )
					gl_MultiTexCoord3 ).xy;
			#endif
		/* スフィアマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER8 == -1 )
			nnglvTexCoordUser8 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER8 ] *
										nnglCalcSphereMapTexCoord() ).xy;
		/* プロジェクションマップの場合 */
		#elif ( NNGLD_OPT_TEXCOORD_USER8 == -2 )
			nnglvTexCoordUser8 = ( gl_TextureMatrix[ NNGLD_OPT_TEX_USER8 ] *
											vec4( nnglvViewPosition, 1.0 ) ).xy;
		#endif
	#endif

	/* シャドウマップ */
	#if ( NNGLD_OPT_TEX_SHADOW != -1 )
		nnglvTexCoordShadow
			= gl_TextureMatrix[ NNGLD_OPT_TEX_SHADOW ] * 
											vec4( nnglvViewPosition, 1.0 );
	#endif

	/* シャドウマップ２ */
	#if ( NNGLD_OPT_TEX_SHADOW2 != -1 )
		nnglvTexCoordShadow2
			= gl_TextureMatrix[ NNGLD_OPT_TEX_SHADOW2 ] * 
											vec4( nnglvViewPosition, 1.0 );
	#endif
}

#if NNGLD_PROF_MAX_PARALLEL_LIGHT > 0 || NNGLD_PROF_MAX_POINT_LIGHT > 0 || NNGLD_PROF_MAX_SPOT_LIGHT > 0
void nnglCalcLightOne( in int litno )
{
	half diffcnt, speccnt;
	#if NNGLD_OPT_TWOSIDED_LIGHTING
	half backdiffcnt, backspeccnt;
	#endif
	half3 litdir;
	float attn;
	#if NNGLD_PROF_MAX_POINT_LIGHT > 0 || NNGLD_PROF_MAX_SPOT_LIGHT > 0
	vec3 litpos;
	int unino;
	float dist;
	#endif
	#if NNGLD_PROF_MAX_SPOT_LIGHT > 0
	half spotdot;
	#endif

	#if NNGLD_PROF_MAX_PARALLEL_LIGHT > 0 && ( NNGLD_PROF_MAX_POINT_LIGHT > 0 || NNGLD_PROF_MAX_SPOT_LIGHT > 0 )
	if ( litno < nngluNumParallelLight )
	#endif
	#if NNGLD_PROF_MAX_PARALLEL_LIGHT > 0
	{
		/* パラレルライト */

		/* ライト方向 */
		/* （normalizeは、CPU側で行なう） */
		litdir = gl_LightSource[ litno ].position.xyz;

		/* 減衰なし */
		attn = 1.0;
	}
	#endif
	#if NNGLD_PROF_MAX_PARALLEL_LIGHT > 0 && ( NNGLD_PROF_MAX_POINT_LIGHT > 0 || NNGLD_PROF_MAX_SPOT_LIGHT > 0 )
	else
	#endif
	#if NNGLD_PROF_MAX_POINT_LIGHT > 0 || NNGLD_PROF_MAX_SPOT_LIGHT > 0
	{
		/* ライト位置 */
		litpos = gl_LightSource[ litno ].position.xyz - nnglvViewPosition;

		/* ライト方向 */
		litdir = half3( normalize( litpos ) );
		
		/* 減衰度 */
		dist = length( litpos );
		#if ( NNGLD_PROF_POINTLIGHT_DISTATTEN == 0 )
		/* 減衰なし */
		attn = 1.0;
		#endif
		#if ( NNGLD_PROF_POINTLIGHT_DISTATTEN == 1 )
		/* 逆 */
		attn = 1.0 / dist;
		#endif
		#if ( NNGLD_PROF_POINTLIGHT_DISTATTEN == 2 )
		/* 逆２乗 */
		attn = 1.0 / ( dist * dist );
		#endif

		#if NNGLD_PROF_MAX_POINT_LIGHT > 0 && NNGLD_PROF_MAX_SPOT_LIGHT > 0
		if ( litno < nngluNumParallelLight + nngluNumPointLight )
		#endif
		#if NNGLD_PROF_MAX_POINT_LIGHT > 0
		{
			/* ポイントライト */
			/* フォールオフ */
			unino = litno - nngluNumParallelLight;
			attn *= clamp(
					( nngluPointLightFallOffEnd[ unino ] - dist )
						* nngluPointLightFallOffScale[ unino ], 0.0, 1.0 );

		}
		#endif
		#if NNGLD_PROF_MAX_POINT_LIGHT > 0 && NNGLD_PROF_MAX_SPOT_LIGHT > 0
		else
		#endif
		#if NNGLD_PROF_MAX_SPOT_LIGHT > 0
		{
			/* スポットライト */
			/* 距離減衰 */
			unino = litno - nngluNumParallelLight - nngluNumPointLight;
			attn *= clamp(
					( nngluSpotLightFallOffEnd[ unino ] - dist )
					* nngluSpotLightFallOffScale[ unino ], 0.0, 1.0 );

			/* 角度減衰 */
			spotdot = dot( -litdir, gl_LightSource[ litno ].spotDirection );
			attn *= clamp( ( gl_LightSource[ litno ].spotCosCutoff - spotdot ) * 
										nngluSpotLightAngleScale[ unino ], 0.0, 1.0 );

		}
		#endif
	}
	#endif

	/* ディフューズ成分 */
	diffcnt = dot( nnglgNormal, litdir );
	#if NNGLD_OPT_TWOSIDED_LIGHTING
	//backdiffcnt = -min( 0.0, diffcnt );            // 次の行の記述のほうが速い
	backdiffcnt = clamp( -float(diffcnt), 0.0, 1.0 );	// saturate命令(clamp(*,0,1))は他の命令と同時に実行されることが期待できる
	#endif
	//diffcnt = max( 0.0, diffcnt );            // 次の行の記述のほうが速い
	diffcnt = clamp( float(diffcnt), 0.0, 1.0 );	// saturate命令(clamp(*,0,1))は他の命令と同時に実行されることが期待できる
	nnglgDiffuse += gl_LightSource[litno].diffuse.rgb * diffcnt * attn;
	#if NNGLD_OPT_TWOSIDED_LIGHTING
	nnglgBackDiffuse += gl_LightSource[litno].diffuse.rgb * backdiffcnt * attn;
	#endif

	#if NNGLD_PROF_LIGHT_AMBIENT
	/* ライトのアンビエント */
	nnglgAmbient += gl_LightSource[litno].ambient.rgb * attn;
	#endif

	/* スペキュラ成分 */
	#if NNGLD_OPT_SPECULAR
		speccnt = dot( normalize( reflect( litdir, nnglgNormal ) )
														, nnglgEyeDir );
		#if NNGLD_OPT_TWOSIDED_LIGHTING
		//backspeccnt = -min( 0.0, speccnt );            // 次の行の記述のほうが速い
		backdiffcnt = clamp( -float(speccnt), 0.0, 1.0 );	// saturate命令(clamp(*,0,1))は他の命令と同時に実行されることが期待できる
		#endif
		//speccnt = max( 0.0, speccnt ); //次の行の記述のほうが速い
		speccnt = clamp( float(speccnt), 0.0, 1.0 );

		if ( diffcnt != 0.0 ){ /* 表面のみ */
			nnglgSpecular += 
				half3( pow( speccnt, gl_FrontMaterial.shininess ) )
						* gl_LightSource[litno].specular.rgb * attn;
		}
		#if NNGLD_OPT_TWOSIDED_LIGHTING
		if ( backdiffcnt != 0.0 ){
			nnglgBackSpecular += 
				half3( pow( backspeccnt, gl_FrontMaterial.shininess ) )
						* gl_LightSource[litno].specular.rgb * attn;
		}
		#endif
	#endif
}
#endif

/**********************/
/* 頂点単位ライト計算 */
/**********************/
#if NNGLD_PROF_MAX_PARALLEL_LIGHT > 0 || NNGLD_PROF_MAX_POINT_LIGHT > 0 || NNGLD_PROF_MAX_SPOT_LIGHT > 0
	#if( 8 > (NNGLD_PROF_MAX_PARALLEL_LIGHT + NNGLD_PROF_MAX_POINT_LIGHT + NNGLD_PROF_MAX_SPOT_LIGHT))
		#define NNGLD_MAX_LIGHT_NUM (NNGLD_PROF_MAX_PARALLEL_LIGHT + NNGLD_PROF_MAX_POINT_LIGHT + NNGLD_PROF_MAX_SPOT_LIGHT)
	#else
		#define NNGLD_MAX_LIGHT_NUM (8)	//ライトの最大数を８に制限
	#endif
#endif

void nnglCalcLight( void )
{
	#if NNGLD_PROF_MAX_PARALLEL_LIGHT > 0 || NNGLD_PROF_MAX_POINT_LIGHT > 0 || NNGLD_PROF_MAX_SPOT_LIGHT > 0
	for ( int litno = 0; litno < NNGLD_MAX_LIGHT_NUM; litno++ ){
		if ( litno <
			#if NNGLD_PROF_MAX_PARALLEL_LIGHT > 0
				+ nngluNumParallelLight
			#endif
			#if NNGLD_PROF_MAX_POINT_LIGHT > 0
				+ nngluNumPointLight
			#endif
			#if NNGLD_PROF_MAX_SPOT_LIGHT > 0
				+ nngluNumSpotLight
			#endif
		) {
			nnglCalcLightOne( litno );
		}
	}
	#endif
}


/**********************/
/* 頂点シェーダメイン */
/**********************/
void main( void )
{
	/******************/
	/* 位置、法線変換 */
	/******************/
	nnglTransformVertexPositionNormal();

	/**********************/
	/* テクスチャ座標生成 */
	/**********************/
	nnglCalcTextureCoordinate();

	/********************************/
	/* 頂点ライティング／マテリアル */
	/********************************/
	/* ライティング計算 */
	#if !( NNGLD_OPT_FRAG_LIGHTING )
		/**********************************/
		/* 頂点単位ライティング計算の場合 */
		/**********************************/
		#if NNGLD_OPT_LIGHTING
			/* 各ライト計算 */
			nnglCalcLight();

			/* マテリアルのディフューズカラーと乗算 */
			nnglgDiffuse *= gl_FrontMaterial.diffuse.rgb;

			/* アンビエントとエミッシブを加算 */
			nnglgDiffuse += gl_FrontLightModelProduct.sceneColor.rgb;

			/* 二面ライティングの場合 */
			#if NNGLD_OPT_TWOSIDED_LIGHTING
				nnglgBackDiffuse *= gl_FrontMaterial.diffuse.rgb;
				nnglgBackDiffuse += gl_FrontLightModelProduct.sceneColor.rgb;
			#endif

			/* ライトのアンビエントを加算 */
			#if NNGLD_PROF_LIGHT_AMBIENT
			nnglgDiffuse += nnglgAmbient;
				#if NNGLD_OPT_TWOSIDED_LIGHTING
					nnglgBackDiffuse += nnglgAmbient;
				#endif
			#endif

		#else
			/* ライティングしない */
			nnglgDiffuse = gl_FrontMaterial.diffuse.rgb;
			#if NNGLD_OPT_TWOSIDED_LIGHTING
				nnglgBackDiffuse = gl_FrontMaterial.diffuse.rgb;
			#endif
		#endif
	#else
		/**************************************/
		/* フラグメント単位ライティングの場合 */
		/**************************************/
		nnglgDiffuse = gl_FrontMaterial.diffuse.rgb;
		//nnglgSpecular = gl_FrontMaterial.specular.rgb;
		nnglgSpecular = half3( 1.0, 1.0, 1.0 );
	#endif

	/* 頂点カラー */
	nnglgDiffuse *= gl_Color.rgb;
	#if NNGLD_OPT_TWOSIDED_LIGHTING
		nnglgBackDiffuse *= gl_Color.rgb;
	#endif
	#if NNGLD_PROF_VTX_SPECULAR
		nnglgSpecular *= gl_SecondaryColor.rgb;
		#if NNGLD_OPT_TWOSIDED_LIGHTING
			nnglgBackSpecular *= gl_SecondaryColor.rgb;
		#endif
	#endif

	/**********/
	/* フォグ */
	/**********/
	#if NNGLD_PROF_FOG_MODEL
		#if NNGLD_PROF_DISTANCE_FOG
		/* 距離フォグ */
			float fogdist = length( nnglvViewPosition );
		#else
			/* Ｚフォグ */
			float fogdist = abs( nnglvViewPosition.z );
		#endif
		#if ( !( NNGLD_PROF_FRAG_FOG ) )
			/* 頂点フォグの場合 */
			#if ( NNGLD_PROF_FOG_MODEL == 1 )
				fogdist = ( gl_Fog.end - fogdist ) * gl_Fog.scale;
			#elif ( NNGLD_PROF_FOG_MODEL == 2 )
				fogdist = exp2( -gl_Fog.density * fogdist * 1.442695 );
			#elif ( NNGLD_PROF_FOG_MODEL == 3 )
				fogdist = exp2( -gl_Fog.density * gl_Fog.density
								* fogdist * fogdist * 1.442695 );
			#endif
			nnglvFog = clamp( fogdist, 0.0, 1.0 );
		#else
			nnglvFog = fogdist;
		#endif
	#endif

	/********************/
	/* 出力カラーを設定 */
	/********************/
	/* ディフューズカラー */
	gl_FrontColor.rgb = nnglgDiffuse;
	gl_FrontColor.a = gl_FrontMaterial.diffuse.a * gl_Color.a;
	#if NNGLD_OPT_TWOSIDED_LIGHTING
		gl_BackColor.rgb = nnglgBackDiffuse;
		gl_BackColor.a = gl_FrontColor.a;
	#endif

	/* スペキュラカラー */
	gl_FrontSecondaryColor.rgb = nnglgSpecular;
	#if NNGLD_OPT_TWOSIDED_LIGHTING
		gl_BackSecondaryColor.rgb = nnglgBackSpecular;
	#endif

	/* フラグメント単位ライティング用出力 */
	#if ( NNGLD_OPT_FRAG_LIGHTING || NNGLD_FRAG_DUALPARAMAP )
	nnglvNormal = nnglgNormal;
		#if ( NNGLD_OPT_TANGENT_SPACE )
		nnglvTangent = nnglgTangent;
		nnglvBinormal = nnglgBinormal;
		#endif
	#endif
}
