我無法從glMapBufferRangeglMapBufferRange返回全零Android中
映射一個緩衝器中讀出。如果我只是把一些數據緩衝區
// Create input VBO and vertex format
int bufferLength = 5 * 4; //5 floats 4 bytes each
FloatBuffer data = ByteBuffer.allocateDirect(bufferLength)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
float[] floatData = { 1.0f, 4.0f, 9.0f, 16.0f, 25.0f };
data.put(floatData).position(0);
生成一個數組緩存在GL並填寫與數據
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);
MyGLRenderer.checkGlError(TAG + " glBufferData GL_ARRAY_BUFFER");
當使用glMapBufferRange
我映射緩衝區和讀取結果
Buffer mappedBuffer = GLES30.glMapBufferRange(GLES30 .GL_ARRAY_BUFFER,
0, bufferLength, GLES30.GL_MAP_READ_BIT);
if (mappedBuffer!=null){
FloatBuffer transformedBuffer = ((ByteBuffer) mappedBuffer).asFloatBuffer();
MyGLRenderer.checkGlError(TAG + " glMapBufferRange");
Log.d(TAG, String.format("pre-run input values = %f %f %f %f %f\n", transformedBuffer.get(),
transformedBuffer.get(), transformedBuffer.get(), transformedBuffer.get(), transformedBuffer.get()));
transformedBuffer.position(0);
}
GLES30.glUnmapBuffer(GLES30.GL_ARRAY_BUFFER);
的logcat的讀取所有零
D/TransformFeedback﹕ pre-run input values = 0.000000 0.000000 0.000000 0.000000 0.000000
,不會產生任何其他錯誤,我真的不知道要檢查什麼。我試過GLES30.glCopyBufferSubData(GLES30.GL_ARRAY_BUFFER, GLES30.GL_COPY_READ_BUFFER, 0, 0, bufferLength);
和映射GL_COPY_READ_BUFFER並得到了相同的結果。
我在支持OpenGL ES 3.1的Nexus 6上進行測試,因此該功能應該存在。
這個question建議刪除glfw中的OPENGL_FORWARD_COMPAT提示,在MyGLSurfaceView中是否會出現類似的情況?
您可以檢查這些值是否恰好爲零,或者當您打印它們時只顯示爲零?例如,記錄比較值「== 0.0f」的結果。我有一個理論...... –
這是正確的先生,你是一個天才!我假設你的理論是緩衝區需要翻轉(或設置爲大/小edian),如何做到這一點的建議是受歡迎的,我現在試圖找出它。 'mappedBuffer.flip()'在嘗試轉換爲浮點緩衝區(下溢)時導致崩潰。 – HPP
第一個元素的值是4.6006E-41 – HPP