Revision a13dde77
Added by Leszek Koltunski over 7 years ago
| src/main/java/org/distorted/library/main/Distorted.java | ||
|---|---|---|
| 89 | 89 |
*/ |
| 90 | 90 |
public static final int FBO_QUEUE_SIZE = 4; |
| 91 | 91 |
/** |
| 92 |
* Number of Main program variants (ATM 2: main and main OIT)
|
|
| 92 |
* Number of Main program variants (ATM 3: MAIN, MAIN OIT, PREPROCESS)
|
|
| 93 | 93 |
*/ |
| 94 |
public static final int MAIN_VARIANTS = 2;
|
|
| 94 |
public static final int MAIN_VARIANTS = 3;
|
|
| 95 | 95 |
|
| 96 | 96 |
private static boolean mInitialized=false; |
| 97 | 97 |
|
| ... | ... | |
| 189 | 189 |
exception = ex; |
| 190 | 190 |
} |
| 191 | 191 |
|
| 192 |
try |
|
| 193 |
{
|
|
| 194 |
EffectQueuePostprocess.createPrograms(resources); |
|
| 195 |
} |
|
| 196 |
catch(Exception ex) |
|
| 197 |
{
|
|
| 198 |
exception = ex; |
|
| 199 |
} |
|
| 200 |
|
|
| 192 | 201 |
try |
| 193 | 202 |
{
|
| 194 | 203 |
PostprocessEffect.createPrograms(); |
| src/main/java/org/distorted/library/main/DistortedEffects.java | ||
|---|---|---|
| 443 | 443 |
|
| 444 | 444 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 445 | 445 |
|
| 446 |
void drawPrivOIT(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime, float marginInPixels) |
|
| 446 |
void send(float halfW, float halfH, float halfZ, float margin, DistortedOutputSurface surface, int variant) |
|
| 447 |
{
|
|
| 448 |
mM.send(surface,halfW,halfH,halfZ,margin,variant); |
|
| 449 |
mV.send(variant); |
|
| 450 |
} |
|
| 451 |
|
|
| 452 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 453 |
|
|
| 454 |
void drawPrivOIT(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime) |
|
| 447 | 455 |
{
|
| 448 | 456 |
float halfZ = halfW*mesh.zFactor; |
| 449 | 457 |
|
| ... | ... | |
| 465 | 473 |
GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2); |
| 466 | 474 |
GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); |
| 467 | 475 |
|
| 468 |
mM.send(surface,halfW,halfH,halfZ,marginInPixels,1);
|
|
| 476 |
mM.send(surface,halfW,halfH,halfZ,0,1);
|
|
| 469 | 477 |
mV.send(1); |
| 470 | 478 |
mF.send(1); |
| 471 | 479 |
|
| ... | ... | |
| 476 | 484 |
|
| 477 | 485 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 478 | 486 |
|
| 479 |
void drawPriv(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime, float marginInPixels)
|
|
| 487 |
void drawPriv(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime) |
|
| 480 | 488 |
{
|
| 481 | 489 |
float halfZ = halfW*mesh.zFactor; |
| 482 | 490 |
|
| ... | ... | |
| 496 | 504 |
GLES31.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2); |
| 497 | 505 |
GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); |
| 498 | 506 |
|
| 499 |
mM.send(surface,halfW,halfH,halfZ,marginInPixels,0);
|
|
| 507 |
mM.send(surface,halfW,halfH,halfZ,0,0);
|
|
| 500 | 508 |
mV.send(0); |
| 501 | 509 |
mF.send(0); |
| 502 | 510 |
|
| src/main/java/org/distorted/library/main/DistortedNode.java | ||
|---|---|---|
| 239 | 239 |
if( mParent!=null ) mParent.adjustIsomorphism(); |
| 240 | 240 |
} |
| 241 | 241 |
|
| 242 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 243 |
|
|
| 244 |
int markStencilAndDepth(long currTime, DistortedOutputSurface surface, EffectQueuePostprocess queue) |
|
| 245 |
{
|
|
| 246 |
DistortedSurface input = mNumChildren[0]==0 ? mSurface : mData.mFBO; |
|
| 247 |
|
|
| 248 |
if( input.setAsInput() ) |
|
| 249 |
{
|
|
| 250 |
DistortedRenderState.setUpStencilMark(); |
|
| 251 |
mEffects.drawPriv(mSurface.getWidth() /2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime, queue.getHalo()*surface.mMipmap); |
|
| 252 |
DistortedRenderState.unsetUpStencilMark(); |
|
| 253 |
|
|
| 254 |
return 1; |
|
| 255 |
} |
|
| 256 |
return 0; |
|
| 257 |
} |
|
| 258 |
|
|
| 259 | 242 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 260 | 243 |
// return the total number of render calls issued |
| 261 | 244 |
|
| ... | ... | |
| 267 | 250 |
{
|
| 268 | 251 |
mState.apply(); |
| 269 | 252 |
GLES31.glDisable(GLES31.GL_BLEND); |
| 270 |
mEffects.drawPriv(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime, 0);
|
|
| 253 |
mEffects.drawPriv(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime); |
|
| 271 | 254 |
GLES31.glEnable(GLES31.GL_BLEND); |
| 272 | 255 |
return 1; |
| 273 | 256 |
} |
| ... | ... | |
| 285 | 268 |
if( input.setAsInput() ) |
| 286 | 269 |
{
|
| 287 | 270 |
mState.apply(); |
| 288 |
mEffects.drawPrivOIT(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime, 0);
|
|
| 271 |
mEffects.drawPrivOIT(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime); |
|
| 289 | 272 |
return 1; |
| 290 | 273 |
} |
| 291 | 274 |
|
| ... | ... | |
| 302 | 285 |
if( input.setAsInput() ) |
| 303 | 286 |
{
|
| 304 | 287 |
mState.apply(); |
| 305 |
mEffects.drawPriv(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime, 0);
|
|
| 288 |
mEffects.drawPriv(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime); |
|
| 306 | 289 |
return 1; |
| 307 | 290 |
} |
| 308 | 291 |
|
| ... | ... | |
| 737 | 720 |
|
| 738 | 721 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 739 | 722 |
/** |
| 740 |
* Returns the DistortedInputSurface object that's in the Node.
|
|
| 723 |
* Returns the DistortedSurface object that's in the Node. |
|
| 741 | 724 |
* |
| 742 |
* @return The DistortedInputSurface contained in the Node.
|
|
| 725 |
* @return The DistortedSurface contained in the Node. |
|
| 743 | 726 |
*/ |
| 744 | 727 |
public DistortedSurface getSurface() |
| 745 | 728 |
{
|
| 746 | 729 |
return mSurface; |
| 747 | 730 |
} |
| 748 | 731 |
|
| 732 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 733 |
/** |
|
| 734 |
* Returns the DistortedSurface object that's in the Node. |
|
| 735 |
* |
|
| 736 |
* @return The DistortedSurface contained in the Node (if a leaf), or the FBO (if an internal Node) |
|
| 737 |
*/ |
|
| 738 |
public DistortedSurface getInternalSurface() |
|
| 739 |
{
|
|
| 740 |
return mNumChildren[0]==0 ? mSurface : mData.mFBO; |
|
| 741 |
} |
|
| 742 |
|
|
| 749 | 743 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 750 | 744 |
/** |
| 751 | 745 |
* Returns the Mesh object that's in the Node. |
| src/main/java/org/distorted/library/main/DistortedOutputSurface.java | ||
|---|---|---|
| 460 | 460 |
} |
| 461 | 461 |
else |
| 462 | 462 |
{
|
| 463 |
for(int j=bucketChange; j<i; j++) numRenders += lastQueue.preprocess( mBuffer,children.get(j), time);
|
|
| 463 |
for(int j=bucketChange; j<i; j++) numRenders += lastQueue.preprocess( mBuffer,children.get(j) );
|
|
| 464 | 464 |
numRenders += lastQueue.postprocess(mBuffer); |
| 465 | 465 |
|
| 466 | 466 |
if( oit ) |
| ... | ... | |
| 484 | 484 |
|
| 485 | 485 |
if( i==numChildren-1 ) |
| 486 | 486 |
{
|
| 487 |
for(int j=bucketChange; j<numChildren; j++) numRenders += currQueue.preprocess(mBuffer,children.get(j), time);
|
|
| 487 |
for(int j=bucketChange; j<numChildren; j++) numRenders += currQueue.preprocess( mBuffer,children.get(j) );
|
|
| 488 | 488 |
numRenders += currQueue.postprocess(mBuffer); |
| 489 | 489 |
|
| 490 | 490 |
if( oit ) |
| src/main/java/org/distorted/library/main/DistortedRenderState.java | ||
|---|---|---|
| 459 | 459 |
|
| 460 | 460 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 461 | 461 |
|
| 462 |
static void setUpStencilMark() |
|
| 462 |
static void setUpStencilMark(boolean color)
|
|
| 463 | 463 |
{
|
| 464 | 464 |
sState.stencilTest = cState.stencilTest; |
| 465 | 465 |
|
| ... | ... | |
| 501 | 501 |
sState.colorMaskB = cState.colorMaskB; |
| 502 | 502 |
sState.colorMaskA = cState.colorMaskA; |
| 503 | 503 |
|
| 504 |
if( cState.colorMaskR!=0 || cState.colorMaskG!=0 || cState.colorMaskB!=0 || cState.colorMaskA!=0 ) |
|
| 504 |
int clr = color ? 1:0; |
|
| 505 |
|
|
| 506 |
if( cState.colorMaskR!=clr || cState.colorMaskG!=clr || cState.colorMaskB!=clr || cState.colorMaskA!=clr ) |
|
| 505 | 507 |
{
|
| 506 |
cState.colorMaskR = 0;
|
|
| 507 |
cState.colorMaskG = 0;
|
|
| 508 |
cState.colorMaskB = 0;
|
|
| 509 |
cState.colorMaskA = 0;
|
|
| 508 |
cState.colorMaskR = clr;
|
|
| 509 |
cState.colorMaskG = clr;
|
|
| 510 |
cState.colorMaskB = clr;
|
|
| 511 |
cState.colorMaskA = clr;
|
|
| 510 | 512 |
//android.util.Log.d("State", "switch off color writing");
|
| 511 |
GLES31.glColorMask(false,false,false,false);
|
|
| 513 |
GLES31.glColorMask(color,color,color,color);
|
|
| 512 | 514 |
} |
| 513 | 515 |
|
| 514 | 516 |
sState.depthMask = cState.depthMask; |
| src/main/java/org/distorted/library/main/DistortedScreen.java | ||
|---|---|---|
| 128 | 128 |
|
| 129 | 129 |
if( mShowFPS && fpsTexture.setAsInput()) |
| 130 | 130 |
{
|
| 131 |
fpsEffects.drawPriv(fpsW / 2.0f, fpsH / 2.0f, fpsMesh, this, time, 0);
|
|
| 131 |
fpsEffects.drawPriv(fpsW / 2.0f, fpsH / 2.0f, fpsMesh, this, time); |
|
| 132 | 132 |
} |
| 133 | 133 |
|
| 134 | 134 |
if( ++mCurRenderedFBO>=Distorted.FBO_QUEUE_SIZE ) |
| src/main/java/org/distorted/library/main/EffectQueuePostprocess.java | ||
|---|---|---|
| 19 | 19 |
|
| 20 | 20 |
package org.distorted.library.main; |
| 21 | 21 |
|
| 22 |
import android.content.res.Resources; |
|
| 22 | 23 |
import android.opengl.GLES31; |
| 24 |
import android.util.Log; |
|
| 23 | 25 |
|
| 26 |
import org.distorted.library.R; |
|
| 24 | 27 |
import org.distorted.library.effect.EffectType; |
| 25 | 28 |
import org.distorted.library.effect.PostprocessEffect; |
| 29 |
import org.distorted.library.effect.VertexEffect; |
|
| 26 | 30 |
import org.distorted.library.message.EffectMessage; |
| 31 |
import org.distorted.library.program.DistortedProgram; |
|
| 32 |
|
|
| 33 |
import java.io.InputStream; |
|
| 27 | 34 |
|
| 28 | 35 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 29 | 36 |
|
| ... | ... | |
| 34 | 41 |
|
| 35 | 42 |
private int mHalo; |
| 36 | 43 |
|
| 44 |
static DistortedProgram mPreProgram; |
|
| 45 |
static int mPreColorH; |
|
| 46 |
|
|
| 37 | 47 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 38 | 48 |
|
| 39 | 49 |
EffectQueuePostprocess(long id) |
| ... | ... | |
| 78 | 88 |
} |
| 79 | 89 |
|
| 80 | 90 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 91 |
/** |
|
| 92 |
* Only for use by the library itself. |
|
| 93 |
* |
|
| 94 |
* @y.exclude |
|
| 95 |
*/ |
|
| 96 |
public static void createPrograms(Resources resources) |
|
| 97 |
{
|
|
| 98 |
final InputStream mainVertStream = resources.openRawResource(R.raw.main_vertex_shader); |
|
| 99 |
final InputStream mainFragStream = resources.openRawResource(R.raw.preprocess_fragment_shader); |
|
| 100 |
|
|
| 101 |
int numV = VertexEffect.getNumEnabled(); |
|
| 102 |
|
|
| 103 |
String mainVertHeader= Distorted.GLSL_VERSION + ("#define NUM_VERTEX " + ( numV>0 ? DistortedEffects.getMax(EffectType.VERTEX ) : 0 ) + "\n");
|
|
| 104 |
String mainFragHeader= Distorted.GLSL_VERSION + "\n"; |
|
| 105 |
|
|
| 106 |
String enabledEffectV= VertexEffect.getGLSL(); |
|
| 107 |
|
|
| 108 |
try |
|
| 109 |
{
|
|
| 110 |
mPreProgram = new DistortedProgram(mainVertStream, mainFragStream, mainVertHeader, mainFragHeader, |
|
| 111 |
enabledEffectV, null, Distorted.GLSL, null); |
|
| 112 |
} |
|
| 113 |
catch(Exception e) |
|
| 114 |
{
|
|
| 115 |
Log.e("POSTPROCESS", e.getClass().getSimpleName()+" trying to compile PRE program: "+e.getMessage());
|
|
| 116 |
throw new RuntimeException(e.getMessage()); |
|
| 117 |
} |
|
| 118 |
|
|
| 119 |
int preProgramH = mPreProgram.getProgramHandle(); |
|
| 120 |
EffectQueueVertex.getUniforms( preProgramH,2 ); |
|
| 121 |
EffectQueueMatrix.getUniforms( preProgramH,2 ); |
|
| 122 |
mPreColorH= GLES31.glGetUniformLocation( preProgramH, "u_Color"); |
|
| 123 |
} |
|
| 124 |
|
|
| 125 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 126 |
// TODO |
|
| 81 | 127 |
|
| 82 |
int getHalo()
|
|
| 128 |
private boolean getWriteColor()
|
|
| 83 | 129 |
{
|
| 84 |
return mNumEffects>0 ? mHalo : 0;
|
|
| 130 |
return false;
|
|
| 85 | 131 |
} |
| 86 | 132 |
|
| 87 | 133 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 88 |
// TODO (now only really works in case of 1 effect!) |
|
| 89 | 134 |
|
| 90 |
int getQuality()
|
|
| 135 |
private int getHalo()
|
|
| 91 | 136 |
{
|
| 92 |
return mNumEffects>0 ? ((PostprocessEffect)mEffects[0]).getQuality() : 0;
|
|
| 137 |
return mNumEffects>0 ? mHalo : 0;
|
|
| 93 | 138 |
} |
| 94 | 139 |
|
| 95 | 140 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 101 | 146 |
} |
| 102 | 147 |
|
| 103 | 148 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 149 |
// TODO (now only really works in case of 1 effect!) |
|
| 104 | 150 |
|
| 105 |
int preprocess(DistortedOutputSurface[] buffers, DistortedNode node, long time) |
|
| 151 |
int getQuality() |
|
| 152 |
{
|
|
| 153 |
return mNumEffects>0 ? ((PostprocessEffect)mEffects[0]).getQuality() : 0; |
|
| 154 |
} |
|
| 155 |
|
|
| 156 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 157 |
|
|
| 158 |
int preprocess(DistortedOutputSurface[] buffers, DistortedNode node) |
|
| 106 | 159 |
{
|
| 107 |
int numRenders = 0; |
|
| 108 | 160 |
int quality = getInternalQuality(); |
| 161 |
DistortedOutputSurface surface = buffers[quality]; |
|
| 162 |
|
|
| 163 |
surface.setAsOutput(); |
|
| 164 |
DistortedSurface input = node.getInternalSurface(); |
|
| 109 | 165 |
|
| 110 |
buffers[quality].setAsOutput(); |
|
| 166 |
if( input.setAsInput() ) |
|
| 167 |
{
|
|
| 168 |
MeshObject mesh = node.getMesh(); |
|
| 169 |
boolean writeColor = getWriteColor(); |
|
| 170 |
float margin = getHalo()*surface.mMipmap; |
|
| 111 | 171 |
|
| 112 |
numRenders += node.markStencilAndDepth(time,buffers[quality],this); |
|
| 172 |
float halfW = input.getWidth() / 2.0f; |
|
| 173 |
float halfH = input.getHeight()/ 2.0f; |
|
| 174 |
float halfZ = halfW*mesh.zFactor; |
|
| 113 | 175 |
|
| 114 |
return numRenders; |
|
| 176 |
DistortedRenderState.setUpStencilMark(writeColor); |
|
| 177 |
|
|
| 178 |
GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight ); |
|
| 179 |
|
|
| 180 |
mPreProgram.useProgram(); |
|
| 181 |
|
|
| 182 |
GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.mAttVBO[0]); |
|
| 183 |
GLES31.glVertexAttribPointer(mPreProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0); |
|
| 184 |
GLES31.glVertexAttribPointer(mPreProgram.mAttribute[1], MeshObject.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET1); |
|
| 185 |
GLES31.glVertexAttribPointer(mPreProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2); |
|
| 186 |
GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); |
|
| 187 |
|
|
| 188 |
node.getEffects().send(halfW, halfH, halfZ, margin, surface, 2); |
|
| 189 |
|
|
| 190 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.numVertices); |
|
| 191 |
|
|
| 192 |
DistortedRenderState.unsetUpStencilMark(); |
|
| 193 |
|
|
| 194 |
return 1; |
|
| 195 |
} |
|
| 196 |
return 0; |
|
| 115 | 197 |
} |
| 116 | 198 |
|
| 117 | 199 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| src/main/java/org/distorted/library/program/DistortedProgram.java | ||
|---|---|---|
| 348 | 348 |
* |
| 349 | 349 |
* @y.exclude |
| 350 | 350 |
*/ |
| 351 |
public DistortedProgram(final InputStream vertex, final InputStream fragment, final String vertexHeader, final String fragmentHeader, int glslVersion, final String[] feedback ) |
|
| 352 |
throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException |
|
| 351 |
public DistortedProgram(final InputStream vert, final InputStream frag, final String vertHeader, final String fragHeader, |
|
| 352 |
int glslVersion, final String[] feedback ) |
|
| 353 |
throws FragmentCompilationException,VertexCompilationException,LinkingException |
|
| 353 | 354 |
{
|
| 354 | 355 |
init(glslVersion); |
| 355 | 356 |
|
| 356 |
final String vertexShader = readTextFileFromRawResource(vertex , true );
|
|
| 357 |
final String fragmentShader = readTextFileFromRawResource(fragment, false);
|
|
| 357 |
final String vertShader = readTextFileFromRawResource(vert, true );
|
|
| 358 |
final String fragShader = readTextFileFromRawResource(frag, false);
|
|
| 358 | 359 |
|
| 359 |
final int vertexShaderHandle = compileShader(GLES31.GL_VERTEX_SHADER , vertexHeader + vertexShader );
|
|
| 360 |
final int fragmentShaderHandle = compileShader(GLES31.GL_FRAGMENT_SHADER, fragmentHeader + fragmentShader);
|
|
| 360 |
final int vertShaderHandle = compileShader(GLES31.GL_VERTEX_SHADER , vertHeader + vertShader);
|
|
| 361 |
final int fragShaderHandle = compileShader(GLES31.GL_FRAGMENT_SHADER, fragHeader + fragShader);
|
|
| 361 | 362 |
|
| 362 |
mProgramHandle = createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, mAttributeName, glslVersion>= 300 ? feedback:null );
|
|
| 363 |
mProgramHandle = createAndLinkProgram(vertShaderHandle, fragShaderHandle, mAttributeName, glslVersion>= 300 ? feedback:null );
|
|
| 363 | 364 |
|
| 364 | 365 |
mAttribute = new int[mNumAttributes]; |
| 365 | 366 |
|
| ... | ... | |
| 387 | 388 |
* |
| 388 | 389 |
* @y.exclude |
| 389 | 390 |
*/ |
| 390 |
public DistortedProgram(final InputStream vertex, final InputStream fragment, final String vertexHeader, final String fragmentHeader,
|
|
| 391 |
final String enabledVertex, final String enabledFragment, int glslVersion, final String[] feedback )
|
|
| 392 |
throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException
|
|
| 391 |
public DistortedProgram(final InputStream vert, final InputStream frag, final String vertHeader, final String fragHeader,
|
|
| 392 |
final String enabledVert, final String enabledFrag, int glslVersion, final String[] feedback )
|
|
| 393 |
throws FragmentCompilationException,VertexCompilationException,LinkingException |
|
| 393 | 394 |
{
|
| 394 | 395 |
init(glslVersion); |
| 395 | 396 |
|
| 396 |
String vertexShader = readTextFileFromRawResource(vertex , true );
|
|
| 397 |
String fragmentShader = readTextFileFromRawResource(fragment, false);
|
|
| 397 |
String vertShader = readTextFileFromRawResource( vert, true );
|
|
| 398 |
String fragShader = readTextFileFromRawResource( frag, false);
|
|
| 398 | 399 |
|
| 399 |
vertexShader = insertEnabledEffects(vertexShader ,enabledVertex );
|
|
| 400 |
fragmentShader = insertEnabledEffects(fragmentShader,enabledFragment);
|
|
| 400 |
if( enabledVert!=null ) vertShader = insertEnabledEffects(vertShader,enabledVert);
|
|
| 401 |
if( enabledFrag!=null ) fragShader = insertEnabledEffects(fragShader,enabledFrag);
|
|
| 401 | 402 |
|
| 402 |
final int vertexShaderHandle = compileShader(GLES31.GL_VERTEX_SHADER , vertexHeader + vertexShader );
|
|
| 403 |
final int fragmentShaderHandle = compileShader(GLES31.GL_FRAGMENT_SHADER, fragmentHeader + fragmentShader);
|
|
| 403 |
final int vertShaderHandle = compileShader(GLES31.GL_VERTEX_SHADER , vertHeader + vertShader);
|
|
| 404 |
final int fragShaderHandle = compileShader(GLES31.GL_FRAGMENT_SHADER, fragHeader + fragShader);
|
|
| 404 | 405 |
|
| 405 |
mProgramHandle = createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, mAttributeName, glslVersion>= 300 ? feedback:null );
|
|
| 406 |
mProgramHandle = createAndLinkProgram(vertShaderHandle, fragShaderHandle, mAttributeName, glslVersion>= 300 ? feedback:null );
|
|
| 406 | 407 |
|
| 407 | 408 |
mAttribute = new int[mNumAttributes]; |
| 408 | 409 |
|
| src/main/res/raw/preprocess_fragment_shader.glsl | ||
|---|---|---|
| 1 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 2 |
// Copyright 2016 Leszek Koltunski // |
|
| 3 |
// // |
|
| 4 |
// This file is part of Distorted. // |
|
| 5 |
// // |
|
| 6 |
// Distorted is free software: you can redistribute it and/or modify // |
|
| 7 |
// it under the terms of the GNU General Public License as published by // |
|
| 8 |
// the Free Software Foundation, either version 2 of the License, or // |
|
| 9 |
// (at your option) any later version. // |
|
| 10 |
// // |
|
| 11 |
// Distorted is distributed in the hope that it will be useful, // |
|
| 12 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of // |
|
| 13 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // |
|
| 14 |
// GNU General Public License for more details. // |
|
| 15 |
// // |
|
| 16 |
// You should have received a copy of the GNU General Public License // |
|
| 17 |
// along with Distorted. If not, see <http://www.gnu.org/licenses/>. // |
|
| 18 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 19 |
|
|
| 20 |
precision highp float; |
|
| 21 |
|
|
| 22 |
out vec4 fragColor; |
|
| 23 |
uniform vec4 u_Color; |
|
| 24 |
|
|
| 25 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 26 |
|
|
| 27 |
void main() |
|
| 28 |
{
|
|
| 29 |
fragColor = u_Color; |
|
| 30 |
} |
|
Also available in: Unified diff
Progress with a more generic 'preprocess' stage of Postprocessing Effects.