Java 在Android上正确生成Opengl转换反馈

Java 在Android上正确生成Opengl转换反馈,java,android,opengl-es,transform-feedback,Java,Android,Opengl Es,Transform Feedback,我一直在努力在android上创建一个有效的转换反馈。到目前为止,我得到的最接近的问题与这个被否决的问题类似: 我要创建的内容: 从顶点缓冲区对象渲染为变换反馈。然后使用最终图形着色器从变换反馈的缓冲区进行渲染 我如何理解整个概念: 我了解该程序与varyings的链接方式(我遵循了以下示例:) 在Android上,您必须提供一个“虚拟”片段着色器,否则程序链接将失败而没有消息 在拥有一个链接程序之后,以下是步骤:(代码是java) 创建VBO以从中读取数据 int[] vbo = new in

我一直在努力在android上创建一个有效的转换反馈。到目前为止,我得到的最接近的问题与这个被否决的问题类似:

我要创建的内容: 从顶点缓冲区对象渲染为变换反馈。然后使用最终图形着色器从变换反馈的缓冲区进行渲染

我如何理解整个概念: 我了解该程序与varyings的链接方式(我遵循了以下示例:) 在Android上,您必须提供一个“虚拟”片段着色器,否则程序链接将失败而没有消息

在拥有一个链接程序之后,以下是步骤:(代码是java)

  • 创建VBO以从中读取数据

    int[] vbo = new int[1];
    glGenBuffers(1, vbo, 0);
    glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
    glBufferData(GL_ARRAY_BUFFER, bufferLength, data, GL_STATIC_READ);
    
  • 创建变换反馈缓冲区

    int[] tbo = new int[1];
    glGenBuffers(1, tbo, 0);
    glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tbo[0]);
    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, bufferLength, null, GL_DYNAMIC_COPY);
    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tbo[0]);
    
  • 每次我想进行计算时,我都会这样称呼:

    glUseProgram(calculationShaderProgram);
    // For all input variables:
    glEnableVertexAttribArray(inputAttrib);
    glVertexAttribPointer(...
    
    // To bind the transform feedback buffer as the destination
    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo[0]);
    
    glEnable(GL_RASTERIZER_DISCARD);
    glBeginTransformFeedback(GL_POINTS);
    glDrawArrays(GL_POINTS, 0, vertexCount);
    glEndTransformFeedback();
    glDisable(GL_RASTERIZER_DISCARD);
    
    glFinish(); // I know this is slow to call, but for simplicity's sake
    
  • 之后,我应该能够绘制缓冲区的内容:

    glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tbo[0]);
    
    glUseProgram(drawShaderProgram);
    // For all input variables:
    glEnableVertexAttribArray(inputAttrib);
    glVertexAttribPointer(...
    
    // Set uniforms ...
    glDrawArrays(GL_POINTS, 0, vertexCount); // There is no glDrawTransformFeedback on android
    
  • 现在,我的问题是:
    • 在这个过程中是否存在固有的错误
    • 即使我没有画任何东西,计算部分也会弄乱我的设备屏幕,这有什么原因吗?(显示随机颜色或android更新的图标,如电池和网络)
    • 使用顶点数组对象与使用GL_变换_反馈_缓冲区时是否与使用GL_数组_缓冲区时相同

    这花了一些时间,但这里是解决方案。我将把它留在这里,因为这些部分没有在任何可用的OpenGL相关书籍中正确解释

  • 当从变换反馈缓冲区(上面的步骤4)绘制时,无论它是否用作变换反馈缓冲区,都必须将其绑定为GL_数组_缓冲区,就像从顶点缓冲区对象绘制一样

    glBindBuffer(GL_ARRAY_BUFFER, tbo[0]);
    
  • 使用默认帧缓冲区时

    glBindFrameBuffer(GL_FRAMEBUFFER, 0);
    
    或者根本没有设置,不允许使用

    glEnable(GL_RASTERIZER_DISCARD);
    // Draw to Transform feedback
    // ...
    glDisable(GL_RASTERIZER_DISCARD);
    
    (在步骤3中)不首先调用

    glClear(GL_COLOR_BUFFER_BIT);
    
    否则,您将看到随机模式作为背景。在每个绘制周期之前清除一次GLC是不够的