GFXShader* ShaderData::_createShader( const Vector<GFXShaderMacro> ¯os ) { F32 pixver = mPixVersion; if ( mUseDevicePixVersion ) pixver = getMax( pixver, GFX->getPixelShaderVersion() ); // Enable shader error logging. GFXShader::setLogging( true, true ); GFXShader *shader = GFX->createShader(); bool success = false; Vector<String> samplers; samplers.setSize(ShaderData::NumTextures); for(int i = 0; i < ShaderData::NumTextures; ++i) samplers[i] = mSamplerNames[i][0] == '$' ? mSamplerNames[i] : "$"+mSamplerNames[i]; // Initialize the right shader type. switch( GFX->getAdapterType() ) { case Direct3D9_360: case Direct3D9: case Direct3D11: { success = shader->init( mDXVertexShaderName, mDXPixelShaderName, pixver, macros, samplers); break; } case OpenGL: { success = shader->init( mOGLVertexShaderName, mOGLPixelShaderName, pixver, macros, samplers); break; } default: // Other device types are assumed to not support shaders. success = false; break; } #if defined(TORQUE_DEBUG) //Assert Sampler registers const Vector<GFXShaderConstDesc>& descs = shader->getShaderConstDesc(); for(int i = 0; i < descs.size(); ++i) { if(descs[i].constType != GFXSCT_Sampler && descs[i].constType != GFXSCT_SamplerCube) continue; GFXShaderConstHandle *handle = shader->findShaderConstHandle(descs[i].name); if(!handle || !handle->isValid()) continue; int reg = handle->getSamplerRegister(); if( descs[i].name != samplers[reg] ) { const char *err = avar("ShaderData(%s): samplerNames[%d] = \"%s\" are diferent to sampler in shader: %s : register(S%d)" ,getName(), reg, samplers[reg].c_str(), handle->getName().c_str(), reg); Con::printf(err); GFXAssertFatal(0, err); } } #endif // If we failed to load the shader then // cleanup and return NULL. if ( !success ) SAFE_DELETE( shader ); return shader; }
void ProcessedCustomMaterial::setTextureStages( SceneRenderState *state, const SceneData &sgData, U32 pass ) { LightManager* lm = state ? LIGHTMGR : NULL; ShaderRenderPassData* rpd = _getRPD(pass); ShaderConstHandles* handles = _getShaderConstHandles(pass); GFXShaderConstBuffer* shaderConsts = _getShaderConstBuffer(pass); const NamedTexTarget *texTarget; GFXTextureObject *texObject; for( U32 i=0; i<mMaxTex; i++ ) { U32 currTexFlag = rpd->mTexType[i]; if ( !lm || !lm->setTextureStage(sgData, currTexFlag, i, shaderConsts, handles ) ) { GFXShaderConstHandle* handle = handles->mTexHandlesSC[i]; if ( !handle->isValid() ) continue; S32 samplerRegister = handle->getSamplerRegister(); switch( currTexFlag ) { case 0: default: break; case Material::Mask: case Material::Standard: case Material::Bump: case Material::Detail: { GFX->setTexture( samplerRegister, rpd->mTexSlot[i].texObject ); break; } case Material::Lightmap: { GFX->setTexture( samplerRegister, sgData.lightmap ); break; } case Material::Cube: { GFX->setCubeTexture( samplerRegister, rpd->mCubeMap ); break; } case Material::SGCube: { GFX->setCubeTexture( samplerRegister, sgData.cubemap ); break; } case Material::BackBuff: { GFX->setTexture( samplerRegister, sgData.backBuffTex ); //if ( sgData.reflectTex ) // GFX->setTexture( samplerRegister, sgData.reflectTex ); //else //{ // GFXTextureObject *refractTex = REFLECTMGR->getRefractTex( true ); // GFX->setTexture( samplerRegister, refractTex ); //} break; } case Material::ReflectBuff: { GFX->setTexture( samplerRegister, sgData.reflectTex ); break; } case Material::Misc: { GFX->setTexture( samplerRegister, sgData.miscTex ); break; } case Material::TexTarget: { texTarget = rpd->mTexSlot[i].texTarget; if ( !texTarget ) { GFX->setTexture( samplerRegister, NULL ); break; } texObject = texTarget->getTexture(); // If no texture is available then map the default 2x2 // black texture to it. This at least will ensure that // we get consistant behavior across GPUs and platforms. if ( !texObject ) texObject = GFXTexHandle::ZERO; if ( handles->mRTParamsSC[samplerRegister]->isValid() && texObject ) { const Point3I &targetSz = texObject->getSize(); const RectI &targetVp = texTarget->getViewport(); Point4F rtParams; ScreenSpace::RenderTargetParameters(targetSz, targetVp, rtParams); shaderConsts->set(handles->mRTParamsSC[samplerRegister], rtParams); } GFX->setTexture( samplerRegister, texObject ); break; } } } } }