簡體   English   中英

未顯示紋理:OpenGL(JOGL)

[英]Texture Not Displayed: OpenGL (JOGL)

我正在嘗試在屏幕上繪制幾個圖像。 但是,圖像本身不會顯示。 只有它們必須具有的區域與背景顏色不同。 你能幫我發現錯誤嗎? 我看到的話題很少,因為從對立面觀察質地會引起類似的問題。 但是我不知道如何適當地改變立場。

package game; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.DisplayMode; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Collections; 



import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLCapabilities; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.GLProfile; 
import javax.media.opengl.awt.GLCanvas; 
import javax.media.opengl.glu.GLU; 
import javax.swing.AbstractAction; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

import com.jogamp.opengl.util.FPSAnimator; 
import com.jogamp.opengl.util.texture.Texture; 
import com.jogamp.opengl.util.texture.TextureIO; 

public class StartingClass implements GLEventListener { 
        private static GraphicsEnvironment graphicsEnviorment; 

        private GLU glu = new GLU(); 

        private int texture; 
        private static int B_WIDTH = 800; 
        private static int B_HEIGHT = 600; 
        private Dog dog; 
        private Wolf wolf; 
        private ArrayList<Sheep> sheeps; 
        private boolean ingame; 

        @Override 
        public void display(GLAutoDrawable drawable) { 
                // TODO Auto-generated method stub 
                final GL2 gl = drawable.getGL().getGL2(); 
                gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); 
                // Clear // The // Screen // And // The 
                // Depth 
                // Buffer 
                gl.glLoadIdentity(); // Reset The View 
                gl.glBindTexture(GL2.GL_TEXTURE_2D, dog.getTexture()); 
                gl.glBegin(GL2.GL_QUADS); 
                // Front Face 
                Rectangle rect = dog.getBounds(); 
                gl.glTexCoord2f(rect.x, rect.y); 
                gl.glVertex3f(rect.x, rect.y, 0.0f); 
                gl.glTexCoord2f(rect.x + rect.width, rect.y); 
                gl.glVertex3f(rect.x + rect.width, rect.y, 0.0f); 
                gl.glTexCoord2f(rect.x + rect.width, rect.y + rect.height); 
                gl.glVertex3f(rect.x + rect.width, rect.y + rect.height, 0.0f); 
                gl.glTexCoord2f(rect.x, rect.y + rect.height); 
                gl.glVertex3f(rect.x, rect.y + rect.height, 0.0f); 
                gl.glEnd(); 


                gl.glFlush(); 

        } 

        @Override 
        public void dispose(GLAutoDrawable drawable) { 
                // TODO Auto-generated method stub 

        } 

        @Override 
        public void init(GLAutoDrawable drawable) { 
                dog = new Dog(B_WIDTH / 2, B_HEIGHT / 2); 

                final GL2 gl = drawable.getGL().getGL2(); 

                gl.glEnable(GL2.GL_TEXTURE_2D); 
                try { 
                        File im = new File("src/game/dog.jpg"); 
                        Texture t = TextureIO.newTexture(im, true); 
                        dog.setTexture(t.getTextureObject(gl)); 
                } catch (IOException e) { 
                        e.printStackTrace(); 
                } 

        } 

        @Override 
        public void reshape(GLAutoDrawable drawable, int x, int y, int width, 
                        int height) { 
                // TODO Auto-generated method stub 
                final GL2 gl = drawable.getGL().getGL2(); 

                if (height <= 0) 
                        height = 1; 
                final float h = (float) width / (float) height; 
                gl.glViewport(0, 0, width, height); 
                gl.glMatrixMode(GL2.GL_PROJECTION); 
                gl.glLoadIdentity(); 
                gl.glOrtho(0, width, height, 0, 0, 1); 

                gl.glMatrixMode(GL2.GL_MODELVIEW); 
                gl.glLoadIdentity(); 
        } 

        /** 
         * @param args 
         */ 
        public static void main(String[] args) { 
                // TODO Auto-generated method stub 
                // setUp open GL version 2 
                final GLProfile profile = GLProfile.get(GLProfile.GL2); 
                GLCapabilities capabilities = new GLCapabilities(profile); 

                // The canvas 
                final GLCanvas glcanvas = new GLCanvas(capabilities); 
                StartingClass r = new StartingClass(); 
                glcanvas.addGLEventListener(r); 
                glcanvas.setSize(B_WIDTH, B_HEIGHT); 

                final FPSAnimator animator = new FPSAnimator(glcanvas, 300, true); 

                final JFrame frame = new JFrame("sheppard"); 

                frame.getContentPane().add(glcanvas); 

                // Shutdown 
                frame.addWindowListener(new java.awt.event.WindowAdapter() { 
                        @Override 
                        public void windowClosing(java.awt.event.WindowEvent windowEvent) { 
                                if (JOptionPane.showConfirmDialog(frame, 
                                                "Are you sure to close this window?", 
                                                "Really Closing?", JOptionPane.YES_NO_OPTION, 
                                                JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { 
                                        if (animator.isStarted()) 
                                                animator.stop(); 
                                        System.exit(0); 
                                } 
                        } 
                }); 

                frame.setSize(frame.getContentPane().getPreferredSize()); 
                /** 
                 * Centers the screen on start up 
                 * 
                 */ 
                graphicsEnviorment = GraphicsEnvironment.getLocalGraphicsEnvironment(); 

                GraphicsDevice[] devices = graphicsEnviorment.getScreenDevices(); 

                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

                int windowX = Math.max(0, (screenSize.width - frame.getWidth()) / 2); 
                int windowY = Math.max(0, (screenSize.height - frame.getHeight()) / 2); 

                frame.setLocation(windowX, windowY); 
                /** 
                                 * 
                                 */ 
                frame.setVisible(true); 
                /* 
                 * Time to add Button Control 
                 */ 
                JPanel p = new JPanel(); 
                p.setPreferredSize(new Dimension(0, 0)); 
                frame.add(p, BorderLayout.SOUTH); 
                frame.setResizable(false); 
                animator.start(); 
        } 

        //methods to generate sheeps' positions 


} 

您正在使用GL_TEXTURE_2D dog.getBounds()返回的邊界是什么? 使用GL_TEXTURE_2D ,應將紋理坐標標准化(介於0和1之間)。 由於您已將當前矩陣(我認為是ModelView矩陣?)設置為恆等,因此整個窗口的x和y值應在-1到1的范圍內。

我不希望圖像的邊界在大多數情況下可用作紋理坐標和頂點坐標。 例如,圖像可能是640x480,但是您想以恰好位於坐標(-5,-5)並延伸到(15,10)的矩形顯示它。 在這種情況下, GL_TEXTURE_2D兩個方向的紋理坐標仍將為0-1。

我會檢查所有涉及的坐標是什么,看看它們是否對您設置OpenGL在窗口上繪制世界的方式有意義。

暫無
暫無

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

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