Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Renderer::SetBatchShaders(Batch& batch, Technique* tech, bool allowShadows)
- {
- // Check if shaders are unloaded or need reloading
- Pass* pass = batch.pass_;
- Vector<SharedPtr<ShaderVariation> >& vertexShaders = pass->GetVertexShaders();
- Vector<SharedPtr<ShaderVariation> >& pixelShaders = pass->GetPixelShaders();
- Vector<SharedPtr<ShaderVariation> >& geometryShaders = pass->GetGeometryShaders();
- if (!vertexShaders.Size() || !pixelShaders.Size() || pass->GetShadersLoadedFrameNumber() != shadersChangedFrameNumber_)
- {
- // First release all previous shaders, then load
- pass->ReleaseShaders();
- LoadPassShaders(pass);
- }
- // Make sure shaders are loaded now
- if (vertexShaders.Size() && pixelShaders.Size())
- {
- bool heightFog = batch.zone_ && batch.zone_->GetHeightFog();
- // If instancing is not supported, but was requested, choose static geometry vertex shader instead
- if (batch.geometryType_ == GEOM_INSTANCED && !GetDynamicInstancing())
- batch.geometryType_ = GEOM_STATIC;
- if (batch.geometryType_ == GEOM_STATIC_NOINSTANCING)
- batch.geometryType_ = GEOM_STATIC;
- // Check whether is a pixel lit forward pass. If not, there is only one pixel shader
- if (pass->GetLightingMode() == LIGHTING_PERPIXEL)
- {
- LightBatchQueue* lightQueue = batch.lightQueue_;
- if (!lightQueue)
- {
- // Do not log error, as it would result in a lot of spam
- batch.vertexShader_ = 0;
- batch.pixelShader_ = 0;
- batch.geometryShader_ = 0;
- return;
- }
- Light* light = lightQueue->light_;
- unsigned vsi = 0;
- unsigned psi = 0;
- unsigned gsi = 0;
- vsi = batch.geometryType_ * MAX_LIGHT_VS_VARIATIONS;
- gsi = batch.geometryType_ * MAX_LIGHT_GS_VARIATIONS;
- bool materialHasSpecular = batch.material_ ? batch.material_->GetSpecular() : true;
- if (specularLighting_ && light->GetSpecularIntensity() > 0.0f && materialHasSpecular)
- psi += LPS_SPEC;
- if (allowShadows && lightQueue->shadowMap_)
- {
- if (light->GetShadowBias().normalOffset_ > 0.0f)
- {
- vsi += LVS_SHADOWNORMALOFFSET;
- gsi += LGS_SHADOWNORMALOFFSET;
- }
- else
- {
- vsi += LVS_SHADOW;
- gsi += LGS_SHADOW;
- }
- psi += LPS_SHADOW;
- }
- switch (light->GetLightType())
- {
- case LIGHT_DIRECTIONAL:
- vsi += LVS_DIR;
- gsi += LGS_DIR;
- break;
- case LIGHT_SPOT:
- psi += LPS_SPOT;
- vsi += LVS_SPOT;
- gsi += LGS_SPOT;
- break;
- case LIGHT_POINT:
- if (light->GetShapeTexture())
- psi += LPS_POINTMASK;
- else
- psi += LPS_POINT;
- vsi += LVS_POINT;
- gsi += LGS_POINT;
- break;
- }
- if (heightFog)
- psi += MAX_LIGHT_PS_VARIATIONS;
- batch.vertexShader_ = vertexShaders[vsi];
- batch.pixelShader_ = pixelShaders[psi];
- //batch.geometryShader_ = geometryShaders.Size() > 0 ? geometryShaders[gsi] : (ShaderVariation*)0;
- batch.geometryShader_ = geometryShaders[gsi];
- }
- else
- {
- // Check if pass has vertex lighting support
- if (pass->GetLightingMode() == LIGHTING_PERVERTEX)
- {
- unsigned numVertexLights = 0;
- if (batch.lightQueue_)
- numVertexLights = batch.lightQueue_->vertexLights_.Size();
- unsigned vsi = batch.geometryType_ * MAX_VERTEXLIGHT_VS_VARIATIONS + numVertexLights;
- unsigned gsi = batch.geometryType_ * MAX_VERTEXLIGHT_GS_VARIATIONS + numVertexLights;
- batch.vertexShader_ = vertexShaders[vsi];
- //batch.geometryShader_ = geometryShaders.Size() > 0 ? geometryShaders[gsi] : (ShaderVariation*)0;
- batch.geometryShader_ = geometryShaders[gsi];
- }
- else
- {
- unsigned vsi = batch.geometryType_;
- unsigned gsi = batch.geometryType_;
- batch.vertexShader_ = vertexShaders[vsi];
- //batch.geometryShader_ = geometryShaders.Size() > 0 ? geometryShaders[gsi] : (ShaderVariation*)0;
- batch.geometryShader_ = geometryShaders[gsi];
- }
- batch.pixelShader_ = pixelShaders[heightFog ? 1 : 0];
- }
- }
- // Log error if shaders could not be assigned, but only once per technique
- if (!batch.vertexShader_ || !batch.pixelShader_)
- {
- if (!shaderErrorDisplayed_.Contains(tech))
- {
- shaderErrorDisplayed_.Insert(tech);
- URHO3D_LOGERROR("Technique " + tech->GetName() + " has missing shaders");
- }
- }
- }
Add Comment
Please, Sign In to add comment