[英]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.