android opengl是什么,Android OpenGL点云

作者在尝试使用OpenGL ES通过顶点缓冲区绘制点云时遇到问题,代码中错误地使用了`glDrawElements`函数,导致程序崩溃。解决方法是使用`glDrawArrays`代替`glDrawElements`,因为不需要索引数组。此外,代码中提供了用于设置顶点缓冲区的数据和步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我一直在努力使用

gl.glDrawElements(GL10.GL_POINTS, 4, GL10.GL_UNSIGNED_BYTE, vertexBuffer);

使用顶点缓冲区在我的屏幕上绘制4个点,但我无法使其工作.我想绘制的只是点数,因为最终我想做一个点云显示.如果我有大量的点(最终),顶点缓冲区的方式是什么?它们不会改变,但我想改变它们被观察的视角和尺度.

vertexBuffer设置:

private float vertices[] = {

-3.0f, 1.0f, -2.0f, // 0, Top Left

-3.0f, -1.0f, 0.0f, // 1, Bottom Left

-2.0f, -1.0f, -2.0f, // 2, Bottom Right

-2.0f, 1.0f, 0.0f, // 3, Top Right

};

// Our vertex buffer.

private FloatBuffer vertexBuffer;

ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);

vbb.order(ByteOrder.nativeOrder());

vertexBuffer = vbb.asFloatBuffer();

vertexBuffer.put(vertices);

vertexBuffer.position(0);

这是我当前对我的点的绘制调用(我不想索引,因为形状绘制顺序对我来说无关紧要):

public void draw(GL10 gl) {

// Enabled the vertices buffer for writing and to be used during

// rendering.

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl.glPointSize(3);

// Specifies the location and data format of an array of vertex

// coordinates to use when rendering.

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

gl.glDrawElements(GL10.GL_POINTS, 4,

GL10.GL_UNSIGNED_BYTE, vertexBuffer);

// Disable the vertices buffer.

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

// Disable face culling.

gl.glDisable(GL10.GL_CULL_FACE);

}

当我调用draw()时程序当前崩溃;

谢谢!

解决方法:

你完全错误地使用了glDrawElements.这个函数想要一个包含索引的索引数组到顶点数组而不是顶点数据本身(这就是glVertexPointer的用途).要么使用

private unsigned byte indices[] = { 0, 1, 2, 3 };

...

gl.glDrawElements(GL10.GL_POINTS, 4, GL10.GL_UNSIGNED_BYTE, indices);

但在你的情况下,你只需渲染所有点,不需要任何索引,所以你可以打电话

gl.glDrawArrays(GL10.GL_POINTS, 0, 4);

而不是glDrawElements.

编辑:它崩溃的具体原因是glDrawElements将提供的vertexBuffer解释为4个字节的数组,这些字节引用顶点数据范围之外的顶点(0到3).

标签:point-clouds,android,opengl-es

来源: https://codeday.me/bug/20190903/1796528.html

### OpenGLES 中点云渲染的实现方法 #### 准备工作 为了在 Android 设备上通过 OpenGL ES 渲染点云,首先需要设置好开发环境并引入必要的依赖项。这通常涉及配置 Gradle 文件以支持 OpenGL ES 库。 #### 创建顶点缓冲区对象 (VBO) 对于每一个要绘制的对象,在 GPU 上都需要有一个对应的 VBO 来存储其几何数据。当有多个独立但相似的数据集(比如不同位置上的点)时,可以考虑将这些数据放入同一个大数组中,并一次性上传到 GPU[^3]。 ```java FloatBuffer vertexBuffer; // 假设 pointData 是包含所有点坐标的 FloatBuffer vertexBuffer = ByteBuffer.allocateDirect(pointData.capacity() * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); vertexBuffer.put(pointData); vertexBuffer.position(0); int[] buffers = new int[1]; GLES20.glGenBuffers(1, buffers, 0); vboId = buffers[0]; GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboId); GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexBuffer.capacity() * 4, vertexBuffer, GLES20.GL_STATIC_DRAW); GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); ``` #### 编写着色器程序 编写合适的顶点和片段着色器是至关重要的一步。这里展示了一个简单的例子,其中颜色可以根据距离变化而改变: ```glsl // Vertex Shader Code attribute vec4 a_Position; varying lowp vec4 v_Color; void main(void){ gl_PointSize = 5.0; // 设置点大小 gl_Position = a_Position; } // Fragment Shader Code precision mediump float; uniform sampler2D u_TextureUnit; varying lowp vec4 v_Color; void main(){ gl_FragColor = v_Color; } ``` #### 配置属性与均匀变量 接下来就是把之前定义好的 VBO 和着色器关联起来,以便能够正确地传入数据给 GPU 进行计算。 ```java mProgramHandle = createProgram(vertexShaderCode, fragmentShaderCode); positionHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Position"); colorHandle = GLES20.glGetUniformLocation(mProgramHandle, "uColor"); GLES20.glUseProgram(mProgramHandle); GLES20.glEnableVertexAttribArray(positionHandle); GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer); for(Point p : pointsList){ // Assuming Point has position and color attributes. GLES20.glUniform4fv(colorHandle, 1, p.getColor(), 0); GLES20.glDrawArrays(GLES20.GL_POINTS, indexOffset, numPointsToRender); } ``` 上述代码展示了如何在一个循环内逐个更新每个点的颜色并通过 `GL_POINTS` 类型调用来完成实际绘图操作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值