Revision bbf09f75
Added by Leszek Koltunski about 7 years ago
src/main/java/org/distorted/examples/feedback/FeedbackRenderer.java | ||
---|---|---|
22 | 22 |
import android.content.res.Resources; |
23 | 23 |
import android.opengl.GLES30; |
24 | 24 |
import android.opengl.GLSurfaceView; |
25 |
import android.util.Log; |
|
26 | 25 |
|
27 | 26 |
import org.distorted.library.Distorted; |
28 | 27 |
import org.distorted.library.program.DistortedProgram; |
... | ... | |
41 | 40 |
class FeedbackRenderer implements GLSurfaceView.Renderer |
42 | 41 |
{ |
43 | 42 |
private final int BYTESFLOAT = 4; |
43 |
private final int POSITION = 3; |
|
44 |
|
|
45 |
private final boolean USEPOINTS=false; |
|
44 | 46 |
|
45 | 47 |
private GLSurfaceView mView; |
46 | 48 |
private DistortedProgram mFeedbackProgram; |
47 |
private int mBufferLength;
|
|
49 |
private int mVertices;
|
|
48 | 50 |
private int[] mVBO, mTBO; |
49 | 51 |
|
50 | 52 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
60 | 62 |
{ |
61 | 63 |
mFeedbackProgram.useProgram(); |
62 | 64 |
|
65 |
int numVertices = (USEPOINTS ? mVertices : 3*(mVertices-2)); |
|
66 |
|
|
63 | 67 |
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mVBO[0]); |
64 |
GLES30.glVertexAttribPointer(mFeedbackProgram.mAttribute[0], 1, GLES30.GL_FLOAT, false, 0, 0);
|
|
68 |
GLES30.glVertexAttribPointer(mFeedbackProgram.mAttribute[0], USEPOINTS ? 1:POSITION, GLES30.GL_FLOAT, false, 0, 0);
|
|
65 | 69 |
GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTBO[0]); |
66 | 70 |
|
67 | 71 |
GLES30.glEnable(GLES30.GL_RASTERIZER_DISCARD); |
68 |
GLES30.glBeginTransformFeedback(GLES30.GL_POINTS);
|
|
69 |
GLES30.glDrawArrays(GLES30.GL_POINTS, 0, mBufferLength);
|
|
72 |
GLES30.glBeginTransformFeedback( USEPOINTS ? GLES30.GL_POINTS : GLES30.GL_TRIANGLES);
|
|
73 |
GLES30.glDrawArrays( USEPOINTS ? GLES30.GL_POINTS : GLES30.GL_TRIANGLE_STRIP, 0, USEPOINTS ? mVertices*POSITION : mVertices);
|
|
70 | 74 |
GLES30.glEndTransformFeedback(); |
71 | 75 |
GLES30.glDisable(GLES30.GL_RASTERIZER_DISCARD); |
72 | 76 |
GLES30.glFlush(); |
73 | 77 |
|
74 |
Buffer mappedBuffer = GLES30.glMapBufferRange(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, mBufferLength*BYTESFLOAT, GLES30.GL_MAP_READ_BIT); |
|
78 |
Buffer mappedBuffer = GLES30.glMapBufferRange(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, numVertices*POSITION*BYTESFLOAT, GLES30.GL_MAP_READ_BIT); |
|
79 |
FloatBuffer fb = ((ByteBuffer) mappedBuffer).order(ByteOrder.nativeOrder()).asFloatBuffer(); |
|
80 |
String msg = ""; |
|
75 | 81 |
|
76 |
if (mappedBuffer!=null) |
|
77 |
{ |
|
78 |
FloatBuffer fb = ((ByteBuffer) mappedBuffer).order(ByteOrder.nativeOrder()).asFloatBuffer(); |
|
79 |
Log.d( "Feedback", String.format("values = %.2f %.2f %.2f %.2f %.2f %.2f\n", fb.get(), fb.get(), fb.get(), fb.get(), fb.get(), fb.get() )); |
|
80 |
} |
|
82 |
for(int i=0; i<numVertices*POSITION; i++) msg += (" "+fb.get(i)); |
|
83 |
|
|
84 |
android.util.Log.d( "Feedback", msg); |
|
81 | 85 |
|
82 | 86 |
GLES30.glUnmapBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER); |
83 | 87 |
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0); |
... | ... | |
111 | 115 |
String header= "#version 300 es\n"; |
112 | 116 |
String[] feedback = { "outValue" }; |
113 | 117 |
|
118 |
if(USEPOINTS) |
|
119 |
{ |
|
120 |
header += "#define USEPOINTS 1\n"; |
|
121 |
} |
|
122 |
else |
|
123 |
{ |
|
124 |
header += "#define USEPOINTS 0\n"; |
|
125 |
} |
|
126 |
|
|
114 | 127 |
try |
115 | 128 |
{ |
116 | 129 |
mFeedbackProgram = new DistortedProgram(vertStream,fragStream, header, header, glsl, feedback ); |
117 | 130 |
} |
118 | 131 |
catch(Exception ex) |
119 | 132 |
{ |
120 |
Log.e("TransformFeedback", "exception creating feedback program: "+ex.getMessage());
|
|
133 |
android.util.Log.e("Feedback", "exception creating feedback program: "+ex.getMessage());
|
|
121 | 134 |
} |
122 | 135 |
|
123 |
float[] floatData = { 1.0f, 4.0f, 9.0f, 16.0f, 25.0f, 100.0f };
|
|
124 |
mBufferLength = floatData.length;
|
|
125 |
FloatBuffer data = ByteBuffer.allocateDirect(mBufferLength*BYTESFLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
136 |
float[] floatData = { 1.0f,4.0f,9.0f, 16.0f,25.0f,36.0f, 49.0f,64.0f,81.0f, 100.0f,121.0f,144.0f};
|
|
137 |
mVertices = floatData.length/POSITION;
|
|
138 |
FloatBuffer data = ByteBuffer.allocateDirect(mVertices*POSITION*BYTESFLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
126 | 139 |
data.put(floatData).position(0); |
127 | 140 |
|
128 | 141 |
mVBO = new int[1]; |
129 | 142 |
GLES30.glGenBuffers(1, mVBO, 0); |
130 | 143 |
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mVBO[0]); |
131 |
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, mBufferLength*BYTESFLOAT, data, GLES30.GL_STATIC_READ);
|
|
144 |
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, mVertices*POSITION*BYTESFLOAT, data, GLES30.GL_STATIC_READ);
|
|
132 | 145 |
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0); |
133 | 146 |
|
147 |
int numVertices = (USEPOINTS ? mVertices : 3*(mVertices-2)); |
|
148 |
|
|
134 | 149 |
mTBO = new int[1]; |
135 | 150 |
GLES30.glGenBuffers(1, mTBO, 0); |
136 | 151 |
GLES30.glBindBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, mTBO[0]); |
137 |
GLES30.glBufferData(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, mBufferLength*BYTESFLOAT, null, GLES30.GL_STATIC_READ);
|
|
152 |
GLES30.glBufferData(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, numVertices*POSITION*BYTESFLOAT, null, GLES30.GL_STATIC_READ);
|
|
138 | 153 |
GLES30.glBindBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0); |
139 | 154 |
} |
140 | 155 |
} |
Also available in: Unified diff
Progress with TransferFeedback app - introduce two modes: USEPOINTS 'true' or 'false'.
On Nexus5X, it works with 'true' and 'false'. On Nexus 4, it works with 'true', but returns GL_INVALID_OPERATION with 'false'.