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

    NN Library for LINDBERGH Standard Fragment Shader

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

    Module  : NN Standard Shader
    File    : 
    Create  : 2004/11/04
    Modify  : 2006/05/30
    Version : 1.13.04
    Note    : 

---------------------------------------------------------------------------*/
/******************************/
/* パラメータバインド用マクロ */
/******************************/
#ifdef NNGLD_PRECOMPILE_BY_CGC
	#define NNGLD_BINDUNIF_POINTLIGHTFALLOFFEND		: register(c0)		/* 0 - 4 */
	#define NNGLD_BINDUNIF_POINTLIGHTFALLOFFSCALE	: register(c4)		/* 0 - 4 */
	#define NNGLD_BINDUNIF_TEXBASEALPHA				: register(c8)
	#define NNGLD_BINDUNIF_TEXDECALALPHA			: register(c9)
	#define NNGLD_BINDUNIF_TEXDECAL2ALPHA			: register(c10)
	#define NNGLD_BINDUNIF_TEXDECAL3ALPHA			: register(c11)
	#define NNGLD_BINDUNIF_TEXSHININESSLEVEL		: register(c12)
	#define NNGLD_BINDUNIF_TEXDUALPARABOLOIDLEVEL	: register(c13)
	#define NNGLD_BINDUNIF_TEXADDLEVEL				: register(c14)
	#define NNGLD_BINDUNIF_TEXSHADOWCOLOR			: register(c15)
	#define NNGLD_BINDUNIF_TEXSHADOW2COLOR			: register(c16)
	#define NNGLD_BINDUNIF_TEXUSER1PARAM			: register(c17)
	#define NNGLD_BINDUNIF_TEXUSER2PARAM			: register(c18)
	#define NNGLD_BINDUNIF_TEXUSER3PARAM			: register(c19)
	#define NNGLD_BINDUNIF_TEXUSER4PARAM			: register(c20)
	#define NNGLD_BINDUNIF_TEXUSER5PARAM			: register(c21)
	#define NNGLD_BINDUNIF_TEXUSER6PARAM			: register(c22)
	#define NNGLD_BINDUNIF_TEXUSER7PARAM			: register(c23)
	#define NNGLD_BINDUNIF_TEXUSER8PARAM			: register(c24)
	#define NNGLD_BINDUNIF_DUALPARABOLOIDMATRIX		: register(c25)		/* 0 or 3 */
	#define NNGLD_BINDUNIF_USERUNIFORM				: register(c28)		/* 0 - 256 */
#else
	#define NNGLD_BINDUNIF_POINTLIGHTFALLOFFEND
	#define NNGLD_BINDUNIF_POINTLIGHTFALLOFFSCALE
	#define NNGLD_BINDUNIF_TEXBASEALPHA
	#define NNGLD_BINDUNIF_TEXDECALALPHA
	#define NNGLD_BINDUNIF_TEXDECAL2ALPHA
	#define NNGLD_BINDUNIF_TEXDECAL3ALPHA
	#define NNGLD_BINDUNIF_TEXSHININESSLEVEL
	#define NNGLD_BINDUNIF_TEXDUALPARABOLOIDLEVEL
	#define NNGLD_BINDUNIF_TEXADDLEVEL
	#define NNGLD_BINDUNIF_TEXSHADOWCOLOR
	#define NNGLD_BINDUNIF_TEXSHADOW2COLOR
	#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_DUALPARABOLOIDMATRIX
	#define NNGLD_BINDUNIF_USERUNIFORM
#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_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_TANGENT_SPACE
	#define NNGLD_OPT_TANGENT_SPACE				(0)				/* bool */
#endif

/* 圧縮タンジェントスペース法線マップを使用する */
#ifndef NNGLD_OPT_NORMALMAP_AXLY
	#define NNGLD_OPT_NORMALMAP_AXLY			(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_SHADOW
	#define NNGLD_OPT_TEX_SHADOW				(-1)
#endif

/* シャドウマップ２インデックス */
#ifndef NNGLD_OPT_TEX_SHADOW2
	#define NNGLD_OPT_TEX_SHADOW2				(-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_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_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_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

/* ベースディフューズマップ不透明度 */
uniform float nngluTexBaseAlpha NNGLD_BINDUNIF_TEXBASEALPHA;

/* デカールマップ不透明度 */
uniform float nngluTexDecalAlpha NNGLD_BINDUNIF_TEXDECALALPHA;

/* デカールマップ２不透明度 */
uniform float nngluTexDecal2Alpha NNGLD_BINDUNIF_TEXDECAL2ALPHA;

/* デカールマップ３不透明度 */
uniform float nngluTexDecal3Alpha NNGLD_BINDUNIF_TEXDECAL3ALPHA;

/* スペキュラ光沢度レベル */
uniform float nngluTexShininessLevel NNGLD_BINDUNIF_TEXSHININESSLEVEL;

/* 双方物面環境マップ強度 */
uniform float nngluTexDualParaboloidLevel NNGLD_BINDUNIF_TEXDUALPARABOLOIDLEVEL;

/* 加算マップ強度 */
uniform float nngluTexAddLevel NNGLD_BINDUNIF_TEXADDLEVEL;

/* シャドウカラー */
uniform vec3 nngluTexShadowColor NNGLD_BINDUNIF_TEXSHADOWCOLOR;

/* シャドウ２カラー */
uniform vec3 nngluTexShadow2Color NNGLD_BINDUNIF_TEXSHADOW2COLOR;

/* ユーザーマップ１パラメータ */
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;

/* 双方物面マップ用マトリクス */
uniform mat3 nngluDualParaboloidMatrix NNGLD_BINDUNIF_DUALPARABOLOIDMATRIX;

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


/**************************************/
/* フラグメントシェーダグローバル変数 */
/**************************************/
/* 計算中フラグメントカラー */
half3 nnglgFragColor;

/* 計算中フラグメントアルファ */
half nnglgFragAlpha;

/* バンプスフィアマップ */
#if ( NNGLD_OPT_FRAG_LIGHTING && ( ( NNGLD_OPT_TEXCOORD_ADD == -1 ) || ( NNGLD_OPT_TEXCOORD_BASE == -1 ) || ( NNGLD_OPT_TEXCOORD_DECAL == -1 ) || ( NNGLD_OPT_TEXCOORD_DECAL2 == -1 ) || ( NNGLD_OPT_TEXCOORD_DECAL3 == -1 ) || ( NNGLD_OPT_TEXCOORD_SPECULAR == -1 ) || ( NNGLD_OPT_TEXCOORD_SHININESS == -1 ) || ( NNGLD_OPT_TEXCOORD_MODULATE == -1 ) || ( NNGLD_OPT_TEXCOORD_ADD == -1 ) || ( NNGLD_OPT_TEXCOORD_OPACITY == -1 ) || ( NNGLD_OPT_TEXCOORD_USER1 == -1 ) || ( NNGLD_OPT_TEXCOORD_USER2 == -1 ) || ( NNGLD_OPT_TEXCOORD_USER3 == -1 ) || ( NNGLD_OPT_TEXCOORD_USER4 == -1 ) || ( NNGLD_OPT_TEXCOORD_USER5 == -1 ) || ( NNGLD_OPT_TEXCOORD_USER6 == -1 ) || ( NNGLD_OPT_TEXCOORD_USER7 == -1 ) || ( NNGLD_OPT_TEXCOORD_USER8 == -1 ) ) )
#define NNGLD_FRAG_SPHEREMAP (1)
half2 nnglgSphereMapTexCoord;
#else
#define NNGLD_FRAG_SPHEREMAP (0)
#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)
half2 nnglgDualParaMapTexCoord;
#else
#define NNGLD_FRAG_DUALPARAMAP (0)
#endif

#if ( NNGLD_OPT_FRAG_LIGHTING || ( NNGLD_OPT_TEX_NORMAL != -1 ) || NNGLD_FRAG_DUALPARAMAP )
/* フラグメント単位ライティング用 */
half3 nnglgFragNormal;

half3 nnglgFragDiffuse = half3( 0.0, 0.0, 0.0 );
half3 nnglgFragSpecular = half3( 0.0, 0.0, 0.0 );

/* 法線 */
half3 nnglgNormal;

/* 視線方向 */
half3 nnglgEyeDir;

/* 接空間 */
#if NNGLD_OPT_TANGENT_SPACE
half3 nnglgTangent;
half3 nnglgBinormal;
#endif
#endif

/* ライトアンビエント */
#if ( NNGLD_OPT_FRAG_LIGHTING && NNGLD_PROF_LIGHT_AMBIENT )
half3 nnglgFragAmbient = half3( 0.0, 0.0, 0.0 );
#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
#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_FRAG_SPHEREMAP )
half2 nnglCalcSphereMapTexCoord( void )
{
	half3 r;
	half2 r2;
	r = reflect( nnglgEyeDir, nnglgFragNormal );
	r.z += 1.0;
	r2 = ( normalize( r ).xy ) * half2( 0.5, -0.5 ) + half2( 0.5, 0.5 );
	return ( r2 );
}
#endif

/* 双方物面マップ計算 */
#if ( NNGLD_FRAG_DUALPARAMAP )
half2 nnglCalcDualParaMapTexCoord( void )
{
	half3 r;
	half2 st;
	half s1, izi;

	/* 反射計算 */
	r = reflect( nnglgEyeDir, nnglgFragNormal );

	/* テクスチャマトリクスで変換（通常はワールド座標に変換） */
	r = nngluDualParaboloidMatrix * r;

	/* デュアルパラボロイド変換 */
	izi = 1.0 + abs( r.z );
	st = r.xy * half2( 1.0, -1.0 ) / izi;

	/* テクスチャの左右半分ずつに２枚並べる補正 */
	st = ( st + half2( 1.0, 1.0 ) ) * 0.5;
	s1 = step( 0.0, r.z );
	st.s = ( 0.5 - s1 ) * st.s;

	return st;
}
#endif


/******************************/
/* テクスチャバインド用マクロ */
/******************************/
#ifdef NNGLD_PRECOMPILE_BY_CGC
	#include "nnstdbindsampler.h"
#else
	#define NNGLD_BINDTEX_NORMAL
	#define NNGLD_BINDTEX_BASE
	#define NNGLD_BINDTEX_DECAL
	#define NNGLD_BINDTEX_DECAL2
	#define NNGLD_BINDTEX_DECAL3
	#define NNGLD_BINDTEX_SPECULAR
	#define NNGLD_BINDTEX_SHININESS
	#define NNGLD_BINDTEX_DUALPARABOLOID
	#define NNGLD_BINDTEX_ENVMASK
	#define NNGLD_BINDTEX_MODULATE
	#define NNGLD_BINDTEX_ADD
	#define NNGLD_BINDTEX_OPACITY
	#define NNGLD_BINDTEX_USER1
	#define NNGLD_BINDTEX_USER2
	#define NNGLD_BINDTEX_USER3
	#define NNGLD_BINDTEX_USER4
	#define NNGLD_BINDTEX_USER5
	#define NNGLD_BINDTEX_USER6
	#define NNGLD_BINDTEX_USER7
	#define NNGLD_BINDTEX_USER8
	#define NNGLD_BINDTEX_SHADOW
	#define NNGLD_BINDTEX_SHADOW2
	#define NNGLD_BINDTEX_SAMPLER2D1
	#define NNGLD_BINDTEX_SAMPLER2D2
	#define NNGLD_BINDTEX_SAMPLER3D1
	#define NNGLD_BINDTEX_SAMPLER3D2
	#define NNGLD_BINDTEX_SAMPLERCUBE1
	#define NNGLD_BINDTEX_SAMPLERCUBE2
#endif

/************************/
/* テクスチャサンプル名 */
/************************/
/* 法線マップ */
#if ( NNGLD_OPT_TEX_NORMAL != -1 )
uniform sampler2D nngltexNormal NNGLD_BINDTEX_NORMAL;
#endif

/* ベースディフューズマップ */
#if ( NNGLD_OPT_TEX_BASE != -1 )
uniform sampler2D nngltexBase NNGLD_BINDTEX_BASE;
#endif

/* デカールマップ */
#if ( NNGLD_OPT_TEX_DECAL != -1 )
uniform sampler2D nngltexDecal NNGLD_BINDTEX_DECAL;
#endif

/* デカールマップ２ */
#if ( NNGLD_OPT_TEX_DECAL2 != -1 )
uniform sampler2D nngltexDecal2 NNGLD_BINDTEX_DECAL2;
#endif

/* デカールマップ３ */
#if ( NNGLD_OPT_TEX_DECAL3 != -1 )
uniform sampler2D nngltexDecal3 NNGLD_BINDTEX_DECAL3;
#endif

/* スペキュラマップ */
#if ( NNGLD_OPT_TEX_SPECULAR != -1 )
uniform sampler2D nngltexSpecular NNGLD_BINDTEX_SPECULAR;
#endif

/* スペキュラ光沢度マップ */
#if ( NNGLD_OPT_TEX_SHININESS != -1 )
uniform sampler2D nngltexShininess NNGLD_BINDTEX_SHININESS;
#endif

/* 双方物面環境マップ */
#if ( NNGLD_OPT_TEX_DUALPARABOLOID != -1 )
uniform sampler2D nngltexDualParaboloid NNGLD_BINDTEX_DUALPARABOLOID;
#endif

/* 環境マスクマップ */
#if ( NNGLD_OPT_TEX_ENVMASK != -1 )
uniform sampler2D nngltexEnvMask NNGLD_BINDTEX_ENVMASK;
#endif

/* 乗算テクスチャ */
#if ( NNGLD_OPT_TEX_MODULATE != -1 )
uniform sampler2D nngltexModulate NNGLD_BINDTEX_MODULATE;
#endif

/* 加算テクスチャ */
#if ( NNGLD_OPT_TEX_ADD != -1 )
uniform sampler2D nngltexAdd NNGLD_BINDTEX_ADD;
#endif

/* 不透明度テクスチャ */
#if ( NNGLD_OPT_TEX_OPACITY != -1 )
uniform sampler2D nngltexOpacity NNGLD_BINDTEX_OPACITY;
#endif

/* ユーザーマップ１テクスチャ */
#if ( NNGLD_OPT_TEX_USER1 != -1 )
uniform sampler2D nngltexUser1 NNGLD_BINDTEX_USER1;
#endif

/* ユーザーマップ２テクスチャ */
#if ( NNGLD_OPT_TEX_USER2 != -1 )
uniform sampler2D nngltexUser2 NNGLD_BINDTEX_USER2;
#endif

/* ユーザーマップ３テクスチャ */
#if ( NNGLD_OPT_TEX_USER3 != -1 )
uniform sampler2D nngltexUser3 NNGLD_BINDTEX_USER3;
#endif

/* ユーザーマップ４テクスチャ */
#if ( NNGLD_OPT_TEX_USER4 != -1 )
uniform sampler2D nngltexUser4 NNGLD_BINDTEX_USER4;
#endif

/* ユーザーマップ５テクスチャ */
#if ( NNGLD_OPT_TEX_USER5 != -1 )
uniform sampler2D nngltexUser5 NNGLD_BINDTEX_USER5;
#endif

/* ユーザーマップ６テクスチャ */
#if ( NNGLD_OPT_TEX_USER6 != -1 )
uniform sampler2D nngltexUser6 NNGLD_BINDTEX_USER6;
#endif

/* ユーザーマップ７テクスチャ */
#if ( NNGLD_OPT_TEX_USER7 != -1 )
uniform sampler2D nngltexUser7 NNGLD_BINDTEX_USER7;
#endif

/* ユーザーマップ８テクスチャ */
#if ( NNGLD_OPT_TEX_USER8 != -1 )
uniform sampler2D nngltexUser8 NNGLD_BINDTEX_USER8;
#endif

/* シャドウマップ */
#if ( NNGLD_OPT_TEX_SHADOW != -1 )
uniform sampler2DShadow nngltexShadow NNGLD_BINDTEX_SHADOW;
#endif

/* シャドウマップ */
#if ( NNGLD_OPT_TEX_SHADOW2 != -1 )
uniform sampler2DShadow nngltexShadow2 NNGLD_BINDTEX_SHADOW2;
#endif

/* ユーザーサンプラー２Ｄマップ１ */
#if ( NNGLD_OPT_TEX_SAMPLER2D1 != -1 )
uniform sampler2D nngltexUserSampler2D1 NNGLD_BINDTEX_SAMPLER2D1;
#endif

/* ユーザーサンプラー２Ｄマップ２ */
#if ( NNGLD_OPT_TEX_SAMPLER2D2 != -1 )
uniform sampler2D nngltexUserSampler2D2 NNGLD_BINDTEX_SAMPLER2D2;
#endif

/* ユーザーサンプラー３Ｄマップ１ */
#if ( NNGLD_OPT_TEX_SAMPLER3D1 != -1 )
uniform sampler3D nngltexUserSampler3D1 NNGLD_BINDTEX_SAMPLER3D1;
#endif

/* ユーザーサンプラー３Ｄマップ２ */
#if ( NNGLD_OPT_TEX_SAMPLER3D2 != -1 )
uniform sampler3D nngltexUserSampler3D2 NNGLD_BINDTEX_SAMPLER3D2;
#endif

/* ユーザーサンプラーキューブマップ１ */
#if ( NNGLD_OPT_TEX_SAMPLERCUBE1 != -1 )
uniform samplerCube nngltexUserSamplerCube1 NNGLD_BINDTEX_SAMPLERCUBE1;
#endif

/* ユーザーサンプラーキューブマップ２ */
#if ( NNGLD_OPT_TEX_SAMPLERCUBE2 != -1 )
uniform samplerCube nngltexUserSamplerCube2 NNGLD_BINDTEX_SAMPLERCUBE2;
#endif


/******************************/
/* フラグメントシェーダメイン */
/******************************/
void main ( void )
{
	#if ( NNGLD_OPT_FRAG_LIGHTING || NNGLD_FRAG_DUALPARAMAP )
	/* 視線方向 */
	nnglgEyeDir = half3( normalize( nnglvViewPosition ) );
			// half3の方が速いがオーバーフローの可能性があるのでvec3のままnormalize
	#endif

	/* 接空間 */
	#if ( NNGLD_OPT_FRAG_LIGHTING || NNGLD_FRAG_DUALPARAMAP )
	//nnglgNormal = normalize( nnglvNormal );
	nnglgNormal = normalize( half3( nnglvNormal ) );
		#if NNGLD_OPT_TANGENT_SPACE
		//nnglgTangent = normalize( nnglvTangent );
		nnglgTangent = normalize( half3( nnglvTangent ) );
		//nnglgBinormal = normalize( nnglvBinormal );
		nnglgBinormal = normalize( half3( nnglvBinormal ) );
		#endif
	#endif

	/**************************/
	/* テクスチャサンプル取得 */
	/**************************/
	/* 法線マップ */
	#if ( NNGLD_OPT_FRAG_LIGHTING || NNGLD_FRAG_DUALPARAMAP )
		#if ( NNGLD_OPT_TEX_NORMAL != -1 )
		half4 texnormal = texture2D( nngltexNormal, nnglvTexCoordNormal );

		/* 法線取得 */
			#if NNGLD_OPT_NORMALMAP_AXLY
			/* 圧縮タンジェントスペース法線マップの場合 */
			texnormal = ( texnormal - 0.5 ) * 2.0;
			half3 tannormal = half3( texnormal.a, texnormal.r, sqrt( 1.0 -
					( texnormal.a*texnormal.a + texnormal.r*texnormal.r ) ) );
			tannormal = normalize( tannormal );
			#else
			/* 通常の法線マップの場合 */
			half3 tannormal = normalize( texnormal.rgb - 0.5 );
			#endif
			/* 法線をカメラ座標系に変換 */
			#if NNGLD_OPT_TANGENT_SPACE
			nnglgFragNormal = tannormal.x * nnglgTangent
								+ tannormal.y * nnglgBinormal
									+ tannormal.z * nnglgNormal;
			nnglgFragNormal = normalize( nnglgFragNormal );
			#else
			/* 本来はここは通らない */
			nnglgFragNormal = tannormal;
			#endif
		#else
		/* フラグメント単位ライティングの場合（法線マップなし） */
		nnglgFragNormal = nnglgNormal;
		#endif
	#endif

	/* 環境マップ用テクスチャ座標計算 */
	#if ( NNGLD_FRAG_SPHEREMAP )
		nnglgSphereMapTexCoord = nnglCalcSphereMapTexCoord();
	#endif
	#if ( NNGLD_FRAG_DUALPARAMAP )
		nnglgDualParaMapTexCoord = nnglCalcDualParaMapTexCoord();
	#endif

	/* 環境マスクマップ */
	#if ( NNGLD_OPT_TEX_ENVMASK != -1 )
	half4 texenvmask = texture2D( nngltexEnvMask, nnglvTexCoordEnvMask );
	#endif

	/* ベースディフューズマップ */
	#if ( NNGLD_OPT_TEX_BASE != -1 )
	half4 texbase;
		#if ( NNGLD_FRAG_SPHEREMAP && NNGLD_OPT_TEXCOORD_BASE == -1 )
		texbase = texture2D( nngltexBase, nnglgSphereMapTexCoord );
		#elif ( NNGLD_OPT_TEXCOORD_BASE == -3 )
		texbase = texture2D( nngltexBase, nnglgDualParaMapTexCoord );
		#else
		texbase = texture2D( nngltexBase, nnglvTexCoordBase );
		#endif
		/* 環境マスクマップ適用 */
		#if ( ( NNGLD_OPT_TEX_ENVMASK != -1 ) && ( ( NNGLD_OPT_TEXCOORD_BASE == -1 ) || ( NNGLD_OPT_TEXCOORD_BASE == -3 ) ) )
		texbase = mix( half4( 1.0, 1.0, 1.0, 1.0 ), texbase, texenvmask.r );
		#endif

	/* ベースディフューズマップ不透明度 */
	texbase.a *= nngluTexBaseAlpha;
	#else
	/* ベーステクスチャがない場合はデフォルトのベース色を使用する */
	const half4 texbase = half4( 1.0, 1.0, 1.0, 1.0 );
	#endif

	/* デカールマップ */
	#if ( NNGLD_OPT_TEX_DECAL != -1 )
	half4 texdecal;
		#if ( NNGLD_FRAG_SPHEREMAP && NNGLD_OPT_TEXCOORD_DECAL == -1 )
		texdecal = texture2D( nngltexDecal, nnglgSphereMapTexCoord );
		#elif ( NNGLD_OPT_TEXCOORD_DECAL == -3 )
		texdecal = texture2D( nngltexDecal, nnglgDualParaMapTexCoord );
		#else
		texdecal = texture2D( nngltexDecal, nnglvTexCoordDecal );
		#endif
	/* デカールマップ不透明度 */
	texdecal.a *= nngluTexDecalAlpha;
		#if ( ( NNGLD_OPT_TEXCOORD_DECAL == -1 || NNGLD_OPT_TEXCOORD_DECAL == -3 ) && NNGLD_OPT_TEX_ENVMASK != -1 )
		texdecal.a *= texenvmask.r;
		#endif
	#endif

	/* デカールマップ２ */
	#if ( NNGLD_OPT_TEX_DECAL2 != -1 )
	half4 texdecal2;
		#if ( NNGLD_FRAG_SPHEREMAP && NNGLD_OPT_TEXCOORD_DECAL2 == -1 )
		texdecal2 = texture2D( nngltexDecal2, nnglgSphereMapTexCoord );
		#elif ( NNGLD_OPT_TEXCOORD_DECAL2 == -3 )
		texdecal2 = texture2D( nngltexDecal2, nnglgDualParaMapTexCoord );
		#else
		texdecal2 = texture2D( nngltexDecal2, nnglvTexCoordDecal2 );
		#endif
	/* デカールマップ２不透明度 */
	texdecal2.a *= nngluTexDecal2Alpha;
		#if ( ( NNGLD_OPT_TEXCOORD_DECAL2 == -1 || NNGLD_OPT_TEXCOORD_DECAL2 == -3 ) && NNGLD_OPT_TEX_ENVMASK != -1 )
		texdecal2.a *= texenvmask.r;
		#endif
	#endif

	/* デカールマップ３ */
	#if ( NNGLD_OPT_TEX_DECAL3 != -1 )
	half4 texdecal3;
		#if ( NNGLD_FRAG_SPHEREMAP && NNGLD_OPT_TEXCOORD_DECAL3 == -1 )
		texdecal3 = texture2D( nngltexDecal3, nnglgSphereMapTexCoord );
		#elif ( NNGLD_OPT_TEXCOORD_DECAL3 == -3 )
		texdecal3 = texture2D( nngltexDecal3, nnglgDualParaMapTexCoord );
		#else
		texdecal3 = texture2D( nngltexDecal3, nnglvTexCoordDecal3 );
		#endif
	/* デカールマップ３不透明度 */
	texdecal3.a *= nngluTexDecal3Alpha;
		#if ( ( NNGLD_OPT_TEXCOORD_DECAL3 == -1 || NNGLD_OPT_TEXCOORD_DECAL3 == -3 ) && NNGLD_OPT_TEX_ENVMASK != -1 )
		texdecal3.a *= texenvmask.r;
		#endif
	#endif

	/* スペキュラマップ */
	#if ( NNGLD_OPT_TEX_SPECULAR != -1 )
	half4 texspecular = texture2D( nngltexSpecular, nnglvTexCoordSpecular );
	#endif

	/* スペキュラ光沢度マップ */
	#if ( NNGLD_OPT_TEX_SHININESS != -1 )
	half4 texshininess = texture2D( nngltexShininess, nnglvTexCoordShininess );
	#endif

	/* 乗算テクスチャ */
	#if ( NNGLD_OPT_TEX_MODULATE != -1 )
	half4 texmodulate;
		#if ( NNGLD_FRAG_SPHEREMAP && NNGLD_OPT_TEXCOORD_MODULATE == -1 )
		texmodulate = texture2D( nngltexModulate, nnglgSphereMapTexCoord );
		#elif ( NNGLD_OPT_TEXCOORD_MODULATE == -3 )
		texmodulate = texture2D( nngltexModulate, nnglgDualParaMapTexCoord );
		#else
		texmodulate = texture2D( nngltexModulate, nnglvTexCoordModulate );
		#endif
		/* 環境マスクマップ適用 */
		#if ( NNGLD_OPT_TEX_ENVMASK != -1 && ( NNGLD_OPT_TEXCOORD_MODULATE == -1 || NNGLD_OPT_TEXCOORD_MODULATE == -3 ) )
			texmodulate = half4( 1.0, 1.0, 1.0, 1.0 )
				- ( half4( 1.0, 1.0, 1.0, 1.0 ) - texmodulate ) * texenvmask.r;
		#endif
	#endif

	/* 加算テクスチャ */
	#if ( NNGLD_OPT_TEX_ADD != -1 )
	half4 texadd;
		#if ( NNGLD_FRAG_SPHEREMAP && NNGLD_OPT_TEXCOORD_ADD == -1 )
		texadd = texture2D( nngltexAdd, nnglgSphereMapTexCoord );
		#elif ( NNGLD_OPT_TEXCOORD_ADD == -3 )
		texadd = texture2D( nngltexAdd, nnglgDualParaMapTexCoord );
			#if ( NNGLD_OPT_TEX_ENVMASK != -1 )
			texadd *= texenvmask.r;
			#endif
		#else
		texadd = texture2D( nngltexAdd, nnglvTexCoordAdd );
		#endif
		/* 加算マップ強度 */
		texadd *= nngluTexAddLevel;
		/* 環境マスクマップ適用 */
		#if ( NNGLD_OPT_TEX_ENVMASK != -1 && ( NNGLD_OPT_TEXCOORD_ADD == -1 || NNGLD_OPT_TEXCOORD_ADD == -3 ) )
		texadd *= texenvmask.r;
		#endif
	#endif

	/* 双方物面環境マップ */
	#if ( NNGLD_OPT_TEX_DUALPARABOLOID != -1 )
	half4 texdual;
	texdual = texture2D( nngltexDualParaboloid, nnglgDualParaMapTexCoord );
		#if ( NNGLD_OPT_TEX_ENVMASK != -1 )
		texdual *= texenvmask.r;
		#endif
	/* 双方物面環境マップ強度 */
	texdual *= nngluTexDualParaboloidLevel;
	#endif

	/* シャドウマップテクスチャ */
	#if ( NNGLD_OPT_TEX_SHADOW != -1 )
	half4 texshadow = shadow2DProj( nngltexShadow, nnglvTexCoordShadow );
	#endif

	/* シャドウマップ２テクスチャ */
	#if ( NNGLD_OPT_TEX_SHADOW2 != -1 )
	half4 texshadow2 = shadow2DProj( nngltexShadow2, nnglvTexCoordShadow2 );
	#endif

	/* 不透明度テクスチャ */
	#if ( NNGLD_OPT_TEX_OPACITY != -1 )
	half4 texopacity;
		#if ( NNGLD_FRAG_SPHEREMAP && NNGLD_OPT_TEXCOORD_OPACITY == -1 )
		texopacity = texture2D( nngltexOpacity, nnglgSphereMapTexCoord );
			#if ( NNGLD_OPT_TEX_ENVMASK != -1 )
			texopacity *= ( 1.0 - texenvmask.r );
			#endif
		#elif ( NNGLD_OPT_TEXCOORD_OPACITY == -3 )
		texopacity = texture2D( nngltexOpacity, nnglgDualParaMapTexCoord );
		#else
		texopacity = texture2D( nngltexOpacity, nnglvTexCoordOpacity );
		#endif
	#endif

	/* ベースおよびデカール貼り */
	#if ( NNGLD_OPT_TEX_DECAL3 != -1 )
	nnglgFragColor = mix( mix( mix( texbase.rgb, texdecal.rgb, texdecal.a ),
					texdecal2.rgb, texdecal2.a ), texdecal3.rgb, texdecal3.a );
	#elif ( NNGLD_OPT_TEX_DECAL2 != -1 )
	nnglgFragColor = mix( mix( texbase.rgb, texdecal.rgb, texdecal.a ),
												texdecal2.rgb, texdecal2.a );
	#elif ( NNGLD_OPT_TEX_DECAL != -1 )
	nnglgFragColor = mix( texbase.rgb, texdecal.rgb, texdecal.a );
	#else
	nnglgFragColor = texbase.rgb;
	#endif

	/********************/
	/* ライティング計算 */
	/********************/
	#if NNGLD_OPT_FRAG_LIGHTING 
	/* フラグメント単位ライティング */

	#if ( NNGLD_OPT_NUM_FRAG_PARALLEL_LIGHT > 0 )
	/* パラレルライトの計算 */
	for ( int litno = 0;
				litno < NNGLD_OPT_NUM_FRAG_PARALLEL_LIGHT; litno++ ){
		half3 litdir = half3( gl_LightSource[ litno ].position.xyz );
		/* ディフューズ計算 */
		half fdiff = dot ( nnglgFragNormal, litdir );
		//fdiff = max( fdiff, 0.0 );
		fdiff = clamp( fdiff, 0.0, 1.0 );
		nnglgFragDiffuse += fdiff * gl_LightSource[ litno ].diffuse.rgb;
		/* スペキュラ計算 */
		#if NNGLD_OPT_SPECULAR
		vec3 halfvec = normalize( litdir - nnglgEyeDir );
		nnglgFragSpecular += gl_LightSource[ litno ].specular.rgb *
				pow(
						//half( max( dot( halfvec, nnglgFragNormal ), 0.0 ) )
						half( clamp( dot( halfvec, nnglgFragNormal ), 0.0, 1.0 ) )
						,
						#if ( NNGLD_OPT_TEX_SHININESS != -1 )
							nngluTexShininessLevel * texshininess.r
							* gl_FrontMaterial.shininess
						#else
							gl_FrontMaterial.shininess
						#endif
				);
		#endif
		#if ( NNGLD_PROF_LIGHT_AMBIENT )
		/* アンビエント */
		nnglgFragAmbient += gl_LightSource[litno].ambient.rgb;
		#endif
	}
	#endif

	#if ( NNGLD_OPT_NUM_FRAG_POINT_LIGHT > 0 )
	/* ポイントライトの計算 */
	for ( int litno = NNGLD_OPT_NUM_FRAG_PARALLEL_LIGHT;
			litno < NNGLD_OPT_NUM_FRAG_PARALLEL_LIGHT
								+ NNGLD_OPT_NUM_FRAG_POINT_LIGHT; litno ++ )
	{
		float dist, attn;
		half diffcnt, speccnt;
		float3 litpos;
		half3 litdir;
		int unino;

		/* ライト位置 */
		litpos = vec3( gl_LightSource[ litno ].position ) - nnglvViewPosition;

		/* 減衰度 */
		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
		/* フォールオフ */
		unino = litno - NNGLD_OPT_NUM_FRAG_PARALLEL_LIGHT;
		attn *= clamp(
				( nngluPointLightFallOffEnd[ unino ] - dist )
					* nngluPointLightFallOffScale[ unino ], 0.0, 1.0 );

		/* ライト方向 */
		//litdir = normalize( half3( litpos ) );
		litdir = half3( normalize( litpos ) );	// オーバーフローの可能性を考慮

		/* ディフューズ成分 */
		//diffcnt = max( dot( nnglgFragNormal, litdir ), 0.0 );
		diffcnt = clamp( dot( nnglgFragNormal, litdir ), 0.0, 1.0 );
		nnglgFragDiffuse += gl_LightSource[litno].diffuse.rgb * diffcnt * attn;

		/* スペキュラ計算 */
		#if NNGLD_OPT_SPECULAR
		half3 halfvec = normalize( litdir - nnglgEyeDir );
		nnglgFragSpecular += gl_LightSource[ litno ].specular.rgb *
				pow(
						//max( dot( halfvec, nnglgFragNormal ), 0.0 ),
						clamp( dot( halfvec, nnglgFragNormal ), 0.0, 1.0 ),
						#if ( NNGLD_OPT_TEX_SHININESS != -1 )
							nngluTexShininessLevel * texshininess.r
											* gl_FrontMaterial.shininess
						#else
							gl_FrontMaterial.shininess
						#endif
				) * attn;
		#endif
		#if ( NNGLD_PROF_LIGHT_AMBIENT )
		/* アンビエント */
		nnglgFragAmbient += gl_LightSource[litno].ambient.rgb * attn;
		#endif
	}
	#endif

	/* ディフューズ、アンビエント、エミッション成分 */
	#if ( NNGLD_OPT_TEX_SHADOW != -1 )
		/* シャドウマップの場合 */
		half3 shadowcolor = max( texshadow.rgb, nngluTexShadowColor.rgb );
		#if ( NNGLD_OPT_TEX_SHADOW2 != -1 )
			/* シャドウマップ２がある場合 */
			shadowcolor *= max( texshadow2.rgb, nngluTexShadow2Color.rgb );
		#endif
		#if ( NNGLD_PROF_LIGHT_AMBIENT )
			nnglgFragColor *= ( nnglgFragDiffuse * gl_Color.rgb * shadowcolor
								+ gl_FrontLightModelProduct.sceneColor.rgb
								+ ( nnglgFragAmbient.rgb + 0.001 ) );
		#else
			nnglgFragColor *= ( nnglgFragDiffuse * gl_Color.rgb * shadowcolor
								+ gl_FrontLightModelProduct.sceneColor.rgb );
		#endif
	#else
		#if ( NNGLD_PROF_LIGHT_AMBIENT )
			nnglgFragColor *= ( nnglgFragDiffuse * gl_Color.rgb
								+ gl_FrontLightModelProduct.sceneColor.rgb
								+ ( nnglgFragAmbient.rgb + 0.001 ) );
		#else
			nnglgFragColor *= ( nnglgFragDiffuse * gl_Color.rgb
								+ gl_FrontLightModelProduct.sceneColor.rgb );
		#endif
	#endif

	/* スペキュラ成分 */
	#if ( NNGLD_OPT_TEX_SPECULAR != -1 )
	/* スペキュラマップ */
	nnglgFragSpecular *= texspecular.rgb;
	#endif
	#if ( NNGLD_OPT_TEX_SHADOW != -1 )
		/* シャドウマップの場合 */
		nnglgFragColor += nnglgFragSpecular * shadowcolor
					* gl_SecondaryColor.rgb * gl_FrontMaterial.specular.rgb;
	#else
		nnglgFragColor += nnglgFragSpecular
					* gl_SecondaryColor.rgb * gl_FrontMaterial.specular.rgb;
	#endif

	#else
	/* 頂点単位ライティング */
	/* ディフューズ */
		#if ( NNGLD_OPT_TEX_SHADOW != -1 )
		/* シャドウマップの場合 */
		half3 shadowcolor = max( texshadow.rgb, nngluTexShadowColor.rgb );
		#if ( NNGLD_OPT_TEX_SHADOW2 != -1 )
			/* シャドウマップ２がある場合 */
			shadowcolor *= max( texshadow2.rgb, nngluTexShadow2Color.rgb );
		#endif
		nnglgFragColor *= gl_Color.rgb * shadowcolor;
		#else
		nnglgFragColor *= gl_Color.rgb;
		#endif
	/* スペキュラ */
		#if ( NNGLD_OPT_TEX_SPECULAR != -1 )
		/* スペキュラマップ */
			#if ( NNGLD_OPT_TEX_SHADOW != -1 )
			/* シャドウマップの場合 */
			nnglgFragColor += texspecular.rgb * shadowcolor
					* gl_SecondaryColor.rgb * gl_FrontMaterial.specular.rgb;
			#else
			nnglgFragColor += texspecular.rgb
					* gl_SecondaryColor.rgb * gl_FrontMaterial.specular.rgb;
			#endif
		#else
			#if ( NNGLD_OPT_TEX_SHADOW != -1 )
			/* シャドウマップの場合 */
			nnglgFragColor += gl_SecondaryColor.rgb * shadowcolor
								* gl_FrontMaterial.specular.rgb;
			#else
			nnglgFragColor += gl_SecondaryColor.rgb
								* gl_FrontMaterial.specular.rgb;
			#endif
		#endif
	#endif

	/* 乗算テクスチャ */
	#if ( NNGLD_OPT_TEX_MODULATE != -1 )
	nnglgFragColor *= texmodulate.rgb;
	#endif

	/* 加算テクスチャ */
	#if ( NNGLD_OPT_TEX_ADD != -1 )
	nnglgFragColor += texadd.rgb;
	#endif

	/* 双方物面環境マップテクスチャ */
	#if ( NNGLD_OPT_TEX_DUALPARABOLOID != -1 )
	nnglgFragColor += texdual.rgb;
	#endif

	/****************************/
	/* フラグメントアルファ計算 */
	/****************************/
	/* ベーステクスチャ */
	#if ( NNGLD_OPT_TEX_DECAL3 != -1 )
	nnglgFragAlpha = 1.0 - (1.0-texbase.a) * (1.0-texdecal.a) 
							* (1.0-texdecal2.a) * (1.0-texdecal3.a);
	#elif ( NNGLD_OPT_TEX_DECAL2 != -1 )
	nnglgFragAlpha = 1.0 -
					(1.0-texbase.a) * (1.0-texdecal.a) * (1.0-texdecal2.a);
	#elif ( NNGLD_OPT_TEX_DECAL != -1 )
	nnglgFragAlpha = texbase.a + texdecal.a - texbase.a * texdecal.a;
	#else
	nnglgFragAlpha = texbase.a;
	#endif
	/* 不透明度テクスチャ */
	#if ( NNGLD_OPT_TEX_OPACITY != -1 )
	nnglgFragAlpha *= texopacity.r;
	#endif
	/* 乗算テクスチャアルファ */
	#if ( NNGLD_OPT_TEX_MODULATE != -1 )
	nnglgFragAlpha *= texmodulate.a;
	#endif
	/* 頂点カラーおよびマテリアルのアルファ */
	nnglgFragAlpha *= gl_Color.a;

	/******************/
	/* カラークランプ */
	/******************/
	nnglgFragColor = clamp( nnglgFragColor, 0.0, 1.0 );

	/**********/
	/* フォグ */
	/**********/
	/* 頂点フォグ */
	#if ( !( NNGLD_PROF_FRAG_FOG ) && ( NNGLD_PROF_FOG_MODEL ) )
		nnglgFragColor = mix( gl_Fog.color.rgb, nnglgFragColor , nnglvFog );
	#endif

	/* フラグメント単位フォグ */
	#if ( NNGLD_PROF_FRAG_FOG && NNGLD_PROF_FOG_MODEL )
		float fogd;
		#if ( NNGLD_PROF_FOG_MODEL == 1 )
			fogd = ( gl_Fog.end - nnglvFog ) * gl_Fog.scale;
		#elif ( NNGLD_PROF_FOG_MODEL == 2 )
			fogd = exp2( -gl_Fog.density * nnglvFog * 1.442695 );
		#elif ( NNGLD_PROF_FOG_MODEL == 3 )
			fogd = exp2( -gl_Fog.density * gl_Fog.density
							* nnglvFog * nnglvFog * 1.442695 );
		#endif
		fogd = clamp( fogd, 0.0, 1.0 );
		nnglgFragColor = mix( gl_Fog.color.rgb, nnglgFragColor, fogd );
	#endif

	/* フラグメントカラー出力 */
	gl_FragColor.rgb = nnglgFragColor;

	/* フラグメントアルファ出力 */
	gl_FragColor.a= nnglgFragAlpha;
}
