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

📄 renderer.java

📁 NeHe用java与OpenGL结合教程源码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
        doLogo(gl);
    }

    void doMesh2TexelUnits(GL gl) {

        float c[] = {0f, 0f, 0f, 1f},     // Holds Current Vertex
                n[] = {0f, 0f, 0f, 1f},     // Normalized Normal Of Current Surface
                s[] = {0f, 0f, 0f, 1f},     // s-Texture Coordinate Direction, Normalized
                t[] = {0f, 0f, 0f, 1f},     // t-Texture Coordinate Direction, Normalized
                l[] = {0f, 0f, 0f, 0f},     // Holds Our Lightposition To Be Transformed Into Object Space
                Minv[] = new float[16];        // Holds The Inverted Modelview Matrix To Do So.
        int i;

        // Build Inverse Modelview Matrix First. This Substitutes One Push/Pop With One glLoadIdentity();
        // Simply Build It By Doing All Transformations Negated And In Reverse Order.
        gl.glLoadIdentity();
        gl.glRotatef(-yrot, 0.0f, 1.0f, 0.0f);
        gl.glRotatef(-xrot, 1.0f, 0.0f, 0.0f);
        gl.glTranslatef(0.0f, 0.0f, -z);
        gl.glGetFloatv(GL.GL_MODELVIEW_MATRIX, Minv, 0);
        gl.glLoadIdentity();
        gl.glTranslatef(0.0f, 0.0f, z);

        gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
        gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);

        // Transform The Lightposition Into Object Coordinates:
        l[0] = lightPosition[0];
        l[1] = lightPosition[1];
        l[2] = lightPosition[2];
        l[3] = 1.0f;                           // Homogenous Coordinate
        VMatMult(Minv, l);

        /* PASS#1: Texel-Unit 0: Use Texture "Bump"
                                 No Blend
                                 No Lighting
                                 No Offset Texture-Coordinates
                                 Texture-Operation "Replace"
                   Texel-Unit 1: Use Texture "Invbump"
                                 No Lighting
                                 Offset Texture Coordinates
                                 Texture-Operation "Replace"
        */

        // TEXTURE-UNIT #0
        gl.glActiveTexture(GL.GL_TEXTURE0);
        gl.glEnable(GL.GL_TEXTURE_2D);
        gl.glBindTexture(GL.GL_TEXTURE_2D, bump[filter]);
        gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_COMBINE);
        gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_COMBINE_RGB, GL.GL_REPLACE);
        // TEXTURE-UNIT #1:
        gl.glActiveTexture(GL.GL_TEXTURE1);
        gl.glEnable(GL.GL_TEXTURE_2D);
        gl.glBindTexture(GL.GL_TEXTURE_2D, invbump[filter]);
        gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_COMBINE);
        gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_COMBINE_RGB, GL.GL_ADD);
        // General Switches:
        gl.glDisable(GL.GL_BLEND);
        gl.glDisable(GL.GL_LIGHTING);
        gl.glBegin(GL.GL_QUADS);

        // Front Face
        n[0] = 0.0f;
        n[1] = 0.0f;
        n[2] = 1.0f;
        s[0] = 1.0f;
        s[1] = 0.0f;
        s[2] = 0.0f;
        t[0] = 0.0f;
        t[1] = 1.0f;
        t[2] = 0.0f;

        for (i = 0; i < 4; i++) {
            c[0] = data[5 * i + 2];
            c[1] = data[5 * i + 3];
            c[2] = data[5 * i + 4];
            SetUpBumps(n, c, l, s, t);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
            gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
        }

        // Back Face
        n[0] = 0.0f;
        n[1] = 0.0f;
        n[2] = -1.0f;
        s[0] = -1f;
        s[1] = 0.0f;
        s[2] = 0.0f;
        t[0] = 0.0f;
        t[1] = 1.0f;
        t[2] = 0.0f;

        for (i = 4; i < 8; i++) {
            c[0] = data[5 * i + 2];
            c[1] = data[5 * i + 3];
            c[2] = data[5 * i + 4];
            SetUpBumps(n, c, l, s, t);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
            gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
        }

        // Top Face
        n[0] = 0.0f;
        n[1] = 1.0f;
        n[2] = 0.0f;
        s[0] = 1.0f;
        s[1] = 0.0f;
        s[2] = 0.0f;
        t[0] = 0.0f;
        t[1] = 0.0f;
        t[2] = -1.0f;

        for (i = 8; i < 12; i++) {
            c[0] = data[5 * i + 2];
            c[1] = data[5 * i + 3];
            c[2] = data[5 * i + 4];
            SetUpBumps(n, c, l, s, t);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
            gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
        }

        // Bottom Face
        n[0] = 0f;
        n[1] = -1f;
        n[2] = 0f;
        s[0] = -1f;
        s[1] = 0f;
        s[2] = 0f;
        t[0] = 0f;
        t[1] = 0f;
        t[2] = -1f;

        for (i = 12; i < 16; i++) {
            c[0] = data[5 * i + 2];
            c[1] = data[5 * i + 3];
            c[2] = data[5 * i + 4];
            SetUpBumps(n, c, l, s, t);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
            gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
        }

        // Right Face
        n[0] = 1.0f;
        n[1] = 0.0f;
        n[2] = 0.0f;
        s[0] = 0.0f;
        s[1] = 0.0f;
        s[2] = -1.0f;
        t[0] = 0.0f;
        t[1] = 1.0f;
        t[2] = 0.0f;

        for (i = 16; i < 20; i++) {
            c[0] = data[5 * i + 2];
            c[1] = data[5 * i + 3];
            c[2] = data[5 * i + 4];
            SetUpBumps(n, c, l, s, t);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
            gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
        }

        // Left Face
        n[0] = -1.0f;
        n[1] = 0.0f;
        n[2] = 0.0f;
        s[0] = 0.0f;
        s[1] = 0.0f;
        s[2] = 1.0f;
        t[0] = 0.0f;
        t[1] = 1.0f;
        t[2] = 0.0f;

        for (i = 20; i < 24; i++) {
            c[0] = data[5 * i + 2];
            c[1] = data[5 * i + 3];
            c[2] = data[5 * i + 4];
            SetUpBumps(n, c, l, s, t);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
            gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
            gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
        }
        gl.glEnd();

        /* PASS#2  Use Texture "Base"
                   Blend GL_DST_COLOR To GL_SRC_COLOR (Multiplies By 2)
                   Lighting Enabled
                   No Offset Texture-Coordinates
         */

        gl.glActiveTexture(GL.GL_TEXTURE1);
        gl.glDisable(GL.GL_TEXTURE_2D);
        gl.glActiveTexture(GL.GL_TEXTURE0);

        if (!embossEnabled) {
            gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
            gl.glBindTexture(GL.GL_TEXTURE_2D, textures[filter]);
            gl.glBlendFunc(GL.GL_DST_COLOR, GL.GL_SRC_COLOR);
            gl.glEnable(GL.GL_BLEND);
            gl.glEnable(GL.GL_LIGHTING);
            doCube(gl);
        }

        xrot += xspeed;
        yrot += yspeed;
        if (xrot > 360.0f) xrot -= 360.0f;
        if (xrot < 0.0f) xrot += 360.0f;
        if (yrot > 360.0f) yrot -= 360.0f;
        if (yrot < 0.0f) yrot += 360.0f;

        /* LAST PASS:	Do The Logos! */
        doLogo(gl);
    }

    private void doMeshNoBumps(GL gl) {

        gl.glLoadIdentity();                // Reset The View
        gl.glTranslatef(0.0f, 0.0f, z);

        gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
        gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);

        gl.glActiveTexture(GL.GL_TEXTURE1);
        gl.glDisable(GL.GL_TEXTURE_2D);
        gl.glActiveTexture(GL.GL_TEXTURE0);

        gl.glDisable(GL.GL_BLEND);
        gl.glBindTexture(GL.GL_TEXTURE_2D, textures[filter]);
        gl.glBlendFunc(GL.GL_DST_COLOR, GL.GL_SRC_COLOR);
        gl.glEnable(GL.GL_LIGHTING);
        doCube(gl);

        xrot += xspeed;
        yrot += yspeed;
        if (xrot > 360.0f) xrot -= 360.0f;
        if (xrot < 0.0f) xrot += 360.0f;
        if (yrot > 360.0f) yrot -= 360.0f;
        if (yrot < 0.0f) yrot += 360.0f;

        /* LAST PASS:	Do The Logos! */
        doLogo(gl);
    }

    private void update() {
        if (zoomOut)
            z -= 0.02f;
        if (zoomIn)
            z += 0.02f;
        if (decreaseX)
            xspeed -= 0.01f;
        if (increaseX)
            xspeed += 0.01f;
        if (increaseY)
            yspeed += 0.01f;
        if (decreaseY)
            yspeed -= 0.01f;
    }

    public void display(GLAutoDrawable drawable) {
        update();
        GL gl = drawable.getGL();

        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
        if (bumpsEnabled) {
            if (multitextureEnabled && maxTexelUnits[0] > 1)
                doMesh2TexelUnits(gl);
            else
                doMesh1TexelUnits(gl);
        } else
            doMeshNoBumps(gl);
    }

    public void reshape(GLAutoDrawable drawable,
                        int xstart,
                        int ystart,
                        int width,
                        int height) {
        GL gl = drawable.getGL();

        height = (height == 0) ? 1 : height;

        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();

        glu.gluPerspective(45, (float) width / height, 1, 1000);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    public void displayChanged(GLAutoDrawable drawable,
                               boolean modeChanged,
                               boolean deviceChanged) {
    }
}

⌨️ 快捷键说明

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