java - Java LWGJL opengl 缓冲区数据
问题描述
我有一个类代表我的四边形的所有数据,每个类都有一个位置和一个颜色。我怎么能将该类的数组传递给opengl?我试过这个:
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBO);
GL15.glBufferData(VBO, MAX_QUADS, GL15.GL_DYNAMIC_DRAW);
ByteBuffer data = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY, null);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
但现在我不知道如何将数组解析为字节,以便可以传递给 GPU。这是数组:
Quad.Data[] vertexData = new Quad.Data[MAX_QUADS];
这是具有位置和颜色的类:
public class Data {
public Vector3f position;
public Vector4f color;
}
解决方案
您可以将数据类的浮点值放在 FloatBuffer 中,然后使用 glBufferData() 将其传递给 OpenGL,如果 Buffer 已经分配,则使用 glBufferSubData 将其传递给 OpenGL。
使用您的代码,它看起来类似于:
//Creating the FloatBuffer and store the Data
//n = number of floats you want to store, in this case 7 for each Quad;
FloatBuffer buffer = MemoryUtil.memAllocFloat(n);
//Do this for each "Data", thus for each Vertex of your Quad
buffer.put(position.x).put(position.y).put(position.z).put(color.r).put(color.g).put(color.b).put(color.a);
//Don't forget flipping the Buffer before passing it to OpenGL, otherwise you will get an EXCEPTION_ACCESS_VIOLATION
buffer.flip();
//Binding the VBO and allocate it
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER);
GL15.glBufferData(VBO, MAX_QUADS, GL15.GL_DYNAMIC_DRAW);
//Sending the Buffer to OpenGL
GL15.glBufferSubData(0, buffer);
//Unbind the Buffer
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
推荐阅读
- c# - 如何从 ASP.NET Core 3 控制器中访问 IWebHostEnvironment?
- apache-kafka - Kafka - SaslAuthenticationException:无法配置 SaslClientAuthenticator
- python - 具有分类数据的随机森林仅预测一个类别中的数据
- c# - c# 中未知的 WooCommerce API 版本
- sql - oracle通过预先使用组合键的一部分进行连接会产生格式错误的结果?
- sql - 如何为已经创建的表添加外键?
- bash - 在 Unix 中,如果我们列出目录中的文件数。如果未找到文件,如何仅获取输出而不是错误消息
- kubernetes - Kubernetes Service LoadBalancer“EXTERNAL-IP”仍然是“
" 而不是使用工作节点的公共 IP 地址 - c# - c#母版页中的静态字符串问题
- bash - 如何使用 {1..$VAR} 使 printf 正常工作