java - GLES30.glGetBufferSubData 在哪里?如何读取转换反馈数据opengles 3.0

标签 java android opengl-es transform-feedback

所以我正在关注我能找到的关于转换反馈的最简单的例子之一,here , 并将其转换为 Android/Java,但 Android 似乎缺少 OpenGL ES 3.0 中可用的 glGetBufferSubData 函数。

我试过搜索 Android Source看看在 JNI 下调用另一个方法时是否使用了这个方法,但我不确定我是否正在寻找正确的地方。

如果此函数不存在,我如何从转换反馈中读取数据?我查看了 glGetTransformfeedbackVaryingglGetBufferPointervglReadBuffer,但似乎没有一个符合我的要求。

这是我的代码:

import com.harmonicprocesses.penelopefree.openGL.MyGLRenderer;
import android.opengl.GLES30;
import android.util.Log;

import java.nio.ByteBuffer;
import java.nio.FloatBuffer;

/**
* Created by izzy on 6/24/15.
*/
public class TransformFeedback {


// Vertex shader
private final String vertexShaderSrc =

        "in float inValue;\n" +
        "out float outValue;\n" +

        "void main() {\n" +
        "    outValue = sqrt(inValue);\n" +
        "}\n";

private final int mProgram;


public TransformFeedback{

    // Compile shader
    int vertexShader = MyGLRenderer.loadShader(GLES30.GL_VERTEX_SHADER,
            vertexShaderSrc);

    // Create program and specify transform feedback variables
    mProgram = GLES30.glCreateProgram();
    GLES30.glAttachShader(mProgram, vertexShader);

    //const GLchar* feedbackVaryings[] = { "outValue" };
    GLES30.glTransformFeedbackVaryings(mProgram, 1, {"outValue"}, GLES30.GL_INTERLEAVED_ATTRIBS);

    GLES30.glLinkProgram(mProgram);
    GLES30.glUseProgram(mProgram);

    // Create VAO
    int[] vao = new int[1];
    GLES30.glGenVertexArrays(1, vao, 0);
    GLES30.glBindVertexArray(vao[0]);

    // Create input VBO and vertex format
    int bufferLength = 5 * 4; //5 floats 4 bytes each
    ByteBuffer bb = ByteBuffer.allocateDirect(bufferLength);
    FloatBuffer data = bb.asFloatBuffer();
    float[] floatData = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f };
    data.put(floatData);
    data.position(0);


    int[] vbo = new int[1];
    GLES30.glGenBuffers(1, vbo, 0);
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vbo[0]);
    GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, bufferLength, data, GLES30.GL_STATIC_DRAW);

    int inputAttrib = GLES30.glGetAttribLocation(mProgram, "inValue");
    GLES30.glEnableVertexAttribArray(inputAttrib);
    GLES30.glVertexAttribPointer(inputAttrib, 1, GLES30.GL_FLOAT, false, 0, 0);

    // Create transform feedback buffer
    int[] tbo = new int[1];
    GLES30.glGenBuffers(1, tbo, 0);
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, tbo[0]);
    GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, bufferLength, null, GLES30.GL_STATIC_READ);

    // Perform feedback transform
    GLES30.glEnable(GLES30.GL_RASTERIZER_DISCARD);

    GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tbo[0]);

    GLES30.glBeginTransformFeedback(GLES30.GL_POINTS);
    GLES30.glDrawArrays(GLES30.GL_POINTS, 0, 5);
    GLES30.glEndTransformFeedback();

    GLES30.glDisable(GLES30.GL_RASTERIZER_DISCARD);

    GLES30.glFlush();

    // Fetch and print results
    float feedback[] = new float[5];
    GLES30.glGetBufferSubData(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, bufferLength, feedback);

    Log.e("TransformFeedback", String.format("%f %f %f %f %f\n", feedback[0], feedback[1], feedback[2], feedback[3], feedback[4]));

}

我的最终实现不一定需要读出数据,只需在下一次传递(反馈)时在着色器中使用它。但这确实是第一步。

最佳答案

glGetBufferSubData() 在 ES 3.0 或 ES 3.1 中不可用。因此,在这种情况下,Android Java 绑定(bind)中没有遗漏任何内容。

在 ES 3.0 中用于读取回缓冲区数据的函数是 glMapBufferRange() .在 C/C++ 绑定(bind)中,这会返回一个指向包含缓冲区内容的 CPU 可读内存的指针。阅读完毕后不要忘记调用 glUnmapBuffer()

Android Java bindings ,该函数返回类型为 Buffer 的对象。由于您不能直接从缓冲区中读取,因此您必须先将其转换为 ByteBuffer。这并没有真正记录下来,但我在这里的回答解释了为什么我相信这种类型转换是安全的:Safe usage of glMapBufferRange() on Android/Java .

关于java - GLES30.glGetBufferSubData 在哪里?如何读取转换反馈数据opengles 3.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31054351/

相关文章:

java - 是否有带有 SQL 后端的 Javamail 商店?

具有最高优先级的Java线程不会被执行

java - Activity 中多个 fragment 的方向发生变化?

iphone - 如何使用 glDrawTex*

java - 如何向用户显示一长串 Web 服务结果?

java - hibernate 没有获取序列的 next_val

android - ItemClick 上的 ListFragment

android-如何检测我的应用程序错误并修复它们

android - 在android上使用OpenGL绘制文字

android - 使用 API 8 旋转广告 View