簡體   English   中英

Java:對立方體面應用不同的紋理並使用 JOGL 將圖像渲染為 png

[英]Java: Apply different textures to cube faces and render image to png with JOGL

我想渲染一個具有三個可見面的立方體,每個面都應該應用不同的紋理,這應該很容易互換。 我設法讓這個基本代碼運行起來,它只適用於 colors。

import com.jogamp.opengl.*;
import com.jogamp.opengl.awt.GLJPanel;

import javax.swing.*;
import java.awt.*;

import static com.jogamp.opengl.GL.GL_MULTISAMPLE;

public class CubeRenderer extends GLJPanel implements GLEventListener {

    public static void main(String[] args) {
        JFrame window = new JFrame("JOGL Scene");
        GLCapabilities caps = new GLCapabilities(null);
        CubeRenderer panel = new CubeRenderer(caps);
        window.setContentPane(panel);
        window.pack();
        window.setLocation(50,50);
        window.setResizable(false);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
        panel.requestFocusInWindow();
    }

    private final float rotateX;
    private final float rotateY;
    private final float rotateZ;   // rotation amounts about axes
    private int texture;

    // Correct orientation -45.0, 150.0, 90.0
    public CubeRenderer(GLCapabilities capabilities) {
        super(capabilities);
        setPreferredSize( new Dimension(500,500) );
        addGLEventListener(this);
        rotateX = -45.0f;
        rotateY = 150.0f;
        rotateZ = 90.0f;
    }

    private void square(GL2 gl, float r, float g, float b) {
        gl.glColor3f(r,g,b);         // The color for the square.
        gl.glTranslatef(0,0,0.5f);    // Move square 0.5 units forward.
        gl.glNormal3f(0,0,1);        // Normal vector to square (this is actually the default).
        gl.glBegin(GL2.GL_TRIANGLE_FAN);
        gl.glVertex2f(-0.5f,-0.5f);    // Draw the square (before the
        gl.glVertex2f(0.5f,-0.5f);     //   the translation is applied)
        gl.glVertex2f(0.5f,0.5f);      //   on the xy-plane, with its
        gl.glVertex2f(-0.5f,0.5f);     //   at (0,0,0).
        gl.glEnd();
    }

    private void cube(GL2 gl) {


        gl.glPushMatrix();
        gl.glRotatef(180,0,1,0); // rotate square to back face
        square(gl,0,1,1);        // back face is cyan
        gl.glPopMatrix();

        gl.glPushMatrix();
        gl.glRotatef(-90,0,1,0); // rotate square to left face
        square(gl,0,1,0);        // left face is green
        gl.glPopMatrix();

        gl.glPushMatrix();
        gl.glRotatef(-90,1,0,0); // rotate square to top face
        square(gl,0,0,1);        // top face is blue
        gl.glPopMatrix();
    }

    public void display(GLAutoDrawable drawable) {
        // called when the panel needs to be drawn

        GL2 gl = drawable.getGL().getGL2();
        gl.glClearColor(0,0,0,0);
        gl.glClear( GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT );

        gl.glMatrixMode(GL2.GL_PROJECTION);  // Set up the projection.
        gl.glLoadIdentity();
        gl.glOrtho(-1,1,-1,1,-2,2);
        gl.glMatrixMode(GL2.GL_MODELVIEW);

        gl.glLoadIdentity();             // Set up modelview transform.
        gl.glRotatef(rotateZ,0,0,1);
        gl.glRotatef(rotateY,0,1,0);
        gl.glRotatef(rotateX,1,0,0);

        cube(gl);

    }

    public void init(GLAutoDrawable drawable) {
        // called when the panel is created
        GL2 gl = drawable.getGL().getGL2();
        gl.glClearColor(0.8F, 0.8F, 0.8F, 1.0F);
        gl.glEnable(GL.GL_DEPTH_TEST);
        gl.glEnable(GL2.GL_LIGHTING);
        gl.glEnable(GL2.GL_LIGHT0);
        gl.glEnable(GL2.GL_COLOR_MATERIAL);
        gl.glEnable(GL_MULTISAMPLE);
    }

    public void dispose(GLAutoDrawable drawable) {
        // called when the panel is being disposed
    }

    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
        // called when user resizes the window
    }

}

然而,我無法弄清楚如何應用紋理而不是 colors 以及如何將整個立方體渲染成 png,因為我無法運行這些教程中的任何一個,因為它們中的大多數都已經很老了。

將 3 個圖像合並為一個圖像,創建一個紋理,綁定它,啟用紋理目標並通過使用適當的紋理坐標將紋理用作紋理圖集(請參閱 glTexCoords)或為您的 3 個圖像創建 3 個紋理並執行啟用/為每個紋理綁定/繪制/禁用。

看看 TextureIO、AWTTextureIO、glBindTexture、glEnable、glDisable 和 glTexCoord2f。

請注意,我的回答假設您使用固定管道,但從長遠來看,使用可編程管道會更好。 在我的拙見中,即使您使用固定管道而不是立即模式(glBegin、glEnd、glVertex、...),您也應該使用保留模式(VAO、VBO、...)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM