virtual Ogre::GpuProgramPtr generateFragmentShader(Perm permutation) { /// Create shader if (mMasterSource.empty()) { Ogre::DataStreamPtr ptrMasterSource; if(Ogre::GpuProgramManager::getSingleton().isSyntaxSupported("glsles")) ptrMasterSource = Ogre::ResourceGroupManager::getSingleton().openResource("DeferredShading/post/LightMaterial_ps.glsles", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); else ptrMasterSource = Ogre::ResourceGroupManager::getSingleton().openResource("DeferredShading/post/LightMaterial_ps.glsl", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); assert(ptrMasterSource.isNull()==false); mMasterSource = ptrMasterSource->getAsString(); } assert(mMasterSource.empty()==false); // Create name Ogre::String name = mBaseName+Ogre::StringConverter::toString(permutation)+"_ps"; // Create shader object Ogre::HighLevelGpuProgramPtr ptrProgram; if(Ogre::GpuProgramManager::getSingleton().isSyntaxSupported("glsles")) { ptrProgram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram(name, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsles", Ogre::GPT_FRAGMENT_PROGRAM); ptrProgram->setParameter("profiles", "glsles"); } else { ptrProgram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram(name, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); ptrProgram->setParameter("profiles", "glsl150"); } ptrProgram->setSource(mMasterSource); // set up the preprocessor defines // Important to do this before any call to get parameters, i.e. before the program gets loaded ptrProgram->setParameter("preprocessor_defines", getPPDefines(permutation)); setUpBaseParameters(ptrProgram->getDefaultParameters()); // Bind samplers Ogre::GpuProgramParametersSharedPtr params = ptrProgram->getDefaultParameters(); int numSamplers = 0; params->setNamedConstant("Tex0", (int)numSamplers++); params->setNamedConstant("Tex1", (int)numSamplers++); if(permutation & LightMaterialGenerator::MI_SHADOW_CASTER) params->setNamedConstant("ShadowTex", (int)numSamplers++); return Ogre::GpuProgramPtr(ptrProgram); }
virtual Ogre::GpuProgramPtr generateFragmentShader(Perm permutation) { /// Create shader if (mMasterSource.empty()) { Ogre::DataStreamPtr ptrMasterSource = Ogre::ResourceGroupManager::getSingleton().openResource( "DeferredShading/post/LightMaterial_ps.cg" , Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); assert(ptrMasterSource.isNull()==false); mMasterSource = ptrMasterSource->getAsString(); } assert(mMasterSource.empty()==false); // Create name Ogre::String name = mBaseName+Ogre::StringConverter::toString(permutation)+"_ps"; // Create shader object Ogre::HighLevelGpuProgramPtr ptrProgram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram( name, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", Ogre::GPT_FRAGMENT_PROGRAM); ptrProgram->setSource(mMasterSource); ptrProgram->setParameter("entry_point","main"); ptrProgram->setParameter("profiles","ps_2_x arbfp1"); // set up the preprocessor defines // Important to do this before any call to get parameters, i.e. before the program gets loaded ptrProgram->setParameter("compile_arguments", getPPDefines(permutation)); setUpBaseParameters(ptrProgram->getDefaultParameters()); return Ogre::GpuProgramPtr(ptrProgram); }
void WaterMaterialGenerator::vertexProgramParams(Ogre::HighLevelGpuProgramPtr program) { GpuProgramParametersSharedPtr params = program->getDefaultParameters(); params->setIgnoreMissingParams(true); params->setNamedAutoConstant("wMat", GpuProgramParameters::ACT_WORLD_MATRIX); params->setNamedAutoConstant("wvpMat", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); params->setNamedAutoConstant("fogParams", GpuProgramParameters::ACT_FOG_PARAMS); individualVertexProgramParams(params); }
void WaterMaterialGenerator::fragmentProgramParams(Ogre::HighLevelGpuProgramPtr program) { GpuProgramParametersSharedPtr params = program->getDefaultParameters(); params->setIgnoreMissingParams(true); params->setNamedAutoConstant("iTWMat", GpuProgramParameters::ACT_INVERSE_TRANSPOSE_WORLD_MATRIX); params->setNamedAutoConstant("fogColor", GpuProgramParameters::ACT_FOG_COLOUR); params->setNamedAutoConstant("lightSpec0", GpuProgramParameters::ACT_LIGHT_SPECULAR_COLOUR, 0); params->setNamedAutoConstant("lightPos0", GpuProgramParameters::ACT_LIGHT_POSITION, 0); params->setNamedAutoConstant("camPos", GpuProgramParameters::ACT_CAMERA_POSITION); params->setNamedAutoConstant("time", GpuProgramParameters::ACT_TIME); params->setNamedAutoConstant("ambient", GpuProgramParameters::ACT_AMBIENT_LIGHT_COLOUR); params->setNamedAutoConstant("lightDiff", GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR, 0); params->setNamedAutoConstant("inverseProjection", GpuProgramParameters::ACT_RENDER_TARGET_FLIPPING); params->setNamedConstantFromTime("time", 1); individualFragmentProgramParams(params); }
Ogre::GpuProgramPtr GBufferMaterialGeneratorImpl::generateVertexShader(MaterialGenerator::Perm permutation) { Ogre::StringStream ss; ss << "void ToGBufferVP(" << std::endl; ss << " float4 iPosition : POSITION," << std::endl; ss << " float3 iNormal : NORMAL," << std::endl; Ogre::uint32 numTexCoords = (permutation & GBufferMaterialGenerator::GBP_TEXCOORD_MASK) >> 8; for (Ogre::uint32 i=0; i<numTexCoords; i++) { ss << " float2 iUV" << i << " : TEXCOORD" << i << ',' << std::endl; } if (permutation & GBufferMaterialGenerator::GBP_NORMAL_MAP) { ss << " float3 iTangent : TANGENT0," << std::endl; } //TODO : Skinning inputs ss << std::endl; ss << " out float4 oPosition : POSITION," << std::endl; #ifdef WRITE_LINEAR_DEPTH ss << " out float3 oViewPos : TEXCOORD0," << std::endl; #else ss << " out float oDepth : TEXCOORD0," << std::endl; #endif ss << " out float3 oNormal : TEXCOORD1," << std::endl; int texCoordNum = 2; if (permutation & GBufferMaterialGenerator::GBP_NORMAL_MAP) { ss << " out float3 oTangent : TEXCOORD" << texCoordNum++ << ',' << std::endl; ss << " out float3 oBiNormal : TEXCOORD" << texCoordNum++ << ',' << std::endl; } for (Ogre::uint32 i=0; i<numTexCoords; i++) { ss << " out float2 oUV" << i << " : TEXCOORD" << texCoordNum++ << ',' << std::endl; } ss << std::endl; ss << " uniform float4x4 cWorldViewProj," << std::endl; ss << " uniform float4x4 cWorldView" << std::endl; ss << " )" << std::endl; ss << "{" << std::endl; ss << " oPosition = mul(cWorldViewProj, iPosition);" << std::endl; ss << " oNormal = mul(cWorldView, float4(iNormal,0)).xyz;" << std::endl; if (permutation & GBufferMaterialGenerator::GBP_NORMAL_MAP) { ss << " oTangent = mul(cWorldView, float4(iTangent,0)).xyz;" << std::endl; ss << " oBiNormal = cross(oNormal, oTangent);" << std::endl; } #ifdef WRITE_LINEAR_DEPTH ss << " oViewPos = mul(cWorldView, iPosition).xyz;" << std::endl; #else ss << " oDepth = oPosition.w;" << std::endl; #endif for (Ogre::uint32 i=0; i<numTexCoords; i++) { ss << " oUV" << i << " = iUV" << i << ';' << std::endl; } ss << "}" << std::endl; Ogre::String programSource = ss.str(); Ogre::String programName = mBaseName + "VP_" + Ogre::StringConverter::toString(permutation); #if OGRE_DEBUG_MODE Ogre::LogManager::getSingleton().getDefaultLog()->logMessage(programSource); #endif // Create shader object Ogre::HighLevelGpuProgramPtr ptrProgram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram( programName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", Ogre::GPT_VERTEX_PROGRAM); ptrProgram->setSource(programSource); ptrProgram->setParameter("entry_point","ToGBufferVP"); ptrProgram->setParameter("profiles","vs_1_1 arbvp1"); const Ogre::GpuProgramParametersSharedPtr& params = ptrProgram->getDefaultParameters(); params->setNamedAutoConstant("cWorldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); params->setNamedAutoConstant("cWorldView", Ogre::GpuProgramParameters::ACT_WORLDVIEW_MATRIX); ptrProgram->load(); return Ogre::GpuProgramPtr(ptrProgram); }
Ogre::GpuProgramPtr GBufferMaterialGeneratorImpl::generateFragmentShader(MaterialGenerator::Perm permutation) { Ogre::StringStream ss; ss << "void ToGBufferFP(" << std::endl; #ifdef WRITE_LINEAR_DEPTH ss << " float3 iViewPos : TEXCOORD0," << std::endl; #else ss << " float1 iDepth : TEXCOORD0," << std::endl; #endif ss << " float3 iNormal : TEXCOORD1," << std::endl; int texCoordNum = 2; if (permutation & GBufferMaterialGenerator::GBP_NORMAL_MAP) { ss << " float3 iTangent : TEXCOORD" << texCoordNum++ << ',' << std::endl; ss << " float3 iBiNormal : TEXCOORD" << texCoordNum++ << ',' << std::endl; } Ogre::uint32 numTexCoords = (permutation & GBufferMaterialGenerator::GBP_TEXCOORD_MASK) >> 8; for (Ogre::uint32 i=0; i<numTexCoords; i++) { ss << " float2 iUV" << i << " : TEXCOORD" << texCoordNum++ << ',' << std::endl; } ss << std::endl; ss << " out float4 oColor0 : COLOR0," << std::endl; ss << " out float4 oColor1 : COLOR1," << std::endl; ss << std::endl; int samplerNum = 0; if (permutation & GBufferMaterialGenerator::GBP_NORMAL_MAP) { ss << " uniform sampler sNormalMap : register(s" << samplerNum++ << ")," << std::endl; } Ogre::uint32 numTextures = permutation & GBufferMaterialGenerator::GBP_TEXTURE_MASK; for (Ogre::uint32 i=0; i<numTextures; i++) { ss << " uniform sampler sTex" << i << " : register(s" << samplerNum++ << ")," << std::endl; } if (numTextures == 0 || permutation & GBufferMaterialGenerator::GBP_HAS_DIFFUSE_COLOUR) { ss << " uniform float4 cDiffuseColour," << std::endl; } #ifdef WRITE_LINEAR_DEPTH ss << " uniform float cFarDistance," << std::endl; #endif ss << " uniform float cSpecularity" << std::endl; ss << " )" << std::endl; ss << "{" << std::endl; if (numTexCoords > 0 && numTextures > 0) { ss << " oColor0.rgb = tex2D(sTex0, iUV0);" << std::endl; if (permutation & GBufferMaterialGenerator::GBP_HAS_DIFFUSE_COLOUR) { ss << " oColor0.rgb *= cDiffuseColour.rgb;" << std::endl; } } else { ss << " oColor0.rgb = cDiffuseColour.rgb;" << std::endl; } ss << " oColor0.a = cSpecularity;" << std::endl; if (permutation & GBufferMaterialGenerator::GBP_NORMAL_MAP) { ss << " float3 texNormal = (tex2D(sNormalMap, iUV0)-0.5)*2;" << std::endl; ss << " float3x3 normalRotation = float3x3(iTangent, iBiNormal, iNormal);" << std::endl; ss << " oColor1.rgb = normalize(mul(texNormal, normalRotation));" << std::endl; } else { ss << " oColor1.rgb = normalize(iNormal);" << std::endl; } #ifdef WRITE_LINEAR_DEPTH ss << " oColor1.a = length(iViewPos) / cFarDistance;" << std::endl; #else ss << " oColor1.a = iDepth;" << std::endl; #endif ss << "}" << std::endl; Ogre::String programSource = ss.str(); Ogre::String programName = mBaseName + "FP_" + Ogre::StringConverter::toString(permutation); #if OGRE_DEBUG_MODE Ogre::LogManager::getSingleton().getDefaultLog()->logMessage(programSource); #endif // Create shader object Ogre::HighLevelGpuProgramPtr ptrProgram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram( programName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", Ogre::GPT_FRAGMENT_PROGRAM); ptrProgram->setSource(programSource); ptrProgram->setParameter("entry_point","ToGBufferFP"); ptrProgram->setParameter("profiles","ps_2_0 arbfp1"); const Ogre::GpuProgramParametersSharedPtr& params = ptrProgram->getDefaultParameters(); params->setNamedAutoConstant("cSpecularity", Ogre::GpuProgramParameters::ACT_SURFACE_SHININESS); if (numTextures == 0 || permutation & GBufferMaterialGenerator::GBP_HAS_DIFFUSE_COLOUR) { params->setNamedAutoConstant("cDiffuseColour", Ogre::GpuProgramParameters::ACT_SURFACE_DIFFUSE_COLOUR); } #ifdef WRITE_LINEAR_DEPTH //TODO : Should this be the distance to the far corner, not the far clip distance? params->setNamedAutoConstant("cFarDistance", Ogre::GpuProgramParameters::ACT_FAR_CLIP_DISTANCE); #endif ptrProgram->load(); return Ogre::GpuProgramPtr(ptrProgram); }
Ogre::GpuProgramPtr GBufferMaterialGeneratorImpl::generateVertexShader(MaterialGenerator::Perm permutation) { Ogre::StringStream ss; if(mIsGLSL) { int shadingLangVersion = Ogre::Root::getSingleton().getRenderSystem()->getNativeShadingLanguageVersion(); const char *inSemantic = shadingLangVersion >= 150 ? "in" : "attribute"; const char *outSemantic = shadingLangVersion >= 150 ? "out" : "varying"; if(Ogre::GpuProgramManager::getSingleton().isSyntaxSupported("glsles")) { ss << "#version 300 es" << std::endl; ss << "precision mediump int;" << std::endl; ss << "precision mediump float;" << std::endl; } else ss << "#version " << shadingLangVersion << std::endl; ss << inSemantic << " vec4 vertex;" << std::endl; ss << inSemantic << " vec3 normal;" << std::endl; Ogre::uint32 numTexCoords = (permutation & GBufferMaterialGenerator::GBP_TEXCOORD_MASK) >> 8; for (Ogre::uint32 i = 0; i < numTexCoords; i++) { ss << inSemantic << " vec2 uv" << i << ';' << std::endl; } if (permutation & GBufferMaterialGenerator::GBP_NORMAL_MAP) { ss << inSemantic << " vec3 tangent;" << std::endl; } //TODO : Skinning inputs ss << std::endl; #ifdef WRITE_LINEAR_DEPTH ss << outSemantic << " vec3 oViewPos;" << std::endl; #else ss << outSemantic << " float oDepth;" << std::endl; #endif ss << outSemantic << " vec3 oNormal;" << std::endl; if (permutation & GBufferMaterialGenerator::GBP_NORMAL_MAP) { ss << outSemantic << " vec3 oTangent;" << std::endl; ss << outSemantic << " vec3 oBiNormal;" << std::endl; } for (Ogre::uint32 i = 0; i < numTexCoords; i++) { ss << outSemantic << " vec2 oUv" << i << ";" << std::endl; } ss << std::endl; ss << "uniform mat4 cWorldViewProj;" << std::endl; ss << "uniform mat4 cWorldView;" << std::endl; ss << "void main()" << std::endl; ss << "{" << std::endl; ss << " gl_Position = cWorldViewProj * vertex;" << std::endl; ss << " oNormal = (cWorldView * vec4(normal,0)).xyz;" << std::endl; if (permutation & GBufferMaterialGenerator::GBP_NORMAL_MAP) { ss << " oTangent = (cWorldView * vec4(tangent,0)).xyz;" << std::endl; ss << " oBiNormal = cross(oNormal, oTangent);" << std::endl; } #ifdef WRITE_LINEAR_DEPTH ss << " oViewPos = (cWorldView * vertex).xyz;" << std::endl; #else ss << " oDepth = gl_Position.w;" << std::endl; #endif for (Ogre::uint32 i=0; i<numTexCoords; i++) { ss << " oUv" << i << " = uv" << i << ';' << std::endl; } ss << "}" << std::endl; Ogre::String programSource = ss.str(); Ogre::String programName = mBaseName + "VP_" + Ogre::StringConverter::toString(permutation); #if OGRE_DEBUG_MODE Ogre::LogManager::getSingleton().getDefaultLog()->logMessage(programSource); #endif // Create shader object Ogre::HighLevelGpuProgramPtr ptrProgram; if(Ogre::GpuProgramManager::getSingleton().isSyntaxSupported("glsles")) { ptrProgram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram(programName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsles", Ogre::GPT_VERTEX_PROGRAM); ptrProgram->setParameter("syntax", "glsles"); } else { ptrProgram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram(programName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); } ptrProgram->setSource(programSource); const Ogre::GpuProgramParametersSharedPtr& params = ptrProgram->getDefaultParameters(); params->setNamedAutoConstant("cWorldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); params->setNamedAutoConstant("cWorldView", Ogre::GpuProgramParameters::ACT_WORLDVIEW_MATRIX); ptrProgram->load(); return Ogre::GpuProgramPtr(ptrProgram); } else {