Project

General

Profile

« Previous | Next » 

Revision cab7c165

Added by Leszek Koltunski about 7 years ago

Beginning of support for actual Transform Feedback.

View differences:

src/main/java/org/distorted/library/DistortedEffects.java
38 38
import org.distorted.library.type.Static3D;
39 39

  
40 40
import java.io.InputStream;
41
import java.nio.Buffer;
41 42
import java.nio.ByteBuffer;
42 43
import java.nio.ByteOrder;
43 44
import java.nio.FloatBuffer;
......
103 104
  static void createProgram(Resources resources)
104 105
  throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException
105 106
    {
107
    // MAIN PROGRAM ////////////////////////////////////
106 108
    final InputStream mainVertStream = resources.openRawResource(R.raw.main_vertex_shader);
107 109
    final InputStream mainFragStream = resources.openRawResource(R.raw.main_fragment_shader);
108 110

  
......
140 142
    //android.util.Log.e("Effects", "vertHeader= "+mainVertHeader);
141 143
    //android.util.Log.e("Effects", "fragHeader= "+mainFragHeader);
142 144

  
143
    mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader, Distorted.GLSL);
145
    String[] feedback = { "v_Position","v_Normal","v_TexCoordinate" };
146

  
147
    mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader, Distorted.GLSL, feedback);
144 148

  
145 149
    int mainProgramH = mMainProgram.getProgramHandle();
146 150
    EffectQueueFragment.getUniforms(mainProgramH);
......
169 173
    mBlitTextureH  = GLES30.glGetUniformLocation( blitProgramH, "u_Texture");
170 174
    mBlitDepthH    = GLES30.glGetUniformLocation( blitProgramH, "u_Depth");
171 175

  
172
    // DEBUG ONLY //////////////////////////////////////
176
    // DEBUG PROGRAM //////////////////////////////////////
173 177
    final InputStream debugVertexStream   = resources.openRawResource(R.raw.test_vertex_shader);
174 178
    final InputStream debugFragmentStream = resources.openRawResource(R.raw.test_fragment_shader);
175 179

  
......
184 188
      }
185 189

  
186 190
    int debugProgramH = mDebugProgram.getProgramHandle();
187
    mDebugObjDH = GLES30.glGetUniformLocation( debugProgramH, "u_objD");
191
    mDebugObjDH      = GLES30.glGetUniformLocation( debugProgramH, "u_objD");
188 192
    mDebugMVPMatrixH = GLES30.glGetUniformLocation( debugProgramH, "u_MVPMatrix");
189
    // END DEBUG  //////////////////////////////////////
190 193
    }
191 194

  
192 195
///////////////////////////////////////////////////////////////////////////////////////////////////
......
280 283
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
281 284
    }
282 285

  
286
///////////////////////////////////////////////////////////////////////////////////////////////////
287

  
288
  private void displayTransformFeedback(MeshObject mesh)
289
    {
290
    GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, mesh.mAttTFO[0]);
291
    GLES30.glBeginTransformFeedback( GLES30.GL_POINTS);
292

  
293
    DistortedRenderState.switchOffDrawing();
294
    GLES30.glDrawArrays( GLES30.GL_POINTS, 0, mesh.numVertices);
295
    DistortedRenderState.restoreDrawing();
296

  
297
    int error = GLES30.glGetError();
298

  
299
      if( error != GLES30.GL_NO_ERROR )
300
        {
301
        throw new RuntimeException("DrawArrays: glError 0x" + Integer.toHexString(error));
302
        }
303

  
304
    int size = (MeshObject.POS_DATA_SIZE+MeshObject.NOR_DATA_SIZE+MeshObject.TEX_DATA_SIZE)*mesh.numVertices;
305

  
306
    Buffer mappedBuffer =  GLES30.glMapBufferRange(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 4*size, GLES30.GL_MAP_READ_BIT);
307
    FloatBuffer fb = ((ByteBuffer) mappedBuffer).order(ByteOrder.nativeOrder()).asFloatBuffer();
308
    String msg = "";
309

  
310
    for(int i=0; i<size; i++) msg += (" "+fb.get(i));
311

  
312
    android.util.Log.d( "Feedback", msg);
313

  
314
    GLES30.glUnmapBuffer(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER);
315
    GLES30.glEndTransformFeedback();
316
    GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
317
    }
318

  
283 319
///////////////////////////////////////////////////////////////////////////////////////////////////
284 320

  
285 321
  void drawPriv(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime)
......
293 329
    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
294 330

  
295 331
    mMainProgram.useProgram();
296
    GLES30.glUniform1i(mMainTextureH, 0);
297 332
    surface.setAsOutput(currTime);
333
    GLES30.glUniform1i(mMainTextureH, 0);
334

  
335
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mAttVBO[0]);
336
    GLES30.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0);
337
    GLES30.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshObject.NOR_DATA_SIZE, GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET1);
338
    GLES30.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2);
339
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0 );
340

  
298 341
    mM.send(surface,halfW,halfH,halfZ);
299 342
    mV.send(halfW,halfH,halfZ);
343

  
344
    displayTransformFeedback(mesh);
345

  
300 346
    mF.send(halfW,halfH);
301 347

  
302
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mAttVBO[0]);
303
    GLES30.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshObject.POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0);
304
    GLES30.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshObject.NORMAL_DATA_SIZE  , GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET1);
305
    GLES30.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2);
306 348
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mesh.numVertices);
307
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0 );
308 349

  
309 350
    /// DEBUG ONLY //////
310 351
    // displayBoundingRect(halfW, halfH, halfZ, surface, mM.getMVP(), mesh.getBoundingVertices() );

Also available in: Unified diff