00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org 00006 00007 Copyright (c) 2000-2012 Torus Knot Software Ltd 00008 Permission is hereby granted, free of charge, to any person obtaining a copy 00009 of this software and associated documentation files (the "Software"), to deal 00010 in the Software without restriction, including without limitation the rights 00011 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00012 copies of the Software, and to permit persons to whom the Software is 00013 furnished to do so, subject to the following conditions: 00014 00015 The above copyright notice and this permission notice shall be included in 00016 all copies or substantial portions of the Software. 00017 00018 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00019 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00020 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00021 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00022 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00023 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00024 THE SOFTWARE. 00025 ----------------------------------------------------------------------------- 00026 */ 00027 #ifndef _ShaderExNormalMapLighting_ 00028 #define _ShaderExNormalMapLighting_ 00029 00030 #include "OgreShaderPrerequisites.h" 00031 #ifdef RTSHADER_SYSTEM_BUILD_EXT_SHADERS 00032 #include "OgreShaderParameter.h" 00033 #include "OgreShaderSubRenderState.h" 00034 #include "OgreVector4.h" 00035 #include "OgreLight.h" 00036 #include "OgreCommon.h" 00037 00038 namespace Ogre { 00039 namespace RTShader { 00040 00048 #define SGX_LIB_NORMALMAPLIGHTING "SGXLib_NormalMapLighting" 00049 #define SGX_FUNC_CONSTRUCT_TBNMATRIX "SGX_ConstructTBNMatrix" 00050 #define SGX_FUNC_TRANSFORMNORMAL "SGX_TransformNormal" 00051 #define SGX_FUNC_TRANSFORMPOSITION "SGX_TransformPosition" 00052 #define SGX_FUNC_FETCHNORMAL "SGX_FetchNormal" 00053 #define SGX_FUNC_LIGHT_DIRECTIONAL_DIFFUSE "SGX_Light_Directional_Diffuse" 00054 #define SGX_FUNC_LIGHT_DIRECTIONAL_DIFFUSESPECULAR "SGX_Light_Directional_DiffuseSpecular" 00055 #define SGX_FUNC_LIGHT_POINT_DIFFUSE "SGX_Light_Point_Diffuse" 00056 #define SGX_FUNC_LIGHT_POINT_DIFFUSESPECULAR "SGX_Light_Point_DiffuseSpecular" 00057 #define SGX_FUNC_LIGHT_SPOT_DIFFUSE "SGX_Light_Spot_Diffuse" 00058 #define SGX_FUNC_LIGHT_SPOT_DIFFUSESPECULAR "SGX_Light_Spot_DiffuseSpecular" 00059 00063 class _OgreRTSSExport NormalMapLighting : public SubRenderState 00064 { 00065 00066 // Interface. 00067 public: 00069 NormalMapLighting(); 00070 00074 virtual const String& getType() const; 00075 00079 virtual int getExecutionOrder() const; 00080 00084 virtual void updateGpuProgramsParams(Renderable* rend, Pass* pass, const AutoParamDataSource* source, const LightList* pLightList); 00085 00089 virtual void copyFrom(const SubRenderState& rhs); 00090 00091 00095 virtual bool preAddToRenderState(const RenderState* renderState, Pass* srcPass, Pass* dstPass); 00096 00100 void setTexCoordIndex(unsigned int index) { mVSTexCoordSetIndex = index;} 00101 00105 unsigned int getTexCoordIndex() const { return mVSTexCoordSetIndex; } 00106 00107 // Type of this render state. 00108 static String Type; 00109 00110 // Normal map space definition. 00111 enum NormalMapSpace 00112 { 00113 NMS_TANGENT, // Normal map contains normal data in tangent space. 00114 // This is the default normal mapping behavior and it requires that the 00115 // target mesh will have valid tangents within its vertex data. 00116 00117 NMS_OBJECT // Normal map contains normal data in object local space. 00118 // This normal mapping technique has the advantages of better visualization results, 00119 // lack of artifacts that comes from texture mirroring usage, it doesn't requires tangent 00120 // and it also saves some instruction in the vertex shader stage. 00121 // The main drawback of using this kind of normal map is that the target object must be static 00122 // in terms of local space rotations and translations. 00123 }; 00124 00129 void setNormalMapSpace(NormalMapSpace normalMapSpace) { mNormalMapSpace = normalMapSpace; } 00130 00132 NormalMapSpace getNormalMapSpace() const { return mNormalMapSpace; } 00133 00137 void setNormalMapTextureName(const String& textureName) { mNormalMapTextureName = textureName; } 00138 00142 const String& getNormalMapTextureName() const { return mNormalMapTextureName; } 00143 00150 void setNormalMapFiltering(const FilterOptions minFilter, const FilterOptions magFilter, const FilterOptions mipFilter) 00151 { mNormalMapMinFilter = minFilter; mNormalMapMagFilter = magFilter; mNormalMapMipFilter = mipFilter; } 00152 00159 void getNormalMapFiltering(FilterOptions& minFilter, FilterOptions& magFilter, FilterOptions& mipFilter) const 00160 { minFilter = mNormalMapMinFilter; magFilter = mNormalMapMagFilter ; mipFilter = mNormalMapMipFilter; } 00161 00165 void setNormalMapAnisotropy(unsigned int anisotropy) { mNormalMapAnisotropy = anisotropy; } 00166 00167 00169 unsigned int getNormalMapAnisotropy() const { return mNormalMapAnisotropy; } 00170 00171 00175 void setNormalMapMipBias(Real mipBias) { mNormalMapMipBias = mipBias; } 00176 00177 00179 Real getNormalMapMipBias() const { return mNormalMapMipBias; } 00180 00181 00182 00183 // Protected types: 00184 protected: 00185 00186 // Per light parameters. 00187 struct _OgreRTSSExport LightParams 00188 { 00189 // Light type. 00190 Light::LightTypes mType; 00191 // Light position. 00192 UniformParameterPtr mPosition; 00193 // Vertex shader output vertex position to light position direction (texture space). 00194 ParameterPtr mVSOutToLightDir; 00195 // Pixel shader input vertex position to light position direction (texture space). 00196 ParameterPtr mPSInToLightDir; 00197 // Light direction. 00198 UniformParameterPtr mDirection; 00199 // Vertex shader output light direction (texture space). 00200 ParameterPtr mVSOutDirection; 00201 // Pixel shader input light direction (texture space). 00202 ParameterPtr mPSInDirection; 00203 // Attenuation parameters. 00204 UniformParameterPtr mAttenuatParams; 00205 // Spot light parameters. 00206 UniformParameterPtr mSpotParams; 00207 // Diffuse colour. 00208 UniformParameterPtr mDiffuseColour; 00209 // Specular colour. 00210 UniformParameterPtr mSpecularColour; 00211 00212 }; 00213 00214 typedef vector<LightParams>::type LightParamsList; 00215 typedef LightParamsList::iterator LightParamsIterator; 00216 typedef LightParamsList::const_iterator LightParamsConstIterator; 00217 00218 // Protected methods 00219 protected: 00220 00226 void setTrackVertexColourType(TrackVertexColourType type) { mTrackVertexColourType = type; } 00227 00231 TrackVertexColourType getTrackVertexColourType() const { return mTrackVertexColourType; } 00232 00233 00238 void setLightCount(const int lightCount[3]); 00239 00244 void getLightCount(int lightCount[3]) const; 00250 void setSpecularEnable(bool enable) { mSpecularEnable = enable; } 00251 00255 bool getSpecularEnable() const { return mSpecularEnable; } 00256 00257 00261 virtual bool resolveParameters(ProgramSet* programSet); 00262 00264 bool resolveGlobalParameters(ProgramSet* programSet); 00265 00267 bool resolvePerLightParameters(ProgramSet* programSet); 00268 00272 virtual bool resolveDependencies(ProgramSet* programSet); 00273 00277 virtual bool addFunctionInvocations(ProgramSet* programSet); 00278 00279 00283 bool addVSInvocation(Function* vsMain, const int groupOrder, int& internalCounter); 00284 00288 bool addVSIlluminationInvocation(LightParams* curLightParams, Function* vsMain, const int groupOrder, int& internalCounter); 00289 00293 bool addPSNormalFetchInvocation(Function* psMain, const int groupOrder, int& internalCounter); 00294 00295 00299 bool addPSGlobalIlluminationInvocation(Function* psMain, const int groupOrder, int& internalCounter); 00300 00304 bool addPSIlluminationInvocation(LightParams* curLightParams, Function* psMain, const int groupOrder, int& internalCounter); 00305 00309 bool addPSFinalAssignmentInvocation(Function* psMain, const int groupOrder, int& internalCounter); 00310 00311 00312 // Attributes. 00313 protected: 00314 // The normal map texture name. 00315 String mNormalMapTextureName; 00316 // Track per vertex colour type. 00317 TrackVertexColourType mTrackVertexColourType; 00318 // Specular component enabled/disabled. 00319 bool mSpecularEnable; 00320 // Light list. 00321 LightParamsList mLightParamsList; 00322 // Normal map texture sampler index. 00323 unsigned short mNormalMapSamplerIndex; 00324 // Vertex shader input texture coordinate set index. 00325 unsigned int mVSTexCoordSetIndex; 00326 // The normal map min filter. 00327 FilterOptions mNormalMapMinFilter; 00328 // The normal map mag filter. 00329 FilterOptions mNormalMapMagFilter; 00330 // The normal map mip filter. 00331 FilterOptions mNormalMapMipFilter; 00332 // The normal map max anisotropy value. 00333 unsigned int mNormalMapAnisotropy; 00334 // The normal map mip map bias. 00335 Real mNormalMapMipBias; 00336 // The normal map space. 00337 NormalMapSpace mNormalMapSpace; 00338 // World matrix parameter. 00339 UniformParameterPtr mWorldMatrix; 00340 // World matrix inverse rotation matrix parameter. 00341 UniformParameterPtr mWorldInvRotMatrix; 00342 // Camera position in world space parameter. 00343 UniformParameterPtr mCamPosWorldSpace; 00344 // Vertex shader input position parameter. 00345 ParameterPtr mVSInPosition; 00346 // Vertex shader world position parameter. 00347 ParameterPtr mVSWorldPosition; 00348 // Vertex shader output view vector (position in camera space) parameter. 00349 ParameterPtr mVSOutView; 00350 // Pixel shader input view position (position in camera space) parameter. 00351 ParameterPtr mPSInView; 00352 // Vertex shader input normal. 00353 ParameterPtr mVSInNormal; 00354 // Vertex shader input tangent. 00355 ParameterPtr mVSInTangent; 00356 // Vertex shader local TNB matrix. 00357 ParameterPtr mVSTBNMatrix; 00358 // Vertex shader local light direction. 00359 ParameterPtr mVSLocalDir; 00360 // Normal map texture sampler parameter. 00361 UniformParameterPtr mNormalMapSampler; 00362 // Pixel shader normal parameter. 00363 ParameterPtr mPSNormal; 00364 // Vertex shader input texture coordinates. 00365 ParameterPtr mVSInTexcoord; 00366 // Vertex shader output texture coordinates. 00367 ParameterPtr mVSOutTexcoord; 00368 // Pixel shader input texture coordinates. 00369 ParameterPtr mPSInTexcoord; 00370 // Pixel shader temporary diffuse calculation parameter. 00371 ParameterPtr mPSTempDiffuseColour; 00372 // Pixel shader temporary specular calculation parameter. 00373 ParameterPtr mPSTempSpecularColour; 00374 // Pixel shader input/local diffuse parameter. 00375 ParameterPtr mPSDiffuse; 00376 // Pixel shader input/local specular parameter. 00377 ParameterPtr mPSSpecular; 00378 // Pixel shader output diffuse parameter. 00379 ParameterPtr mPSOutDiffuse; 00380 // Pixel shader output specular parameter. 00381 ParameterPtr mPSOutSpecular; 00382 // Derived scene colour parameter. 00383 UniformParameterPtr mDerivedSceneColour; 00384 // Ambient light colour parameter. 00385 UniformParameterPtr mLightAmbientColour; 00386 // Derived ambient light colour parameter. 00387 UniformParameterPtr mDerivedAmbientLightColour; 00388 // Surface ambient colour parameter. 00389 UniformParameterPtr mSurfaceAmbientColour; 00390 // Surface diffuse colour parameter. 00391 UniformParameterPtr mSurfaceDiffuseColour; 00392 // Surface specular colour parameter. 00393 UniformParameterPtr mSurfaceSpecularColour; 00394 // Surface emissive colour parameter. 00395 UniformParameterPtr mSurfaceEmissiveColour; 00396 // Surface shininess parameter. 00397 UniformParameterPtr mSurfaceShininess; 00398 // Shared blank light. 00399 static Light msBlankLight; 00400 }; 00401 00402 00407 class _OgreRTSSExport NormalMapLightingFactory : public SubRenderStateFactory 00408 { 00409 public: 00410 00414 virtual const String& getType() const; 00415 00419 virtual SubRenderState* createInstance(ScriptCompiler* compiler, PropertyAbstractNode* prop, Pass* pass, SGScriptTranslator* translator); 00420 00424 virtual void writeInstance(MaterialSerializer* ser, SubRenderState* subRenderState, Pass* srcPass, Pass* dstPass); 00425 00426 00427 protected: 00428 00432 virtual SubRenderState* createInstanceImpl(); 00433 00434 00435 }; 00436 00440 } 00441 } 00442 00443 #endif 00444 #endif 00445
Copyright © 2012 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Sun Sep 2 2012 07:27:23