/** * Get the edge filtering mode. * @return the edge filtering mode. */ public EdgeFilteringMode getEdgeFilteringMode() { return shadowRenderer.getEdgeFilteringMode(); }
/** * returns the edges thickness <br> * * @see #setEdgesThickness(int edgesThickness) * @return edgesThickness */ public int getEdgesThickness() { return shadowRenderer.getEdgesThickness(); }
/** * Get the pre-shadows pass render state. * use it to adjust the RenderState parameters of the pre shadow pass. * Note that this will be overridden if the preShadow technique in the material has a ForcedRenderState * @return the pre shadow render state. */ public RenderState getPreShadowForcedRenderState() { return shadowRenderer.getPreShadowForcedRenderState(); }
displayShadowMap(renderManager.getRenderer()); getReceivers(lightReceivers); setMatParams(lightReceivers); clearMatParams();
@SuppressWarnings("fallthrough") public void postQueue(RenderQueue rq) { lightReceivers.clear(); skipPostPass = false; if ( !checkCulling(viewPort.getCamera()) ) { skipPostPass = true; return; } updateShadowCams(viewPort.getCamera()); Renderer r = renderManager.getRenderer(); renderManager.setForcedMaterial(preshadowMat); renderManager.setForcedTechnique("PreShadow"); for (int shadowMapIndex = 0; shadowMapIndex < nbShadowMaps; shadowMapIndex++) { if (debugfrustums) { doDisplayFrustumDebug(shadowMapIndex); } renderShadowMap(shadowMapIndex); } debugfrustums = false; //restore setting for future rendering r.setFrameBuffer(viewPort.getOutputFrameBuffer()); renderManager.setForcedMaterial(null); renderManager.setForcedTechnique(null); renderManager.setCamera(viewPort.getCamera(), false); }
private void setMatParams(GeometryList l) { //iteration throught all the geometries of the list to gather the materials buildMatCache(l); //iterating through the mat cache and setting the parameters for (Material mat : matCache) { mat.setFloat("ShadowMapSize", shadowMapSize); for (int j = 0; j < nbShadowMaps; j++) { mat.setMatrix4(lightViewStringCache[j], lightViewProjectionsMatrices[j]); } for (int j = 0; j < nbShadowMaps; j++) { mat.setTexture(shadowMapStringCache[j], shadowMaps[j]); } mat.setBoolean("HardwareShadows", shadowCompareMode == CompareMode.Hardware); mat.setInt("FilterMode", edgeFilteringMode.getMaterialParamValue()); mat.setFloat("PCFEdge", edgesThickness); mat.setFloat("ShadowIntensity", shadowIntensity); mat.setBoolean("BackfaceShadows", renderBackFacesShadows); if (fadeInfo != null) { mat.setVector2("FadeInfo", fadeInfo); } setMaterialParameters(mat); } //At least one material of the receiving geoms does not support the post shadow techniques //so we fall back to the forced material solution (transparent shadows won't be supported for these objects) if (needsfallBackMaterial) { setPostShadowParams(); } }
protected void renderShadowMap(int shadowMapIndex) { shadowMapOccluders = getOccludersToRender(shadowMapIndex, shadowMapOccluders); Camera shadowCam = getShadowCam(shadowMapIndex); //saving light view projection matrix for this split lightViewProjectionsMatrices[shadowMapIndex].set(shadowCam.getViewProjectionMatrix()); renderManager.setCamera(shadowCam, false); renderManager.getRenderer().setFrameBuffer(shadowFB[shadowMapIndex]); renderManager.getRenderer().clearBuffers(true, true, true); renderManager.setForcedRenderState(forcedRenderState); // render shadow casters to shadow map viewPort.getQueue().renderShadowQueue(shadowMapOccluders, renderManager, shadowCam, true); renderManager.setForcedRenderState(null); } boolean debugfrustums = false;
private void clearMatParams(){ for (Material mat : matCache) { //clearing only necessary params, the others may be set by other //renderers //Note that j start at 1 because other shadow renderers will have //at least 1 shadow map and will set it on each frame anyway. for (int j = 1; j < nbShadowMaps; j++) { mat.clearParam(lightViewStringCache[j]); } for (int j = 1; j < nbShadowMaps; j++) { mat.clearParam(shadowMapStringCache[j]); } mat.clearParam("FadeInfo"); clearMaterialParameters(mat); } //No need to clear the postShadowMat params as the instance is locale to each renderer }
/** * Set to true if you want back faces shadows on geometries. * Note that back faces shadows will be blended over dark lighten areas and may produce overly dark lighting. * * Also note that setting this parameter will override this parameter for ALL materials in the scene. * You can alternatively change this parameter on a single material using {@link Material#setBoolean(String, boolean)} * * This also will automatically adjust the faceCullMode and the PolyOffset of the pre shadow pass. * You can modify them by using {@link #getPreShadowForcedRenderState()} * * @param renderBackFacesShadows true or false. */ public void setRenderBackFacesShadows(Boolean renderBackFacesShadows) { this.renderBackFacesShadows = renderBackFacesShadows; if(renderBackFacesShadows) { getPreShadowForcedRenderState().setPolyOffset(5, 3); getPreShadowForcedRenderState().setFaceCullMode(RenderState.FaceCullMode.Back); }else{ getPreShadowForcedRenderState().setPolyOffset(0, 0); getPreShadowForcedRenderState().setFaceCullMode(RenderState.FaceCullMode.Front); } }