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

📄 lwjgltexturerenderer.java

📁 java 3d game jme 工程开发源代码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
            attachBuffer.clear();
            attachBuffer.limit(maxEntry);
            ARBDrawBuffers.glDrawBuffersARB(attachBuffer);
        }
    }

    private void takedownForSingleTexDraw(Texture tex) {
        switchCameraOut();

        // automatically generate mipmaps for our texture.
        if (tex.getMinificationFilter().usesMipMapLevels()) {
            LWJGLTextureState.doTextureBind(tex.getTextureId(), 0, Texture.Type.TwoDimensional);
            EXTFramebufferObject.glGenerateMipmapEXT(GL11.GL_TEXTURE_2D);
        }
    }


    private void checkFBOComplete() {
        int framebuffer = EXTFramebufferObject
                .glCheckFramebufferStatusEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT);
        switch (framebuffer) {
            case EXTFramebufferObject.GL_FRAMEBUFFER_COMPLETE_EXT:
                break;
            case EXTFramebufferObject.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
                throw new RuntimeException(
                        "FrameBuffer: "
                                + fboID
                                + ", has caused a GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT exception");
            case EXTFramebufferObject.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
                throw new RuntimeException(
                        "FrameBuffer: "
                                + fboID
                                + ", has caused a GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT exception");
            case EXTFramebufferObject.GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
                throw new RuntimeException(
                        "FrameBuffer: "
                                + fboID
                                + ", has caused a GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT exception");
            case EXTFramebufferObject.GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
                throw new RuntimeException(
                        "FrameBuffer: "
                                + fboID
                                + ", has caused a GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT exception");
            case EXTFramebufferObject.GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
                throw new RuntimeException(
                        "FrameBuffer: "
                                + fboID
                                + ", has caused a GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT exception");
            case EXTFramebufferObject.GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
                throw new RuntimeException(
                        "FrameBuffer: "
                                + fboID
                                + ", has caused a GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT exception");
            case EXTFramebufferObject.GL_FRAMEBUFFER_UNSUPPORTED_EXT:
                throw new RuntimeException(
                        "FrameBuffer: "
                                + fboID
                                + ", has caused a GL_FRAMEBUFFER_UNSUPPORTED_EXT exception");
            default:
                throw new RuntimeException(
                        "Unexpected reply from glCheckFramebufferStatusEXT: "
                                + framebuffer);
        }
    }

    /**
     * <code>copyToTexture</code> copies the FBO contents to the given
     * Texture. What is copied is up to the Texture object's rttSource field.
     * 
     * @param tex
     *            The Texture to copy into.
     * @param width
     *            the width of the texture image
     * @param height
     *            the height of the texture image
     */
    public void copyToTexture(Texture tex, int width, int height) {
        LWJGLTextureState.doTextureBind(tex.getTextureId(), 0, Texture.Type.TwoDimensional);

        int source = GL11.GL_RGBA;
        switch (tex.getRTTSource()) {
	case RGBA:
	case RGBA8:
	    break;
	case RGB:
	case RGB8:
	    source = GL11.GL_RGB;
	    break;
	case Alpha:
	case Alpha8:
	    source = GL11.GL_ALPHA;
	    break;
	case Depth:
	    source = GL11.GL_DEPTH_COMPONENT;
	    break;
	case Intensity:
	case Intensity8:
	    source = GL11.GL_INTENSITY;
	    break;
	case Luminance:
	case Luminance8:
	    source = GL11.GL_LUMINANCE;
	    break;
	case LuminanceAlpha:
	case Luminance8Alpha8:
	    source = GL11.GL_LUMINANCE_ALPHA;
	    break;
	case Alpha4:
	    source = GL11.GL_ALPHA;
	    break;
	case Alpha12:
	    source = GL11.GL_ALPHA;
	    break;
	case Alpha16:
	    source = GL11.GL_ALPHA;
	    break;
	case Luminance4:
	    source = GL11.GL_LUMINANCE;
	    break;
	case Luminance12:
	    source = GL11.GL_LUMINANCE;
	    break;
	case Luminance16:
	    source = GL11.GL_LUMINANCE;
	    break;
	case Luminance4Alpha4:
	    source = GL11.GL_LUMINANCE_ALPHA;
	    break;
	case Luminance6Alpha2:
	    source = GL11.GL_LUMINANCE_ALPHA;
	    break;
	case Luminance12Alpha4:
	    source = GL11.GL_LUMINANCE_ALPHA;
	    break;
	case Luminance12Alpha12:
	    source = GL11.GL_LUMINANCE_ALPHA;
	    break;
	case Luminance16Alpha16:
	    source = GL11.GL_LUMINANCE_ALPHA;
	    break;
	case Intensity4:
	    source = GL11.GL_INTENSITY;
	    break;
	case Intensity12:
	    source = GL11.GL_INTENSITY;
	    break;
	case Intensity16:
	    source = GL11.GL_INTENSITY;
	    break;
	case R3_G3_B2:
	    source = GL11.GL_RGB;
	    break;
	case RGB4:
	    source = GL11.GL_RGB;
	    break;
	case RGB5:
	    source = GL11.GL_RGB;
	    break;
	case RGB10:
	    source = GL11.GL_RGB;
	    break;
	case RGB12:
	    source = GL11.GL_RGB;
	    break;
	case RGB16:
	    source = GL11.GL_RGB;
	    break;
	case RGBA2:
	    source = GL11.GL_RGBA;
	    break;
	case RGBA4:
	    source = GL11.GL_RGBA;
	    break;
	case RGB5_A1:
	    source = GL11.GL_RGBA;
	    break;
	case RGB10_A2:
	    source = GL11.GL_RGBA;
	    break;
	case RGBA12:
	    source = GL11.GL_RGBA;
	    break;
	case RGBA16:
	    source = GL11.GL_RGBA;
	    break;
	case RGBA32F:
	    source = GL11.GL_RGBA;
	    break;
	case RGB32F:
	    source = GL11.GL_RGB;
	    break;
	case Alpha32F:
	    source = GL11.GL_ALPHA;
	    break;
	case Intensity32F:
	    source = GL11.GL_INTENSITY;
	    break;
	case Luminance32F:
	    source = GL11.GL_LUMINANCE;
	    break;
	case LuminanceAlpha32F:
	    source = GL11.GL_LUMINANCE_ALPHA;
	    break;
	case RGBA16F:
	    source = GL11.GL_RGBA;
	    break;
	case RGB16F:
	    source = GL11.GL_RGB;
	    break;
	case Alpha16F:
	    source = GL11.GL_ALPHA;
	    break;
	case Intensity16F:
	    source = GL11.GL_INTENSITY;
	    break;
	case Luminance16F:
	    source = GL11.GL_LUMINANCE;
	    break;
	case LuminanceAlpha16F:
	    source = GL11.GL_LUMINANCE_ALPHA;
	    break;
	}
	GL11.glCopyTexImage2D(GL11.GL_TEXTURE_2D, 0, source, 0, 0, width,
		height, 0);
    }

    private Camera oldCamera;
    private int oldWidth, oldHeight;
    private void switchCameraIn(boolean doClear) {
        // grab non-rtt settings
        oldCamera = parentRenderer.getCamera();
        oldWidth = parentRenderer.getWidth();
        oldHeight = parentRenderer.getHeight();
        parentRenderer.setCamera(getCamera());

        // swap to rtt settings
        parentRenderer.getQueue().swapBuckets();
        parentRenderer.reinit(width, height);

        // clear the scene
        if (doClear) {
            GL11.glDisable(GL11.GL_SCISSOR_TEST);
            parentRenderer.clearBuffers();
        }

        getCamera().update();
        getCamera().apply();
    }

    private void switchCameraOut() {
        parentRenderer.setCamera(oldCamera);
        parentRenderer.reinit(oldWidth, oldHeight);

        // back to the non rtt settings
        parentRenderer.getQueue().swapBuckets();
        oldCamera.update();
        oldCamera.apply();
    }

    private void doDraw(Spatial spat) {
        // Override parent's last frustum test to avoid accidental incorrect
        // cull
        if (spat.getParent() != null)
            spat.getParent().setLastFrustumIntersection(Camera.FrustumIntersect.Intersects);

        // do rtt scene render
        spat.onDraw(parentRenderer);
        parentRenderer.renderQueue();
    }
    
    private void doDraw(ArrayList<? extends Spatial> toDraw) {
        for (int x = 0, max = toDraw.size(); x < max; x++) {
            Spatial spat = toDraw.get(x);
            doDraw(spat);
        }
    }

    private void activate() {
        if (!isSupported) {
            return;
        }
        if (active == 0) {
            GL11.glClearColor(backgroundColor.r, backgroundColor.g,
                    backgroundColor.b, backgroundColor.a);
            EXTFramebufferObject.glBindFramebufferEXT(
                    EXTFramebufferObject.GL_FRAMEBUFFER_EXT, fboID);
        }
        active++;
    }

    private void deactivate() {
        if (!isSupported) {
            return;
        }
        if (active == 1) {
            GL11.glClearColor(parentRenderer.getBackgroundColor().r,
                    parentRenderer.getBackgroundColor().g, parentRenderer
                            .getBackgroundColor().b, parentRenderer
                            .getBackgroundColor().a);
            EXTFramebufferObject.glBindFramebufferEXT(
                    EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0);
        }
        active--;
    }

    private void initCamera() {
        if (!isSupported) {
            return;
        }
        logger.info("Init RTT camera");
        camera = new LWJGLCamera(width, height, false);
        camera.setFrustum(1.0f, 1000.0f, -0.50f, 0.50f, 0.50f, -0.50f);
        Vector3f loc = new Vector3f(0.0f, 0.0f, 0.0f);
        Vector3f left = new Vector3f(-1.0f, 0.0f, 0.0f);
        Vector3f up = new Vector3f(0.0f, 1.0f, 0.0f);
        Vector3f dir = new Vector3f(0.0f, 0f, -1.0f);
        camera.setFrame(loc, left, up, dir);
        camera.setDataOnly(false);
    }

    public void cleanup() {
        if (!isSupported) {
            return;
        }

        if (fboID > 0) {
            IntBuffer id = BufferUtils.createIntBuffer(1);
            id.put(fboID);
            id.rewind();
            EXTFramebufferObject.glDeleteFramebuffersEXT(id);
        }
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    public void setMultipleTargets(boolean multi) {
        // ignore. Does not matter to FBO.
    }
}

⌨️ 快捷键说明

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