⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bloomrenderpass.java

📁 java 3d game jme 工程开发源代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		fullScreenQuad.setTextureCombineMode(Spatial.TextureCombineMode.Replace);
		fullScreenQuad.setLightCombineMode(Spatial.LightCombineMode.Off);
        
		TextureState ts = display.getRenderer().createTextureState();
		ts.setEnabled(true);
        fullScreenQuad.setRenderState(ts);

		BlendState as = display.getRenderer().createBlendState();
		as.setBlendEnabled(true);
		as.setSourceFunction(BlendState.SourceFunction.One);
		as.setDestinationFunction(BlendState.DestinationFunction.One);
		as.setEnabled(true);
        fullScreenQuad.setRenderState(as);

        fullScreenQuad.updateRenderState();
        fullScreenQuad.updateGeometricState(0.0f, true);
	}

    /**
     * Helper class to get all spatials rendered in one TextureRenderer.render() call.
     */
    private class SpatialsRenderNode extends Node {
        private static final long serialVersionUID = 7367501683137581101L;
        public void draw( Renderer r ) {
            Spatial child;
            for (int i = 0, cSize = spatials.size(); i < cSize; i++) {
                child = spatials.get(i);
                if (child != null)
                    child.onDraw(r);
            }
        }

        public void onDraw( Renderer r ) {
            draw( r );
        }
    }

    private final SpatialsRenderNode spatialsRenderNode = new SpatialsRenderNode();

    @Override
    protected void doUpdate(float tpf) {
        super.doUpdate(tpf);
        sinceLast += tpf;
    }
    
    public void doRender(Renderer r) {
        if (!isSupported() || !useCurrentScene && spatials.size() == 0 ) {
            return;
        }

        BlendState as = (BlendState) fullScreenQuad.states[RenderState.StateType.Blend.ordinal()];

        if (sinceLast > throttle) {
            sinceLast = 0;

            as.setEnabled(false);
            TextureState ts = (TextureState) fullScreenQuad.states[RenderState.StateType.Texture.ordinal()];
            
            // see if we should use the current scene to bloom, or only things added to the pass.
            if (useCurrentScene) {
                // grab backbuffer to texture
                tRenderer.copyToTexture(screenTexture, 
                        DisplaySystem.getDisplaySystem().getWidth(), 
                        DisplaySystem.getDisplaySystem().getHeight());
                ts.setTexture(screenTexture, 0);
            } else {
        		//Render scene to texture
                tRenderer.render( spatialsRenderNode , mainTexture);
                ts.setTexture(mainTexture, 0);
            }

    		//Extract intensity
    		extractionShader.setUniform("exposurePow", getExposurePow());
    		extractionShader.setUniform("exposureCutoff", getExposureCutoff());
    
            fullScreenQuad.states[RenderState.StateType.GLSLShaderObjects.ordinal()] = extractionShader;
            tRenderer.render(fullScreenQuad, secondTexture);
        
            if (!useSeparateConvolution) {
                blurShader.setUniform("sampleDist", getBlurSize());
                blurShader.setUniform("blurIntensityMultiplier",  getBlurIntensityMultiplier());

                ts.setTexture(secondTexture, 0);
                fullScreenQuad.states[RenderState.StateType.GLSLShaderObjects.ordinal()] = blurShader;
                tRenderer.render(fullScreenQuad, mainTexture);

                //Extra blur passes
                for(int i = 1; i < getNrBlurPasses(); i++) {
                    blurShader.setUniform("sampleDist", getBlurSize() - (float)i*getBlurSize()/getNrBlurPasses());
                    if (i%2 == 1) {
                        ts.setTexture(mainTexture, 0);
                        tRenderer.render(fullScreenQuad, secondTexture);
                    } else {
                        ts.setTexture(secondTexture, 0);
                        tRenderer.render(fullScreenQuad, mainTexture);
                    }
                }
                if (getNrBlurPasses()%2 == 1) {
                    ts.setTexture(mainTexture, 0);
                } else {
                    ts.setTexture(secondTexture, 0);
                    tRenderer.render(fullScreenQuad, mainTexture, false);
                }
            } else {
                blurShaderVertical.setUniform("blurIntensityMultiplier",  getBlurIntensityMultiplier());

                for(int i = 0; i < getNrBlurPasses(); i++) {
                    blurShaderHorizontal.setUniform("sampleDist", getBlurSize() - (float)i*getBlurSize()/getNrBlurPasses());
                    blurShaderVertical.setUniform("sampleDist", getBlurSize() - (float)i*getBlurSize()/getNrBlurPasses());

                    ts.setTexture(secondTexture, 0);
                    fullScreenQuad.states[RenderState.StateType.GLSLShaderObjects.ordinal()] = blurShaderHorizontal;
                    ts.setTexture(mainTexture, 0);
                    fullScreenQuad.states[RenderState.StateType.GLSLShaderObjects.ordinal()] = blurShaderVertical;
                    tRenderer.render(fullScreenQuad, secondTexture);
                }
                ts.setTexture(secondTexture, 0);
            }
        }

		//Final blend
		as.setEnabled(true);
        
        fullScreenQuad.states[RenderState.StateType.GLSLShaderObjects.ordinal()] = finalShader;
        r.draw(fullScreenQuad);
	}

	/**
     * @return The throttle amount - or in other words, how much time in
     *         seconds must pass before the bloom effect is updated.
     */
    public float getThrottle() {
        return throttle;
    }

    /**
     * @param throttle
     *            The throttle amount - or in other words, how much time in
     *            seconds must pass before the bloom effect is updated.
     */
    public void setThrottle(float throttle) {
        this.throttle = throttle;
    }

    public float getBlurSize() {
		return blurSize;
	}

	public void setBlurSize(float blurSize) {
		this.blurSize = blurSize;
	}

	public float getExposurePow() {
		return exposurePow;
	}

	public void setExposurePow(float exposurePow) {
		this.exposurePow = exposurePow;
	}

	public float getExposureCutoff() {
		return exposureCutoff;
	}

	public void setExposureCutoff(float exposureCutoff) {
		this.exposureCutoff = exposureCutoff;
	}

	public float getBlurIntensityMultiplier() {
		return blurIntensityMultiplier;
	}

	public void setBlurIntensityMultiplier(float blurIntensityMultiplier) {
		this.blurIntensityMultiplier = blurIntensityMultiplier;
	}

	public int getNrBlurPasses() {
		return nrBlurPasses;
	}

	public void setNrBlurPasses(int nrBlurPasses) {
		this.nrBlurPasses = nrBlurPasses;
	}

    public boolean useCurrentScene() {
        return useCurrentScene;
    }

    public void setUseCurrentScene(boolean useCurrentScene) {
        this.useCurrentScene = useCurrentScene;
    }

    public void setUseSeparateConvolution(boolean useSeparateConvolution) {
        this.useSeparateConvolution = useSeparateConvolution;
    }

    public boolean isUseSeparateConvolution() {
        return useSeparateConvolution;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -