@zzuegg I tried createPostView and createMainView, both had the same result.
@nehon Keep in mind it’s kinda messy and mostly experimental. Here’s the most relevant code portions:
PostQueue:
@Override
protected void postQueue(RenderQueue queue) {
if (lightBuffer == null) {
createLightBuffer();
}
//Render the normal map
Renderer r = renderManager.getRenderer();
r.setFrameBuffer(normalPass.getRenderFrameBuffer());
renderManager.getRenderer().clearBuffers(true, true, true);
renderManager.setForcedTechnique("CustomNormalPass");
renderManager.renderViewPortQueues(viewPort, false);
//Render the specular map
r.setFrameBuffer(specularPass.getRenderFrameBuffer());
renderManager.getRenderer().clearBuffers(true, true, true);
renderManager.setForcedTechnique("SpecularPass");
renderManager.renderViewPortQueues(viewPort, false);
//Restore default viewport and technique
renderManager.setForcedTechnique(null);
renderManager.getRenderer().setFrameBuffer(viewPort.getOutputFrameBuffer());
}
PostFrame:
protected void postFrame(RenderManager renderManager, ViewPort viewPort, FrameBuffer prevFilterBuffer, FrameBuffer sceneBuffer) {
for (Spatial child : lightNode.getChildren()) {
Light light = (Light) child;
if (!light.getIsMaterialConfigured()) {
// light.setMaterialConfigured(true);
light.getMaterial().setColor("LightColor", light.getColor());
light.getMaterial().setTexture("DepthTexture", normalPass.getDepthTexture());
light.getMaterial().setTexture("NormalTexture", normalPass.getRenderedTexture());
light.getMaterial().setTexture("SpecularTexture", specularPass.getRenderedTexture());
light.getMaterial().setMatrix4("InverseViewProjectionMatrix", lightViewPort.getCamera().getViewProjectionMatrix().invert());
// light.getMaterial().setVector3("CameraDirection", viewPort.getCamera().getDirection());
light.getMaterial().setVector3("CameraPosition", viewPort.getCamera().getLocation());
light.getMaterial().setVector2("Resolution", new Vector2f(screenWidth, screenHeight));
light.getMaterial().setVector3("FrustumCorner", frustumCorner);
light.getMaterial().setVector2("FrustumNearFar", frustumNearFar);
if (light instanceof PointLight) {
light.getMaterial().getAdditionalRenderState().setFaceCullMode(viewPort.getCamera().getLocation().distance(((PointLight) light).getPosition()) > light.getLocalScale().x + viewPort.getCamera().getFrustumNear() ? FaceCullMode.Back : FaceCullMode.Front);
light.getMaterial().getAdditionalRenderState().setDepthTest(viewPort.getCamera().getLocation().distance(((PointLight) light).getPosition()) > light.getLocalScale().x + viewPort.getCamera().getFrustumNear());
light.getMaterial().setFloat("Radius", ((PointLight) light).getRadius());
light.getMaterial().setVector3("LightPosition", ((PointLight) light).getPosition());
light.getMaterial().setFloat("SpecularMult", ((PointLight) light).getPosition().distance(viewPort.getCamera().getLocation()) > settings.getLightRange() * 2.0F ? 0.0F : 1.0F);
} else if (light instanceof SpotLight) {
light.getMaterial().getAdditionalRenderState().setFaceCullMode(viewPort.getCamera().getLocation().distance(((SpotLight) light).getPosition()) > light.getLocalScale().x + viewPort.getCamera().getFrustumNear() ? FaceCullMode.Back : FaceCullMode.Front);
light.getMaterial().getAdditionalRenderState().setDepthTest(viewPort.getCamera().getLocation().distance(((SpotLight) light).getPosition()) > light.getLocalScale().x + viewPort.getCamera().getFrustumNear());
light.getMaterial().setFloat("Range", ((SpotLight) light).getRange());
light.getMaterial().setVector3("LightPosition", ((SpotLight) light).getPosition());
light.getMaterial().setVector3("LightDirection", ((SpotLight) light).getDirection());
light.getMaterial().setFloat("SpecularMult", ((SpotLight) light).getPosition().distance(viewPort.getCamera().getLocation()) > settings.getLightRange() * 2.0F ? 0.0F : 1.0F);
light.getMaterial().setFloat("InnerLimit", FastMath.cos(((SpotLight) light).getInnerLimit() * FastMath.DEG_TO_RAD * 0.5F));
light.getMaterial().setFloat("OuterLimit", FastMath.cos(((SpotLight) light).getOuterLimit() * FastMath.DEG_TO_RAD * 0.5F)); //Fix to only calculate these once instead of every frame
} else if (light instanceof DirectionalLight) {
// light.setLocalTranslation(cam.getLocation());
light.getMaterial().setVector3("LightDirection", ((DirectionalLight) light).getDirection());
//light.getMaterial().setTexture("LightDepth", ((DirectionalLight) light).getShadowDepthMap();
}
}
}
InitFilter:
@Override
protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
this.manager = manager;
this.renderManager = renderManager;
this.viewPort = vp;
this.screenWidth = w;
this.screenHeight = h;
postRenderPasses = new ArrayList();
normalPass = new Pass();
normalPass.init(renderManager.getRenderer(), w, h, Image.Format.RGBA8, Image.Format.Depth, 1, true);
normalPass.getRenderedTexture().setMagFilter(Texture.MagFilter.Nearest);
normalPass.getRenderedTexture().setMinFilter(Texture.MinFilter.NearestNoMipMaps);
specularPass = new Pass();
specularPass.init(renderManager.getRenderer(), w, h, Image.Format.Luminance8Alpha8, Image.Format.Depth);
specularPass.getRenderedTexture().setMagFilter(Texture.MagFilter.Nearest);
specularPass.getRenderedTexture().setMinFilter(Texture.MinFilter.NearestNoMipMaps);
material = new Material(manager, "MatDefs/DeferredLighting.j3md");
}
creatLightBuffer:
protected void createLightBuffer() {
lightBuffer = new FrameBuffer(screenWidth, screenHeight, 1);
lights = new Texture2D(screenWidth, screenHeight, Format.RGBA8);
lightBuffer.setColorTexture(lights);
lightViewPort = renderManager.createMainView("LightBuffer", cam);
lightViewPort.attachScene(lightNode);
lightViewPort.setOutputFrameBuffer(lightBuffer);
lightViewPort.setClearColor(true);
material.setTexture("LightMap", lights);
}
Also, apologies for the few days late reply. I guess the new forum automatically unchecks the “notify me of replies” box. Thanks in advance for any help!