gpt4 book ai didi

android - 在 openGL 中改变三角坐标

转载 作者:行者123 更新时间:2023-11-28 06:48:06 25 4
gpt4 key购买 nike

我的 Triangle 类中有一个 draw() 方法,如下所示:


protected void draw() {
mPositionHandle = GLES20.glGetAttribLocation(mProgram, "a_Position");
mColorHandle = GLES20.glGetAttribLocation(mProgram, "a_Color");

GLES20.glUseProgram(mProgram);

vertexBuffer.position(0);
GLES20.glVertexAttribPointer(mPositionHandle, 2, GLES20.GL_FLOAT, false,
0, vertexBuffer);

GLES20.glEnableVertexAttribArray(mPositionHandle);

vertexBuffer.position(6);
GLES20.glVertexAttribPointer(mColorHandle, 4, GLES20.GL_FLOAT, false,
0, vertexBuffer); // NOTE: A stride of 0 since the data is packed.

GLES20.glEnableVertexAttribArray(mColorHandle);

GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);

GLES20.glDisableVertexAttribArray(mPositionHandle);
GLES20.glDisableVertexAttribArray(mColorHandle);
}

draw() 方法在 onDrawFrame() 中不断被调用,因此我的三角形不断被绘制。我希望能够改变三角形的坐标。注意:我正在像这样初始化我的顶点缓冲区:


private void init() {
triangleVertexData = concat(triangleCoords, color);

ByteBuffer bb = ByteBuffer.allocateDirect(triangleVertexData.length * 4);

bb.order(ByteOrder.nativeOrder());

vertexBuffer = bb.asFloatBuffer();

vertexBuffer.put(triangleVertexData);

vertexBuffer.position(0);
}

我的 triangleVertexData 的形式是 {x, y, x, y, x, y, r, g, b, a, r, g, b, a, r, g, b, a}


我的问题是,如何实现 changeCoordinates(float[] p1, float[] p2, float[] p3); 方法?

到目前为止,这是我想出的:

protected void changeCoords(float[] p1, float[] p2, float[] p3) {

float[] coords = new float[] {p1[0], p1[1],
p2[0], p2[1],
p3[0], p3[1]};

triangleCoords = coords;

triangleVertexData = concat(triangleCoords, color);

vertexBuffer.clear();

vertexBuffer.put(triangleVertexData);

vertexBuffer.position(0);
}

但是这不起作用,我随机在 put() 行收到 BufferOverflowException,我不知道为什么。

最佳答案

我认为异常的原因是方法changeCoords()draw() 没有同步。请注意,您正在此处的 draw() 方法中修改 vertexBuffer:vertexBuffer.position(6);。如果紧接着 changeCoords() 被安排,那就有问题了。

回复评论:

是的。在 changeCoords 方法中执行语句 vertexBuffer.put(triangleVertexData) 之前,如果 draw() 被调用,它将只剩下 12 个 vertexBuffer 中。

您可以尝试以下操作之一:

  • 在离开draw 方法之前将vertexBuffer 的位置设置回零。可能就在 ..glVertexAttribPointer(mColorHandle, 4,... 语句之后。
  • 为每个顶点和颜色使用单独的缓冲区。

其他我可能应该注意的事情..

  • 尝试重新使用数组。不要过于频繁地分配它们。
  • 如果适合您的需要,请查看用于复制数组的 System.arraycopy
  • 绝对确定,您不想使用 Jin 提到的 translateMscaleM 实用程序

关于android - 在 openGL 中改变三角坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24558402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com