【问题标题】:How to avoid creating of new floatBuffer every time when I change color or coordinates in OpenGL ES 2.0?每次在 OpenGL ES 2.0 中更改颜色或坐标时,如何避免创建新的 floatBuffer?
【发布时间】:2014-07-31 16:40:19
【问题描述】:

我有非常简单的顶点着色器,例如:

uniform mat4 u_Matrix;
uniform float u_PointSize;

attribute vec4 a_Position;
attribute vec4 a_Color;

varying vec4 v_Color;

void main() {
   v_Color = a_Color;
   gl_PointSize = u_PointSize;
   gl_Position = u_Matrix * a_Position;
}

然后我像这样初始化浮点缓冲区:

floatBuffer = ByteBuffer
.allocateDirect(vertexData.length * Constants.BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer()
.put(vertexData);

其中 vertexData 包含例如 (X, Y, R, G, B) 之类的值:

float[] vertexData = new float[] {100, 100, 1f, 0f, 0f}

当我想改变坐标(在某些情况下我真的需要它并且使用变换矩阵不是解决方案)或颜色时,我需要:

  • 更改 vertexData 数组中的必要值
  • 创建新的字节缓冲区

这看起来是个糟糕的解决方案,因为每次我想更改颜色/坐标时,它都会通过调用 ByteBuffer.allocateDirect(..) 创建新的字节缓冲区。

您能否澄清一下哪种方式可能更好?

我考虑过使用制服作为颜色,并在每次需要更改/恢复颜色时使用 glUniformMatrix4fv(..),但我不确定这也是好方法。

【问题讨论】:

    标签: android opengl-es-2.0


    【解决方案1】:

    这段代码可以避免每次更新顶点数据时调用 allocate。我从未尝试在这段代码中使用 allocateDirect,但它可能会起作用。

    // allocate
    FloatBuffer mVertexData = FloatBuffer.allocate(size);
    
    // update
    for (int i = 0; i < vertexNum; ++i) {
        mVertexData.put( vertexData );
    }
    mVertexData.rewind();
    
    // draw    
    gl.glBufferData(gl.GL_ARRAY_BUFFER, size, mVertexData, gl.GL_DYNAMIC_DRAW);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多