jogl中使用顶点数组:
package test.array;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.nio.FloatBuffer;
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;
import javax.media.opengl.glu.GLU;
import javax.swing.SwingUtilities;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import com.sun.opengl.util.BufferUtil;
import com.sun.opengl.util.FPSAnimator;
public class BasicFrame implements GLEventListener {
static Display display;
static Shell shell;
static FPSAnimator animator;
/**
* 数组,包含了meshArray.length/2对二维坐标
*/
protected final static float[] meshArray = { 10, 10,
20, 20,
20, 30,
40, 40,
50, 50,
50, 60,
70, 70,
80, 80,
80, 90 };
/**
* 由数组meshArray转换成的缓存buffer
*/
protected static FloatBuffer meshArrayBuffer;
public Frame creatSWT() {
display = Display.getDefault();
shell = new Shell();
shell.setSize(550, 550);
shell.setText("SWT_OpenGL");
shell.setLayout(null);
final Composite compSWT = new Composite(shell, SWT.EMBEDDED);// SWT.EMBEDDED必须
compSWT.setSize(500, 500);
compSWT.setLocation(0, 0);
final java.awt.Frame frame = SWT_AWT.new_Frame(compSWT);
frame.setLayout(new FlowLayout());
shell.layout();
shell.open();
return frame;
}
public static void main(final String[] args) {
final GLCapabilities capabilities = new GLCapabilities();
final GLCanvas glcanvas = new GLCanvas(capabilities);// 创建画布
final BasicFrame basicFrame = new BasicFrame();
glcanvas.addGLEventListener(basicFrame);// basicFrame重写了GLEventListener的画图的方法
glcanvas.setSize(500, 500);
animator = new FPSAnimator(glcanvas, 10, true);
final Frame frame = basicFrame.creatSWT();
frame.add(glcanvas);// 把画布放进 窗口内
SwingUtilities.invokeLater(
new Runnable() {
@Override
public void run() {
animator.start(); // 开始动画线程
}
}
);
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
animator.stop();
display.dispose();
}
@Override
public void init(final GLAutoDrawable drawable) { // 初始函数
final GL gl = drawable.getGL();
final GLU glu = new GLU();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1f); // 设置背景颜色
gl.glViewport(0, 0, 100, 100); // 视点大小
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
// 裁剪横坐标(left,right)纵坐标(bottom,top)范围内的视图,放进GL可见视图中
glu.gluOrtho2D(-1.0, 101, -1.0, 101.0); // 使坐标系统出现在GL里,此时屏幕中最左面是坐标0,右面是500,最下0,嘴上500
final boolean VBOsupported = gl.isFunctionAvailable("glGenBuffersARB") && gl.isFunctionAvailable("glBindBufferARB")
&& gl.isFunctionAvailable("glBufferDataARB") && gl.isFunctionAvailable("glDeleteBuffersARB");
System.out.println("Is VBO supported : " + VBOsupported);
gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
meshArrayBuffer = BufferUtil.newFloatBuffer(meshArray.length);
for (int i = 0; i < meshArray.length; i++) {
meshArrayBuffer.put(meshArray[i]);// 把数组的元素按顺序逐个放进buffer中
}
meshArrayBuffer.flip();
gl.glVertexPointer(2, GL.GL_FLOAT, 0, meshArrayBuffer);// 以size个数组元素为一个单位放进缓存buffer
}
@Override
public void display(final GLAutoDrawable drawable) { // 画图函数
final GL gl = drawable.getGL(); // 从GLAutoDrawable获取GL
gl.glClear(GL.GL_COLOR_BUFFER_BIT); // 填充背景颜色
gl.glColor3f(1.0f, 0.0f, 0.0f); // 设置GL的画图颜色,也就是画刷的颜色
gl.glPointSize(10);
gl.glDrawArrays(GL.GL_TRIANGLES, 0, 9);// 以mode方式(点、三角形、线)画数组缓存中从第first开始的count个数据元素
// gl.glDrawArrays(GL.GL_POINTS, 0, 9);// 以mode方式(点、三角形、线)画数组缓存中从第first开始的count个数据元素
// ************************************************************************
// 此段代码完全可由gl.glDrawArrays(GL.GL_TRIANGLES, 0, 9);这句代码替换,时等价的
// gl.glBegin(GL.GL_TRIANGLES);
// gl.glArrayElement(0);
// gl.glArrayElement(1);
// gl.glArrayElement(2);
// gl.glArrayElement(3);
// gl.glArrayElement(4);
// gl.glArrayElement(5);
// gl.glArrayElement(6);
// gl.glArrayElement(7);
// gl.glArrayElement(8);
// gl.glEnd();
// ************************************************************************
}
@Override
public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) {
}
@Override
public void displayChanged(final GLAutoDrawable drawable, final boolean modeChanged, final boolean deviceChanged) {
}
}
jogl中使用顶点数组。