从零开始Java游戏引擎[LWJGL](4)-使用索引缓存

如果只是有顶点缓冲的话(即使有glDrawArray进行绘制),会存储顶点冗余。例如:显示一个矩形,要画2个三角形,每个三角形3个顶点,就要准备6个顶点传递到glDrawArray函数中。其实,画一个矩形只需要4个顶点就可以了,不是吗?

你可能认为,这有什么的?不就是多传递了2个顶点吗?其实不然,你现在只是画2个三角形,当你画一个吃鸡的场景时,里面的人物,地形,建筑,枪械等等,所有的物体都需要使用三角形进行绘制,如果存储顶点冗余的话,则会降低帧率。

为什么会降低帧率?因为在渲染的时候,顶点数据是从CPU发送到GPU进行顶点计算的,GPU的内存(显存)是十分宝贵的,想想现在的显卡卖多贵。所以,我们要利用有限的显存,绘制尽可能多的物体,且在运行的帧率范围内。

说了这么多,就是让你不要再使用glDrawArray了。当然,如果你画GUI的话,那无所谓。反正也没多少个点嘛。

ok。开始代码了。

修改Loader.java的代码,绑定索引缓存。


// 增加 int[] indices
public RawModel loadToVAO(float[] positions, int[] indices){	
    int vaoID = createVAO();
    bindIndicesBuffer(indices);
    //配置vao
    storeDataInAttributesList(0, 3,positions);
    unbindVAO();
    return new RawModel(vaoID, indices.length);
}

// 增加绑定索引缓存函数
private void bindIndicesBuffer(int[] indices){
    int vboID = GL15.glGenBuffers();
    vbos.add(vboID);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboID);
    IntBuffer buffer = storeDataInIntBuffer(indices);
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
}

// 替换Renderer.java中的render函数中的glDrawArray函数
    //GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, model.getVertexCount());
    GL11.glDrawElements(GL11.GL_TRIANGLES, model.getVertexCount(),GL11.GL_UNSIGNED_INT,0);
// 测试

// 现在我们只需要4个顶点就够了
float[] positions = {
        -0.5f,0.5f,0.0f,
        -0.5f,-0.5f,0.0f,
        0.5f,-0.5f,0.0f,
        0.5f,0.5f,0.0f
		};
		
int []indices = {
        0,1,3,
        3,1,2


RawModel model =  loader.loadToVAO(positions,indices);

运行效果和之前的一样。

ok。结束。

下篇预告:使用Shader。

源码下载

欢迎大家关注我的公众号【OpenGL编程】,定期分享OpenGL相关的3D编程教程、算法、小项目。欢迎大家一起交流。

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值