栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[Java] [OpenGL ES3.2] BufferUtil VBO和VAO的使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[Java] [OpenGL ES3.2] BufferUtil VBO和VAO的使用

BufferUtil.java
package com.Diamond.gl04;

import android.opengl.GLES32;
import java.nio.Buffer;
import java.nio.FloatBuffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;

public class BufferUtil {
	public static ByteBuffer newNativeByteBuffer(int capacity) {
		ByteBuffer bb = ByteBuffer.allocateDirect(capacity);
		bb.order(ByteOrder.nativeOrder());
		return bb;
	}
	public static FloatBuffer toFloatBuffer(float[] array) {
		FloatBuffer fb = newNativeByteBuffer(array.length * 4).asFloatBuffer();
		fb.put(array).position(0);
		return fb;
	}
	public static IntBuffer toIntBuffer(int[] array) {
		IntBuffer ib = newNativeByteBuffer(array.length * 4).asIntBuffer();
		ib.put(array).position(0);
		return ib;
	}
	
	
	
    public static int genBuffer() {
		int[] buffer = new int[1];
		GLES32.glGenBuffers(1,buffer,0);
		return buffer[0];
	}
	public static int[] genBuffers(int bufferNumber) {
		bufferNumber = Math.max(bufferNumber,1);
		int[] buffers = new int[bufferNumber];
		GLES32.glGenBuffers(bufferNumber,buffers,0);
		return buffers;
	}
	
	public static void bindBuffer(int buffer,int type) {
		if(buffer != 0) {
			GLES32.glBindBuffer(type,buffer);
		}
	}
	public static void bindBuffers(int[] buffers,int type) {
		for(int i : buffers) {
			if(i != 0) {
			GLES32.glBindBuffer(type,i);
			}
		}
	}
	public static void bindBuffer(int type) {
		GLES32.glBindBuffer(type,0);
	}
	
	public static void bufferData(int type,int size,Buffer data,int usage) {
		GLES32.glBufferData(type,size,data,usage);
	}
	
	public static void deleteBuffer(int buffer) {
		GLES32.glDeleteBuffers(1,new int[]{ buffer },0);
	}
	public static void deleteBuffers(int[] buffers) {
		GLES32.glDeleteBuffers(buffers.length,buffers,0);
	}
	
	
	
	public static int genVertexArray() {
		int[] vao = new int[1];
		GLES32.glGenVertexArrays(1,vao,0);
		return vao[0];
	}
	public static int[] genVertexArrays(int VAONumber) {
		VAONumber = Math.max(VAONumber,1);
		int[] VAOs = new int[VAONumber];
		GLES32.glGenVertexArrays(VAONumber,VAOs,0);
		return VAOs;
	}
	
	public static void bindVertexArray(int vao) {
		GLES32.glBindVertexArray(vao);
	}
	public static void bindVertexArray() {
		GLES32.glBindVertexArray(0);
	}
	
	public static void deleteVertexArray(int vao) {
		if(vao != 0) {
			GLES32.glDeleteVertexArrays(1,new int[]{ vao },0);
		}
	}
	public static void deleteVertexArrays(int[] VAOs) {
		GLES32.glDeleteVertexArrays(VAOs.length,VAOs,0);
	}
}

使用例

改进后的Axis.java

package com.Diamond.gl04;

import android.opengl.GLES32;
import java.nio.FloatBuffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import android.renderscript.Float4;
import android.opengl.Matrix;
import android.renderscript.Matrix4f;

public class Axis extends MyObject {
    public float[] vertices,colors;
	public GLES32 gl;
	public int VAO;
	
	public Axis() {
		vertices = new float[]{
			-100,0,0,
			100,0,0,
			0,-100,0,
			0,100,0,
			0,0,-100,
			0,0,100
		};
		
		colors = new float[]{
			1,0,0,
			1,0,0,
			0,1,0,
			0,1,0,
			0,0,1,
			0,0,1
		};
		
		BufferUtil bu = new BufferUtil();
		VAO = bu.genVertexArray();
		bu.bindVertexArray(VAO);
		int[] VBOs = bu.genBuffers(2);
		
		bu.bindBuffer(VBOs[0],gl.GL_ARRAY_BUFFER);
		bu.bufferData(gl.GL_ARRAY_BUFFER,vertices.length * 4,bu.toFloatBuffer(vertices),gl.GL_STATIC_DRAW);
		gl.glEnableVertexAttribArray(0);
		gl.glVertexAttribPointer(0,3,gl.GL_FLOAT,false,3 * 4,0);
		
		bu.bindBuffer(VBOs[1],gl.GL_ARRAY_BUFFER);
		bu.bufferData(gl.GL_ARRAY_BUFFER,colors.length * 4,bu.toFloatBuffer(colors),gl.GL_STATIC_DRAW);
		gl.glEnableVertexAttribArray(1);
		gl.glVertexAttribPointer(1,3,gl.GL_FLOAT,false,3 * 4,0);
		
		bu.bindVertexArray();
		bu.deleteBuffers(VBOs);
	}
	
	public void draw(Program program) {
		program.setUniform("u_model",getModelMatrixArray());
		BufferUtil.bindVertexArray(VAO);
		gl.glDrawArrays(gl.GL_LINES,0,6);
		BufferUtil.bindVertexArray();
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/709312.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号