// --------------------------------------------------------------------------- // Project: NintendoWare // File: CalcVertexLighting.vsh // // Copyright (C)2009-2010 Nintendo Co., Ltd. All rights reserved. // // These coded instructions, statements, and computer programs contain // proprietary information of Nintendo of America Inc. and/or Nintendo // Company Ltd., and are protected by Federal copyright law. They may // not be disclosed to third parties or copied or duplicated in any form, // in whole or in part, without the prior written consent of Nintendo. // // $Revision:$ // --------------------------------------------------------------------------- #include "ShaderConfig.h" #include "VertexShader.h" //----------------------------------------------------------------------------- // @brief 頂点ライティングを計算し TEMP_COLO に結果を加えます。 //----------------------------------------------------------------------------- l_calc_vertex_lighting: mov TEMP1, nw_material_ambient._XYZW mov TEMP2, nw_material_diffuse._XYZW mov TEMP3, CONST_0 loop nw_vertex_light_count // ループ内ではTEMP1,2,3は使用不可 mova a0.x, TEMP3 mov TEMP4.x, VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_POSITION + a0.x)._W mov TEMP4.y, VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_DISTANCE_ATTENUATION + a0.x)._W cmp EQ, EQ, TEMP4.xy, CONST_0_1_1_1 ifc 1, 0, COND_MODE_STA0 // ディレクショナルライトの場合 dp3 TEMP6.x, TEMP_NORM, VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_POSITION + a0.x)._XYZW mov TEMP6.y, CONST_1 else // ポイントライト・スポットライト // ライトベクトルを求める sub TEMP4, VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_POSITION + a0.x)._XYZW, TEMP_POSI mov TEMP6.y, CONST_1 ifc 0, 1, COND_MODE_STA1 // 距離減衰を行う場合 mov TEMP5.x, CONST_1 dp3 TEMP5.z, TEMP4, TEMP4 mul TEMP5.y, TEMP5.z, TEMP5.z dp3 TEMP6.y, TEMP5, VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_DISTANCE_ATTENUATION + a0.x)._XYZW rcp TEMP6.y, TEMP6.y endif mov TEMP5, VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_SPOT_DIRECTION + a0.x)._XYZW cmp EQ, EQ, TEMP5.ww, CONST_1 // ライトベクトルを正規化 dp3 TEMP4.w, TEMP4, TEMP4 rsq TEMP4.w, TEMP4.w mul TEMP4, TEMP4, TEMP4.w ifc 1, 0, COND_MODE_STA0 // 角度減衰を行う場合 dp3 TEMP5.x, -TEMP4, VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_SPOT_DIRECTION + a0.x)._XYZW slt TEMP5.y, TEMP5.x, VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_SPOT_FACTOR + a0.x)._Y cmp EQ, EQ, TEMP5.xy, CONST_1 ifc 0, 1, COND_MODE_STA1 mov TEMP5.x, CONST_0 else log TEMP5.y, TEMP5.x mul TEMP5.y, TEMP5.y, VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_SPOT_FACTOR + a0.x)._X exp TEMP5.x, TEMP5.y endif mul TEMP6.y, TEMP6.y, TEMP5.x endif dp3 TEMP6.x, TEMP_NORM, TEMP4 endif // TEMP6.xには法線とライトベクトルの内積、TEMP6.yには減衰係数が入っている cmp EQ, GT, TEMP6.xy, CONST_0 ifc 0, 1, COND_MODE_STA1 // 減衰係数が0以下の場合はライトの影響がない max TEMP6.x, TEMP6.x, CONST_0 mad TEMP_COLO.xyz, TEMP1.xyz, VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_AMBIENT + a0.x)._XYZ, TEMP_COLO.xyz mul TEMP4, TEMP2, VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_DIFFUSE + a0.x)._XYZW mul TEMP5.xyz, TEMP6.xxx, TEMP4.xyz mul TEMP5.xyz, TEMP6.yyy, TEMP5.xyz add TEMP_COLO.xyz, TEMP_COLO.xyz, TEMP5.xyz add TEMP_COLO.w, TEMP_COLO.w, TEMP4.w endif sub TEMP3, TEMP3, CONST_6 endloop mov TEMP_STUS.x, CONST_1 ret