jogl中使用顶点数组

来源:互联网 发布:ejd网络黄金 编辑:程序博客网 时间:2024/04/28 13:30

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() {@Overridepublic void run() {animator.start(); // 开始动画线程}});while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}animator.stop();display.dispose();}@Overridepublic 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,嘴上500final 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}@Overridepublic void display(final GLAutoDrawable drawable) { // 画图函数final GL gl = drawable.getGL(); // 从GLAutoDrawable获取GLgl.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();// ************************************************************************}@Overridepublic void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) {}@Overridepublic void displayChanged(final GLAutoDrawable drawable, final boolean modeChanged, final boolean deviceChanged) {}}



jogl中使用顶点数组。

0 0
原创粉丝点击