簡體   English   中英

圖塊集的 Jogl uv 坐標

[英]Jogl uv coordinates for tilesets

我目前正在學習 jogl,所以我可以制作自己的 2d 游戲。 瓦片的所有紋理都存儲在一個大瓦片集中。 我嘗試使用Texture.getSubImageTexCoords()繪制單個圖塊,但結果很奇怪: 奇怪的結果

我不確定如何准確地描述它,但構成四邊形的左上三角形正在以一種非常奇怪的方式拉伸。 我只想顯示圖塊集的一部分。 我嘗試在網上尋找一些東西,但找不到任何東西。

這是我的代碼:

public class TestSubImage {
    private GLU glu = new GLU();
    private GLCanvas mainCanvas;
    private Texture texture;
    private TextureCoords tc;

    class Listener implements GLEventListener {
        public void init(GLAutoDrawable drawable) {
            // Load texture
            try {
                texture = TextureIO.newTexture(TestSubImage.class.getResource("/images/sheet.png"), false, null);
                texture.setTexParameteri(drawable.getGL(), drawable.getGL().GL_TEXTURE_MAG_FILTER, drawable.getGL().GL_NEAREST);
                tc = texture.getSubImageTexCoords(0, 16, 16, 32); // sub texture coords
            } catch (IOException e) {
                e.printStackTrace();
            }

            // Set up
            drawable.getGL().glClearColor(0.3f, 0.3f, 0.3f, 0);
            glu = new GLU();
            glu.gluOrtho2D(0, 512, 512, 0);
        }

        public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {

        }

        public void dispose(GLAutoDrawable drawable) {
        }

        public void display(GLAutoDrawable drawable) {
            GL2 gl = drawable.getGL().getGL2();
            gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

            // where to draw the image
            int x = 100;
            int y = 100;
            int width = 200;
            int height = 200;

            gl.glColor3f(1, 1, 1);

            // Draw the image
            texture.enable(gl);
            texture.bind(gl);

            gl.glBegin(GL2.GL_QUADS);
            gl.glVertex2f(x, y);
            gl.glTexCoord2f(tc.left(), tc.bottom());
            gl.glVertex2f(x, y + height);
            gl.glTexCoord2f(tc.right(), tc.bottom());
            gl.glVertex2f(x + width, y + height);
            gl.glTexCoord2f(tc.right(), tc.top());
            gl.glVertex2f(x + width, y);
            gl.glTexCoord2f(tc.left(), tc.top());
            gl.glEnd();
            texture.disable(gl);
        }
    }

    private void run() {

        // Create window
        JFrame frame = new JFrame("Texture Coords Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create profile and capabilities
        final GLProfile profile = GLProfile.get(GLProfile.GL2);
        GLCapabilities caps = new GLCapabilities(profile);

        // Now set up the main GLCanvas
        mainCanvas = new GLCanvas(caps);
        mainCanvas.addGLEventListener(new Listener());

        frame.getContentPane().add(mainCanvas);
        frame.setSize(512, 512);
        frame.setResizable(false);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new TestSubImage().run();
    }
}

瓷磚集在這里

我不使用 JOGL,但它看起來像你的

            gl.glVertex2f(x, y);
            gl.glTexCoord2f(tc.left(), tc.bottom());
            gl.glVertex2f(x, y + height);
            gl.glTexCoord2f(tc.right(), tc.bottom());
            gl.glVertex2f(x + width, y + height);
            gl.glTexCoord2f(tc.right(), tc.top());
            gl.glVertex2f(x + width, y);
            gl.glTexCoord2f(tc.left(), tc.top());

是不正確的。 如果我們將每個glVertex2f與它下面的行配對,我想它應該看起來像

            gl.glVertex2f(x, y);
            gl.glTexCoord2f(tc.left(), tc.bottom());

            gl.glVertex2f(x, y + height);
            gl.glTexCoord2f(tc.left(), tc.top());

            gl.glVertex2f(x + width, y + height);
            gl.glTexCoord2f(tc.right(), tc.top());

            gl.glVertex2f(x + width, y);
            gl.glTexCoord2f(tc.right, tc.bottom());

glTexCoord2f設置下一個頂點的紋理坐標。 因此,您使用默認 texcoord(無論是什么)渲染一個頂點,然后您使用前一個頂點的 texcoord 渲染每個頂點。 最后一個 texcoord 調用什么也不做。 (好吧,它可能作為當前的 texcoord 掛起並用於下一幀的第一個頂點)

您需要在 glVertex2f之前調用 glTexCoord2f。

PS 對於 glColor3f/4f、glNormal3f 等,它的工作原理相同。

暫無
暫無

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

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