想用数组里面存储的像素点信息创建一个贴图纹理,然后贴到一个巨型上,但是不管怎么弄都没法显示这个贴图。
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();
}
}
}
}
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();
}
}
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货