Project

General

Profile

« Previous | Next » 

Revision 79921db2

Added by Leszek Koltunski about 7 years ago

Some progress with Transform Feedback. Still many bugs all over.

View differences:

src/main/java/org/distorted/library/DistortedEffects.java
52 52
 */
53 53
public class DistortedEffects
54 54
  {
55
  static final int MAIN_PROGRAM = 0;
56
  static final int FEED_PROGRAM = 1;
57
  static final int NUM_PROGRAMS = 2;
58

  
59 55
  // THIS IS FOR MAIN AND FEEDBACK PROGRAMS ///
60 56
  private static boolean[] mEffectEnabled = new boolean[EffectNames.size()];
61 57

  
......
92 88
  private static int mDebugObjDH;
93 89
  private static int mDebugMVPMatrixH;
94 90

  
95
  /// FEEDBACK PROGRAM //
96
  private static DistortedProgram mFeedbackProgram;
97

  
98

  
99 91
  private static float[] mMVPMatrix = new float[16];
100 92
  private static float[] mTmpMatrix = new float[16];
101 93

  
......
154 146
    final InputStream mainVertStream = resources.openRawResource(R.raw.main_vertex_shader);
155 147
    final InputStream mainFragStream = resources.openRawResource(R.raw.main_fragment_shader);
156 148

  
157
    mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader, Distorted.GLSL);
149
    String[] feedback = { "v_Position", "v_Normal" };
150

  
151
    mMainProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader, Distorted.GLSL, feedback);
158 152

  
159 153
    int mainProgramH = mMainProgram.getProgramHandle();
160 154
    EffectQueueFragment.getUniforms(mainProgramH);
161
    EffectQueueVertex.getUniforms(MAIN_PROGRAM,mainProgramH);
162
    EffectQueueMatrix.getUniforms(MAIN_PROGRAM,mainProgramH);
155
    EffectQueueVertex.getUniforms(mainProgramH);
156
    EffectQueueMatrix.getUniforms(mainProgramH);
163 157
    mMainTextureH= GLES30.glGetUniformLocation( mainProgramH, "u_Texture");
164 158

  
165
    //////////////////////////////////////////////////////////////////////////////////////
166
    ////////// FEEDBACK PROGRAM //////////////////////////////////////////////////////////
167
    //////////////////////////////////////////////////////////////////////////////////////
168
    final InputStream feedVertStream = resources.openRawResource(R.raw.main_vertex_shader);
169
    final InputStream feedFragStream = resources.openRawResource(R.raw.feedback_fragment_shader);
170

  
171
    String[] feedback = { "v_Position" };
172

  
173
    mFeedbackProgram = new DistortedProgram(feedVertStream,feedFragStream, mainVertHeader, Distorted.GLSL_VERSION, Distorted.GLSL, feedback);
174

  
175
    int feedProgramH = mFeedbackProgram.getProgramHandle();
176
    EffectQueueFragment.getUniforms(feedProgramH);
177
    EffectQueueVertex.getUniforms(FEED_PROGRAM,feedProgramH);
178
    EffectQueueMatrix.getUniforms(FEED_PROGRAM,feedProgramH);
179

  
180 159
    //////////////////////////////////////////////////////////////////////////////////////
181 160
    ////////// BLIT PROGRAM //////////////////////////////////////////////////////////////
182 161
    //////////////////////////////////////////////////////////////////////////////////////
......
326 305
    mMainProgram.useProgram();
327 306
    GLES30.glUniform1i(mMainTextureH, 0);
328 307
    surface.setAsOutput(currTime);
329
    mM.send(MAIN_PROGRAM,surface,halfW,halfH,halfZ);
330
    mV.send(MAIN_PROGRAM,halfW,halfH,halfZ);
308
    mM.send(surface,halfW,halfH,halfZ);
309
    mV.send(halfW,halfH,halfZ);
331 310
    mF.send(halfW,halfH);
332 311

  
333 312
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mPosVBO[0]);
......
345 324

  
346 325
  void drawPrivFeedback(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime)
347 326
    {
327
    int error;
328

  
348 329
    mM.compute(currTime);
349 330
    mV.compute(currTime);
350 331
    mF.compute(currTime);
......
353 334

  
354 335
    GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight );
355 336

  
356
    mFeedbackProgram.useProgram();
357
    surface.setAsOutput(currTime);
358
    mM.send(FEED_PROGRAM,surface,halfW,halfH,halfZ);
359
    mV.send(FEED_PROGRAM,halfW,halfH,halfZ);
337
    mMainProgram.useProgram();
338

  
339
    mM.send(surface,halfW,halfH,halfZ);
340
    mV.send(halfW,halfH,halfZ);
360 341

  
361 342
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mPosVBO[0]);
362
    GLES30.glVertexAttribPointer(mFeedbackProgram.mAttribute[0], MeshObject.POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, 0);
343
    GLES30.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshObject.POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, 0);
363 344
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mNorVBO[0]);
364
    GLES30.glVertexAttribPointer(mFeedbackProgram.mAttribute[1], MeshObject.NORMAL_DATA_SIZE  , GLES30.GL_FLOAT, false, 0, 0);
345
    GLES30.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshObject.NORMAL_DATA_SIZE  , GLES30.GL_FLOAT, false, 0, 0);
365 346
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mTexVBO[0]);
366
    GLES30.glVertexAttribPointer(mFeedbackProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, 0);
347
    GLES30.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, 0);
367 348

  
368 349
    GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, mesh.mPosTBO[0]);
350
    GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 1, mesh.mNorTBO[0]);
369 351
    GLES30.glEnable(GLES30.GL_RASTERIZER_DISCARD);
370 352
    GLES30.glBeginTransformFeedback(GLES30.GL_POINTS);
371 353
    GLES30.glDrawArrays(GLES30.GL_POINTS, 0, mesh.dataLength);
372 354

  
373
    int error = GLES30.glGetError();
355
    error = GLES30.glGetError();
374 356
    if (error != GLES30.GL_NO_ERROR)
375 357
      {
376 358
      throw new RuntimeException("2 glError 0x" + Integer.toHexString(error));
......
384 366

  
385 367
Buffer mappedBuffer =  GLES30.glMapBufferRange(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, len, GLES30.GL_MAP_READ_BIT);
386 368
FloatBuffer fb = ((ByteBuffer) mappedBuffer).order(ByteOrder.nativeOrder()).asFloatBuffer();
387
FloatBuffer bb = mesh.mMeshPositions;
369
FloatBuffer bb = mesh.mMeshNormals;
388 370

  
389 371
String msgB = "";
390 372
for(int d=0; d<mesh.dataLength; d++)
391 373
  {
392
  msgB+="("+(2*halfW*bb.get(3*d+0))+","+(2*halfH*bb.get(3*d+1))+","+(2*halfZ*bb.get(3*d+2))+")";
374
  msgB+="("+(2*halfW*bb.get(3*d+0))+","+(2*halfH*bb.get(3*d+1))+","+(bb.get(3*d+2))+")";
393 375
  }
394 376
android.util.Log.d( "Feedback", msgB);
395 377

  
......
410 392
    /// END DEBUG ///////
411 393

  
412 394
GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
395
GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 1, 0);
413 396

  
414

  
415

  
416

  
417
    mMainProgram.useProgram();
397
    surface.setAsOutput(currTime);
418 398
    GLES30.glUniform1i(mMainTextureH, 0);
419
    mM.sendFeedback(MAIN_PROGRAM,surface,halfW,halfH,halfZ);
420
    mV.sendZero(MAIN_PROGRAM);
399
    mM.sendZero();
400
    mV.sendZero();
421 401
    mF.send(halfW,halfH);
422 402

  
423 403
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, mesh.mPosTBO[0]);

Also available in: Unified diff