想用数组里面存储的像素点信息创建一个贴图纹理,然后贴到一个巨型上,但是不管怎么弄都没法显示这个贴图。
import com.sun.opengl.util.texture.Texture;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;import java.awt.Frame;
import java.awt.Graphics2D;import java.awt.HeadlessException;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.nio.ByteBuffer;import javax.media.opengl.GL;import javax.media.opengl.GLAutoDrawable;import javax.media.opengl.GLCanvas;import javax.media.opengl.GLCapabilities;import javax.media.opengl.GLEventListener;public class My_opengl extends Frame implements GLEventListener, Runnable {    GLCanvas glcanvas;             //类似java.awt.Canvas, GLCanvas主要用来显示各种OPENGL的效果 
    GLCapabilities capabilities;   //指定了一套OpenGL的功能:渲染内容必须支持,如色彩深度,以及立体是否已启用。 
    Thread myThread = new Thread(this);    public My_opengl() throws HeadlessException {
        this.capabilities = new GLCapabilities();        //实例化capabilities 
        this.glcanvas = new GLCanvas(capabilities);      //实例化glcanvas 
        this.glcanvas.addGLEventListener(this);          //给glcanvas添加GL事件处理 
        this.add(glcanvas, BorderLayout.CENTER);         //给窗体添加一个Component:glcanvas 
        this.addWindowListener(new WindowAdapter() {     //给窗体添加关闭事件             public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        myThread.start();                                //主线程开始 
    }    public static void main(String[] args) {
        My_opengl f = new My_opengl();
        f.setTitle("移动的矩型");
        f.setSize(600, 480);
        f.setVisible(true);
    }//每次显示时都会调用的,他一般在一个线程里,不停的画,因为他只显示一次,当屏幕进行刷新时就没有了,
    @Override
    public void display(GLAutoDrawable drawable) {
        GL gl = drawable.getGL();
        gl.glClearColor(0.0f, 0.0f, 0.6f, 1.0f);  // 设置刷新背景色
        gl.glClear(GL.GL_COLOR_BUFFER_BIT);// 刷新背景
        gl.glColor3f(1, 0, 0);
        drawPng(gl);
        gl.glFlush();
        gl.glDisable(GL.GL_TEXTURE_2D);    }
    int checkImageW = 64;
    int checkImageH = 64;
    byte[] checkImage = new byte[checkImageW * checkImageH * 4];    private void makeCheckImage() {
        int index = 0;
        for (int i = 0; i < checkImageW; i++) {
            for (int j = 0; j < checkImageH; j++) {
                for (int z = 0; z < 4; z++) {
                    if (z == 0) {
                        checkImage[index] = (byte) 255;
                    } else if (z == 1) {
                        checkImage[index] = (byte) 255;
                    } else if (z == 2) {
                        checkImage[index] = (byte) 255;
                    } else if (z == 3) {
                        checkImage[index] = (byte) 255;
                    }
                    index++;
                }
            }
        }
    }
    Texture texture;    public void drawPng(GL gl) {
        gl.glEnable(GL.GL_TEXTURE_2D);//启动纹理映射
        //----------------------新添加部分-------------------
        gl.glEnable(GL.GL_BLEND); //允许混合
        gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
        gl.glAlphaFunc(GL.GL_GREATER, 0);
        gl.glEnable(GL.GL_ALPHA);        gl.glPushMatrix();
        gl.glTranslatef(0f, 0f, 0f);    //向内(Z轴负方向)移动6
        
        //绑定图片
        gl.glBindTexture(gl.GL_TEXTURE_2D, texname[0]);
        gl.glTexEnvf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
        gl.glBegin(GL.GL_QUADS);
        gl.glColor3f(1, 0, 0);
        
        // 前面
        gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(0f, 0f, 1.0f);
        gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(32, 0f, 1.0f);
        gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(32, 32, 1.0f);
        gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(0, 32, 1.0f);        gl.glEnd();
        gl.glPopMatrix();
    }
    public byte[] getPixelByte(char c) {
        BufferedImage image = new BufferedImage(16, 16, BufferedImage.TYPE_3BYTE_BGR);
        Graphics2D g2 = image.createGraphics();
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, 16, 16);
        g2.setColor(Color.BLACK);
        Font font = new Font("新宋体", 0, 16);
        g2.setFont(font);
        g2.scale(1, -1);
        g2.drawString(c + "", 0, 0 - 2);
        int[] RGB = image.getRGB(0, 0, 16, 16, null, 0, 16);        byte[] pixelData = new byte[16 * 2];
        for (int i = 0; i < pixelData.length; i++) {
            int hex = 0;
            for (int j = 0; j < 8; j++) {
                String hexRGB = Integer.toHexString(RGB[i * 8 + j]);
                if (!"ffffffff".equals(hexRGB)) {
                    hex += Math.pow(2, 7 - j);
                    System.out.print("#");
                } else {
                    System.out.print(" ");
                }
            }
            if ((i + 1) % 2 == 0) {
                System.out.println();
            }
            pixelData[i] = (byte) hex;
        }
        return pixelData;
    }
    int listname;    @Override
    public void displayChanged(GLAutoDrawable drawable, boolean arg1,
            boolean arg2) {
    }
    
//初始化时调用,给GL 赋值
    @Override
    public void init(GLAutoDrawable drawable) {
        GL gl = drawable.getGL();
        makeCheckImage();
        gl.glShadeModel(gl.GL_FALSE);
        gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 3);
        gl.glGenTextures(1, texname, 0);
        gl.glBindTexture(gl.GL_TEXTURE_2D, texname[0]);
        gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, 64, 64, 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, ByteBuffer.wrap(checkImage));
        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
    }
    int[] texname = new int[]{0};
    
//当窗口大小进行改变时调用,初次显示也算,
    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
        GL gl = drawable.getGL();
        gl.glViewport(0, 0, 600, 480);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glOrtho(0, 100, 0, 100, 10, -10);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
    }    @Override
    public void run() {
        while (true) {
            glcanvas.display();                  //主线程不停调用display() 
            try {
                myThread.sleep(20);             //每执行完一次休息20毫秒 
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }
}