Где находится GLES30.glGetBufferSubData? как читать преобразование данных отклика opengles 3.0
Итак, я следую одному из простейших примеров, которые я мог найти здесь, о преобразовании обратной связи и преобразовании его в Android/Java, но в Android, похоже, отсутствует glGetBufferSubData
функция доступна в OpenGL ES 3.0.
Я попытался выполнить поиск в источнике Android, чтобы увидеть, используется ли этот метод при вызове другого метода из JNI, но я не уверен, что даже ищу правильное место для этого.
Если эта функция не существует, как я могу прочитать данные из обратной связи преобразования? Я смотрел на glGetTransformfeedbackVarying
, glGetBufferPointerv
а также glReadBuffer
но никто не делает то, что я хочу.
Вот мой код:
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]));
}
Моей окончательной реализации не нужно обязательно считывать данные, просто используйте их в шейдере на следующем проходе (обратная связь). Но это действительно первый шаг.
1 ответ
glGetBufferSubData()
в этом случае недоступно в ES 3.0 или ES 3.1. Так что в этом случае ничего не пропущено в привязках Android Java.
Функция, используемая для чтения данных из буфера в ES 3.0: glMapBufferRange()
, В привязках C/C++ это возвращает указатель на читаемую ЦП память, содержащую содержимое буфера. Не забудьте позвонить glUnmapBuffer()
когда ты закончишь читать.
В привязках Android Java функция возвращает объект типа Buffer
, Поскольку вы не можете напрямую читать из буфера, вам придется привести его к ByteBuffer
первый. Это на самом деле не задокументировано, но мой ответ здесь объясняет, почему я считаю, что приведение типов безопасно: безопасное использование glMapBufferRange() на Android / Java.