Project

General

Profile

« Previous | Next » 

Revision 78db8663

Added by Leszek Koltunski about 7 years ago

Beginning of work on Mipmap levels.

View differences:

src/main/java/org/distorted/library/DistortedFramebuffer.java
225 225
    {
226 226
    return mColorH[0];
227 227
    }
228

  
229
///////////////////////////////////////////////////////////////////////////////////////////////////
230
/**
231
 * Set mipmap level.
232
 * <p>
233
 * Trick for speeding up your renders - one can create a pyramid of DistortedFramebuffer objects,
234
 * each next one some constant FACTOR smaller than the previous (0.5 is the common value), then set
235
 * the Mipmap Level of the i-th object to be FACTOR^i (we start counting from 0). When rendering any
236
 * scene into such prepared Framebuffer, the library will make sure to scale any Effects used so that
237
 * the end scene will end up looking identical no matter which object we render to. Identical, that
238
 * is, except for the loss of quality and gain in speed associated with rendering to a smaller surface.
239
 *
240
 * @param mipmap The mipmap level. Acceptable range: 0&lt;mipmap&lt;infinity, although mipmap&gt;1
241
 *               does not make any sense (that would result in loss of speed and no gain in quality)
242
 */
243
  public void setMipmap(float mipmap)
244
    {
245
    mMipmap = mipmap;
246
    }
228 247
  }
src/main/java/org/distorted/library/DistortedOutputSurface.java
27 27

  
28 28
abstract class DistortedOutputSurface extends DistortedSurface implements DistortedSlave
29 29
{
30
  private static final int NUM_MIPMAP = 4;
31
          static final int CUR_MIPMAP = 0;
32

  
30 33
  private static final int ATTACH = 0;
31 34
  private static final int DETACH = 1;
32 35
  private static final int DETALL = 2;
......
51 54

  
52 55
  private ArrayList<Job> mJobs = new ArrayList<>();
53 56

  
54
  DistortedFramebuffer mBuffer1, mBuffer2;
57
  DistortedFramebuffer[] mBuffer1, mBuffer2;
55 58

  
56 59
  private long mTime;
57 60
  private float mFOV;
......
67 70

  
68 71
//private String sNew="", sOld="";
69 72

  
73
  float mMipmap;
74

  
70 75
///////////////////////////////////////////////////////////////////////////////////////////////////
71 76

  
72 77
  DistortedOutputSurface(int width, int height, int createColor, int createDepth, int fbo, int type)
......
94 99

  
95 100
    mClearDepth = 1.0f;
96 101

  
102
    mBuffer1 = new DistortedFramebuffer[NUM_MIPMAP];
103
    mBuffer2 = new DistortedFramebuffer[NUM_MIPMAP];
104
    mMipmap = 1.0f;
105

  
97 106
    createProjection();
98 107
    }
99 108

  
......
168 177
        }
169 178
      else
170 179
        {
171
        if( mBuffer1==null )
180
        if( mBuffer1[0]==null )
172 181
          {
173
          mBuffer1 = new DistortedFramebuffer(mDepthCreated!=DONT_CREATE, DistortedSurface.TYPE_SYST, mWidth, mHeight);
174
          mBuffer2 = new DistortedFramebuffer(false                     , DistortedSurface.TYPE_SYST, mWidth, mHeight);
182
          float mipmap=1.0f;
183

  
184
          for(int j=0; j<NUM_MIPMAP; j++)
185
            {
186
            mBuffer1[j] = new DistortedFramebuffer( mDepthCreated!=DONT_CREATE, DistortedSurface.TYPE_SYST,
187
                                                    (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
188
            mBuffer2[j] = new DistortedFramebuffer(false                     , DistortedSurface.TYPE_SYST,
189
                                                    (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
190
            mBuffer1[j].mMipmap = mipmap;
191
            mipmap *= 0.5f;
192
            }
175 193
          DistortedSurface.toDo();  // create immediately
176 194
          }
177 195

  
178
        numRenders += child.draw(time,mBuffer1);
196
        numRenders += child.draw(time,mBuffer1[CUR_MIPMAP]);
179 197
        if( i==num-1 )
180 198
          {
181 199
          numRenders += currP.postprocess(time,this);
src/main/java/org/distorted/library/EffectQueueMatrix.java
112 112
    Matrix.translateM(mViewMatrix, 0, -projection.mWidth/2, projection.mHeight/2, -projection.mDistance);
113 113

  
114 114
    float x,y,z, sx,sy,sz;
115
    float mipmap = projection.mMipmap;
115 116

  
116 117
    for(int i=0; i<mNumEffects; i++)
117 118
      {
118 119
      if (mName[i] == EffectNames.ROTATE.ordinal() )
119 120
        {
120
        x = mUniforms[NUM_UNIFORMS*i+4];
121
        y = mUniforms[NUM_UNIFORMS*i+5];
122
        z = mUniforms[NUM_UNIFORMS*i+6];
121
        x = mUniforms[NUM_UNIFORMS*i+4]*mipmap;
122
        y = mUniforms[NUM_UNIFORMS*i+5]*mipmap;
123
        z = mUniforms[NUM_UNIFORMS*i+6]*mipmap;
123 124

  
124 125
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
125 126
        Matrix.rotateM( mViewMatrix, 0, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
......
127 128
        }
128 129
      else if(mName[i] == EffectNames.QUATERNION.ordinal() )
129 130
        {
130
        x = mUniforms[NUM_UNIFORMS*i+4];
131
        y = mUniforms[NUM_UNIFORMS*i+5];
132
        z = mUniforms[NUM_UNIFORMS*i+6];
131
        x = mUniforms[NUM_UNIFORMS*i+4]*mipmap;
132
        y = mUniforms[NUM_UNIFORMS*i+5]*mipmap;
133
        z = mUniforms[NUM_UNIFORMS*i+6]*mipmap;
133 134

  
134 135
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
135 136
        multiplyByQuat(mViewMatrix, mUniforms[NUM_UNIFORMS*i], mUniforms[NUM_UNIFORMS*i+1], mUniforms[NUM_UNIFORMS*i+2], mUniforms[NUM_UNIFORMS*i+3]);
......
137 138
        }
138 139
      else if(mName[i] == EffectNames.MOVE.ordinal() )
139 140
        {
140
        sx = mUniforms[NUM_UNIFORMS*i  ];
141
        sy = mUniforms[NUM_UNIFORMS*i+1];
142
        sz = mUniforms[NUM_UNIFORMS*i+2];
141
        sx = mUniforms[NUM_UNIFORMS*i  ]*mipmap;
142
        sy = mUniforms[NUM_UNIFORMS*i+1]*mipmap;
143
        sz = mUniforms[NUM_UNIFORMS*i+2]*mipmap;
143 144

  
144 145
        Matrix.translateM(mViewMatrix, 0, sx,-sy, sz);
145 146
        }
146 147
      else if(mName[i] == EffectNames.SCALE.ordinal() )
147 148
        {
148
        sx = mUniforms[NUM_UNIFORMS*i  ];
149
        sy = mUniforms[NUM_UNIFORMS*i+1];
150
        sz = mUniforms[NUM_UNIFORMS*i+2];
149
        sx = mUniforms[NUM_UNIFORMS*i  ]*mipmap;
150
        sy = mUniforms[NUM_UNIFORMS*i+1]*mipmap;
151
        sz = mUniforms[NUM_UNIFORMS*i+2]*mipmap;
151 152

  
152 153
        Matrix.scaleM(mViewMatrix, 0, sx, sy, sz);
153 154
        }
......
157 158
        sy = mUniforms[NUM_UNIFORMS*i+1];
158 159
        sz = mUniforms[NUM_UNIFORMS*i+2];
159 160

  
160
        x  = mUniforms[NUM_UNIFORMS*i+4];
161
        y  = mUniforms[NUM_UNIFORMS*i+5];
162
        z  = mUniforms[NUM_UNIFORMS*i+6];
161
        x  = mUniforms[NUM_UNIFORMS*i+4]*mipmap;
162
        y  = mUniforms[NUM_UNIFORMS*i+5]*mipmap;
163
        z  = mUniforms[NUM_UNIFORMS*i+6]*mipmap;
163 164

  
164 165
        Matrix.translateM(mViewMatrix, 0, x,-y, z);
165 166

  
src/main/java/org/distorted/library/EffectQueuePostprocess.java
259 259
      {
260 260
      compute(time);
261 261

  
262
      surface.mBuffer1.setAsInput();
263
      float w = surface.mBuffer1.mWidth;
264
      float h = surface.mBuffer2.mHeight;
262
      float w1 = surface.mBuffer1[DistortedOutputSurface.CUR_MIPMAP].mWidth;
263
      float h1 = surface.mBuffer2[DistortedOutputSurface.CUR_MIPMAP].mHeight;
264
      float w2 = surface.mWidth;
265
      float h2 = surface.mHeight;
265 266

  
266 267
      int radius = (int)mUniforms[0];
267 268
      if( radius>=MAX_BLUR ) radius = MAX_BLUR-1;
......
270 271
      int offset = radius + radius*radius/4;
271 272
      radius = (radius+1)/2;
272 273

  
273
      GLES30.glViewport(0, 0, (int)w, (int)h);
274

  
275 274
      // horizontal blur
275
      GLES30.glViewport(0, 0, (int)w1, (int)h1);
276 276
      mBlur1Program.useProgram();
277
      surface.mBuffer2.setAsOutput(time);
277
      surface.mBuffer1[DistortedOutputSurface.CUR_MIPMAP].setAsInput();
278
      surface.mBuffer2[DistortedOutputSurface.CUR_MIPMAP].setAsOutput(time);
278 279

  
279 280
      GLES30.glUniform1fv( mWeights1H, radius+1, weightsCache,offset);
280 281
      GLES30.glUniform1i( mRadius1H, radius);
281 282
      GLES30.glUniform1f( mDepth1H , 1.0f-surface.mNear);
282 283
      GLES30.glUniform1i( mColorTexture1H , 0 );
283
      for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/h;
284
      for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/h1;
284 285
      GLES30.glUniform1fv( mOffsets1H ,radius+1, mOffsets,0);
285 286
      GLES30.glVertexAttribPointer(mBlur1Program.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
286 287
      GLES30.glVertexAttribPointer(mBlur1Program.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
287 288
      GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
288 289

  
289 290
      // vertical blur
291
      GLES30.glViewport(0, 0, (int)w2, (int)h2);
290 292
      mBlur2Program.useProgram();
291
      surface.mBuffer2.setAsInput();
292
      surface.mBuffer1.setAsDepth();
293
      surface.mBuffer2[DistortedOutputSurface.CUR_MIPMAP].setAsInput();
294
      surface.mBuffer1[DistortedOutputSurface.CUR_MIPMAP].setAsDepth();
293 295
      surface.setAsOutput(time);
294 296

  
295 297
      GLES30.glUniform1fv( mWeights2H, radius+1, weightsCache,offset);
......
297 299
      GLES30.glUniform1f( mDepth2H , 1.0f-surface.mNear);
298 300
      GLES30.glUniform1i( mColorTexture2H , 0 );
299 301
      GLES30.glUniform1i( mDepthTexture2H , 1 );
300
      for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/w;
302
      for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/w1;
301 303
      GLES30.glUniform1fv( mOffsets2H ,radius+1, mOffsets,0);
302 304
      GLES30.glVertexAttribPointer(mBlur2Program.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
303 305
      GLES30.glVertexAttribPointer(mBlur2Program.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);

Also available in: Unified diff