Revision 442ccafb
Added by Leszek Koltunski about 23 hours ago
| src/main/java/org/distorted/library/effect/PostprocessEffectBlurred.kt | ||
|---|---|---|
| 20 | 20 |
|
| 21 | 21 |
package org.distorted.library.effect |
| 22 | 22 |
|
| 23 |
import android.opengl.GLES31
|
|
| 23 |
import org.distorted.library.platform.GLES
|
|
| 24 | 24 |
import org.distorted.library.main.DistortedFramebuffer |
| 25 | 25 |
import org.distorted.library.main.InternalRenderState |
| 26 | 26 |
import org.distorted.library.program.DistortedProgram |
| ... | ... | |
| 90 | 90 |
mProgram1 = mPrograms.get(mIndex1) |
| 91 | 91 |
mProgram2 = mPrograms.get(mIndex2) |
| 92 | 92 |
} |
| 93 |
catch (ex: Exception)
|
|
| 93 |
catch (_: Exception)
|
|
| 94 | 94 |
{
|
| 95 | 95 |
return 0 |
| 96 | 96 |
} |
| ... | ... | |
| 116 | 116 |
|
| 117 | 117 |
val offset = radius+radius*radius/4 |
| 118 | 118 |
radius = (radius+1)/2 |
| 119 |
GLES31.glViewport(0, 0, w.toInt(), h.toInt())
|
|
| 119 |
GLES.glViewport(0, 0, w.toInt(), h.toInt()) |
|
| 120 | 120 |
|
| 121 | 121 |
// horizontal blur |
| 122 | 122 |
for (i in 0..radius) mOffsets[i] = offsetsCache[offset+i]*offsetCorrW |
| ... | ... | |
| 125 | 125 |
buffer.bindForOutput(1) |
| 126 | 126 |
buffer.setAsInput(0) |
| 127 | 127 |
|
| 128 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_S, GLES31.GL_CLAMP_TO_EDGE)
|
|
| 129 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_T, GLES31.GL_CLAMP_TO_EDGE)
|
|
| 130 |
|
|
| 131 |
GLES31.glColorMask(true, true, true, true)
|
|
| 132 |
GLES31.glClearColor(1.0f, 1.0f, 1.0f, 0.0f)
|
|
| 133 |
GLES31.glClear(GLES31.GL_COLOR_BUFFER_BIT)
|
|
| 134 |
|
|
| 135 |
GLES31.glUniform1f(mProgram1!!.mUniform!![0], n)
|
|
| 136 |
GLES31.glUniform2f(mProgram1!!.mUniform!![1], corrW, corrH)
|
|
| 137 |
GLES31.glUniform1i(mProgram1!!.mUniform!![2], 0)
|
|
| 138 |
GLES31.glUniform1fv(mProgram1!!.mUniform!![3], radius+1, mOffsets, 0)
|
|
| 139 |
GLES31.glUniform1fv(mProgram1!!.mUniform!![4], radius+1, weightsCache, offset)
|
|
| 140 |
GLES31.glUniform1i(mProgram1!!.mUniform!![5], radius)
|
|
| 141 |
GLES31.glVertexAttribPointer(mProgram1!!.mAttribute!![0], POS_DATA_SIZE, GLES31.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 142 |
GLES31.glVertexAttribPointer(mProgram1!!.mAttribute!![1], TEX_DATA_SIZE, GLES31.GL_FLOAT, false, 0, mQuadTexture)
|
|
| 143 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 128 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_WRAP_S, GLES.GL_CLAMP_TO_EDGE)
|
|
| 129 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_WRAP_T, GLES.GL_CLAMP_TO_EDGE)
|
|
| 130 |
|
|
| 131 |
GLES.glColorMask(true, true, true, true) |
|
| 132 |
GLES.glClearColor(1.0f, 1.0f, 1.0f, 0.0f) |
|
| 133 |
GLES.glClear(GLES.GL_COLOR_BUFFER_BIT)
|
|
| 134 |
|
|
| 135 |
GLES.glUniform1f(mProgram1!!.mUniform!![0], n) |
|
| 136 |
GLES.glUniform2f(mProgram1!!.mUniform!![1], corrW, corrH) |
|
| 137 |
GLES.glUniform1i(mProgram1!!.mUniform!![2], 0) |
|
| 138 |
GLES.glUniform1fv(mProgram1!!.mUniform!![3], radius+1, mOffsets, 0) |
|
| 139 |
GLES.glUniform1fv(mProgram1!!.mUniform!![4], radius+1, weightsCache, offset) |
|
| 140 |
GLES.glUniform1i(mProgram1!!.mUniform!![5], radius) |
|
| 141 |
GLES.glVertexAttribPointer(mProgram1!!.mAttribute!![0], POS_DATA_SIZE, GLES.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 142 |
GLES.glVertexAttribPointer(mProgram1!!.mAttribute!![1], TEX_DATA_SIZE, GLES.GL_FLOAT, false, 0, mQuadTexture)
|
|
| 143 |
GLES.glDrawArrays(GLES.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 144 | 144 |
mProgram1!!.stopUsingProgram() |
| 145 | 145 |
|
| 146 | 146 |
// vertical blur |
| ... | ... | |
| 150 | 150 |
buffer.bindForOutput(0) |
| 151 | 151 |
buffer.setAsInput(1) |
| 152 | 152 |
|
| 153 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_S, GLES31.GL_CLAMP_TO_EDGE)
|
|
| 154 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_T, GLES31.GL_CLAMP_TO_EDGE)
|
|
| 153 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_WRAP_S, GLES.GL_CLAMP_TO_EDGE)
|
|
| 154 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_WRAP_T, GLES.GL_CLAMP_TO_EDGE)
|
|
| 155 | 155 |
|
| 156 |
GLES31.glClear(GLES31.GL_COLOR_BUFFER_BIT)
|
|
| 156 |
GLES.glClear(GLES.GL_COLOR_BUFFER_BIT)
|
|
| 157 | 157 |
|
| 158 |
GLES31.glUniform1f(mProgram2!!.mUniform!![0], n)
|
|
| 159 |
GLES31.glUniform2f(mProgram2!!.mUniform!![1], corrW, corrH)
|
|
| 160 |
GLES31.glUniform1i(mProgram2!!.mUniform!![2], 0)
|
|
| 161 |
GLES31.glUniform1fv(mProgram2!!.mUniform!![3], radius+1, mOffsets, 0)
|
|
| 162 |
GLES31.glUniform1fv(mProgram2!!.mUniform!![4], radius+1, weightsCache, offset)
|
|
| 163 |
GLES31.glUniform1i(mProgram2!!.mUniform!![5], radius)
|
|
| 164 |
GLES31.glVertexAttribPointer(mProgram2!!.mAttribute!![0], POS_DATA_SIZE, GLES31.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 165 |
GLES31.glVertexAttribPointer(mProgram2!!.mAttribute!![1], TEX_DATA_SIZE, GLES31.GL_FLOAT, false, 0, mQuadTexture)
|
|
| 166 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 158 |
GLES.glUniform1f(mProgram2!!.mUniform!![0], n) |
|
| 159 |
GLES.glUniform2f(mProgram2!!.mUniform!![1], corrW, corrH) |
|
| 160 |
GLES.glUniform1i(mProgram2!!.mUniform!![2], 0) |
|
| 161 |
GLES.glUniform1fv(mProgram2!!.mUniform!![3], radius+1, mOffsets, 0) |
|
| 162 |
GLES.glUniform1fv(mProgram2!!.mUniform!![4], radius+1, weightsCache, offset) |
|
| 163 |
GLES.glUniform1i(mProgram2!!.mUniform!![5], radius) |
|
| 164 |
GLES.glVertexAttribPointer(mProgram2!!.mAttribute!![0], POS_DATA_SIZE, GLES.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 165 |
GLES.glVertexAttribPointer(mProgram2!!.mAttribute!![1], TEX_DATA_SIZE, GLES.GL_FLOAT, false, 0, mQuadTexture)
|
|
| 166 |
GLES.glDrawArrays(GLES.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 167 | 167 |
mProgram1!!.stopUsingProgram() |
| 168 | 168 |
|
| 169 | 169 |
InternalRenderState.unuseStencilMark() |
| src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.kt | ||
|---|---|---|
| 20 | 20 |
|
| 21 | 21 |
package org.distorted.library.effectqueue |
| 22 | 22 |
|
| 23 |
import android.opengl.GLES31
|
|
| 23 |
import org.distorted.library.platform.GLES
|
|
| 24 | 24 |
import org.distorted.library.effect.EffectType |
| 25 | 25 |
import org.distorted.library.effect.FragmentEffect |
| 26 | 26 |
import org.distorted.library.message.EffectMessageSender |
| ... | ... | |
| 42 | 42 |
/////////////////////////////////////////////////////////////////////////////////////////// |
| 43 | 43 |
fun uniforms(mProgramH: Int, variant: Int) |
| 44 | 44 |
{
|
| 45 |
mNumEffectsH[variant] = GLES31.glGetUniformLocation(mProgramH, "fNumEffects")
|
|
| 46 |
mIntUniformsH[variant] = GLES31.glGetUniformLocation(mProgramH, "fProperties")
|
|
| 47 |
mFloUniformsH[variant] = GLES31.glGetUniformLocation(mProgramH, "fUniforms")
|
|
| 45 |
mNumEffectsH[variant] = GLES.glGetUniformLocation(mProgramH, "fNumEffects") |
|
| 46 |
mIntUniformsH[variant] = GLES.glGetUniformLocation(mProgramH, "fProperties") |
|
| 47 |
mFloUniformsH[variant] = GLES.glGetUniformLocation(mProgramH, "fUniforms") |
|
| 48 | 48 |
} |
| 49 | 49 |
} |
| 50 | 50 |
/////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 68 | 68 |
/////////////////////////////////////////////////////////////////////////////////////////////// |
| 69 | 69 |
fun send(variant: Int) |
| 70 | 70 |
{
|
| 71 |
GLES31.glUniform1i(mNumEffectsH[variant],numEffects)
|
|
| 71 |
GLES.glUniform1i(mNumEffectsH[variant],numEffects) |
|
| 72 | 72 |
|
| 73 | 73 |
if (numEffects>0) |
| 74 | 74 |
{
|
| 75 | 75 |
val arrayI = mUBI!!.backingArray |
| 76 | 76 |
val arrayF = mUBF!!.backingArray |
| 77 |
GLES31.glUniform4iv(mIntUniformsH[variant],numEffects,arrayI,0)
|
|
| 78 |
GLES31.glUniform4fv(mFloUniformsH[variant],(NUM_FLOAT_UNIFORMS/4)*numEffects,arrayF,0)
|
|
| 77 |
GLES.glUniform4iv(mIntUniformsH[variant],numEffects,arrayI,0) |
|
| 78 |
GLES.glUniform4fv(mFloUniformsH[variant],(NUM_FLOAT_UNIFORMS/4)*numEffects,arrayF,0) |
|
| 79 | 79 |
} |
| 80 | 80 |
} |
| 81 | 81 |
} |
| src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.kt | ||
|---|---|---|
| 20 | 20 |
|
| 21 | 21 |
package org.distorted.library.effectqueue |
| 22 | 22 |
|
| 23 |
import android.opengl.GLES31
|
|
| 23 |
import org.distorted.library.platform.GLES
|
|
| 24 | 24 |
import org.distorted.library.effect.EffectType |
| 25 | 25 |
import org.distorted.library.effect.MatrixEffect |
| 26 | 26 |
import org.distorted.library.helpers.MatrixHelper.multiply |
| ... | ... | |
| 48 | 48 |
/////////////////////////////////////////////////////////////////////////////////////////// |
| 49 | 49 |
fun uniforms(mProgramH: Int, variant: Int) |
| 50 | 50 |
{
|
| 51 |
mMVPMatrixH[variant] = GLES31.glGetUniformLocation(mProgramH, "u_MVPMatrix")
|
|
| 52 |
mMVMatrixPH[variant] = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrixP")
|
|
| 53 |
mMVMatrixVH[variant] = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrixV")
|
|
| 51 |
mMVPMatrixH[variant] = GLES.glGetUniformLocation(mProgramH, "u_MVPMatrix") |
|
| 52 |
mMVMatrixPH[variant] = GLES.glGetUniformLocation(mProgramH, "u_MVMatrixP") |
|
| 53 |
mMVMatrixVH[variant] = GLES.glGetUniformLocation(mProgramH, "u_MVMatrixV") |
|
| 54 | 54 |
} |
| 55 | 55 |
} |
| 56 | 56 |
|
| ... | ... | |
| 116 | 116 |
// combined Model-View-Projection matrix |
| 117 | 117 |
multiply(mMVPMatrix, projection, mModelViewMatrixP) |
| 118 | 118 |
|
| 119 |
GLES31.glUniformMatrix4fv(mMVMatrixVH[variant], 1, false, mModelViewMatrixV, 0)
|
|
| 120 |
GLES31.glUniformMatrix4fv(mMVMatrixPH[variant], 1, false, mModelViewMatrixP, 0)
|
|
| 121 |
GLES31.glUniformMatrix4fv(mMVPMatrixH[variant], 1, false, mMVPMatrix , 0)
|
|
| 119 |
GLES.glUniformMatrix4fv(mMVMatrixVH[variant], 1, false, mModelViewMatrixV, 0) |
|
| 120 |
GLES.glUniformMatrix4fv(mMVMatrixPH[variant], 1, false, mModelViewMatrixP, 0) |
|
| 121 |
GLES.glUniformMatrix4fv(mMVPMatrixH[variant], 1, false, mMVPMatrix , 0) |
|
| 122 | 122 |
} |
| 123 | 123 |
} |
| src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.kt | ||
|---|---|---|
| 20 | 20 |
|
| 21 | 21 |
package org.distorted.library.effectqueue |
| 22 | 22 |
|
| 23 |
import android.opengl.GLES31
|
|
| 23 |
import org.distorted.library.platform.GLES
|
|
| 24 | 24 |
import org.distorted.library.effect.EffectType |
| 25 | 25 |
import org.distorted.library.effect.PostprocessEffect |
| 26 | 26 |
import org.distorted.library.effect.VertexEffect |
| ... | ... | |
| 95 | 95 |
mPreProgramH = mPreProgram!!.programHandle |
| 96 | 96 |
getUniforms(mPreProgramH, 2) |
| 97 | 97 |
MeshBase.getUniforms(mPreProgramH, 2) |
| 98 |
mPreColorH = GLES31.glGetUniformLocation(mPreProgramH, "u_Color")
|
|
| 99 |
mPreTextureH = GLES31.glGetUniformLocation(mPreProgramH, "u_Texture")
|
|
| 98 |
mPreColorH = GLES.glGetUniformLocation(mPreProgramH, "u_Color") |
|
| 99 |
mPreTextureH = GLES.glGetUniformLocation(mPreProgramH, "u_Texture") |
|
| 100 | 100 |
} |
| 101 | 101 |
} |
| 102 | 102 |
|
| ... | ... | |
| 165 | 165 |
|
| 166 | 166 |
InternalRenderState.setUpStencilMark(mA != 0.0f) |
| 167 | 167 |
InternalRenderState.disableBlending() |
| 168 |
if (!mUseHaloDepth) GLES31.glDepthMask(false)
|
|
| 168 |
if (!mUseHaloDepth) GLES.glDepthMask(false) |
|
| 169 | 169 |
|
| 170 |
GLES31.glViewport(0,0,width,height)
|
|
| 170 |
GLES.glViewport(0,0,width,height) |
|
| 171 | 171 |
|
| 172 | 172 |
mPreProgram!!.useProgram() |
| 173 | 173 |
|
| ... | ... | |
| 183 | 183 |
|
| 184 | 184 |
if (mA != 0.0f) |
| 185 | 185 |
{
|
| 186 |
GLES31.glUniform4f(mPreColorH,mR,mG,mB,mA)
|
|
| 187 |
GLES31.glUniform1i(mPreTextureH, 0)
|
|
| 186 |
GLES.glUniform4f(mPreColorH,mR,mG,mB,mA) |
|
| 187 |
GLES.glUniform1i(mPreTextureH, 0) |
|
| 188 | 188 |
} |
| 189 | 189 |
|
| 190 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() )
|
|
| 190 |
GLES.glDrawArrays(GLES.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() )
|
|
| 191 | 191 |
mPreProgram!!.stopUsingProgram() |
| 192 | 192 |
|
| 193 | 193 |
InternalRenderState.restoreBlending() |
| 194 | 194 |
InternalRenderState.unsetUpStencilMark() |
| 195 |
if (!mUseHaloDepth) GLES31.glDepthMask(true)
|
|
| 195 |
if (!mUseHaloDepth) GLES.glDepthMask(true) |
|
| 196 | 196 |
|
| 197 | 197 |
return 1 |
| 198 | 198 |
} |
| ... | ... | |
| 203 | 203 |
var numRenders = 0 |
| 204 | 204 |
val array = mUBF!!.backingArray |
| 205 | 205 |
|
| 206 |
GLES31.glDisable(GLES31.GL_BLEND)
|
|
| 206 |
GLES.glDisable(GLES.GL_BLEND)
|
|
| 207 | 207 |
|
| 208 | 208 |
for (i in 0..<numEffects) |
| 209 | 209 |
numRenders += (mEffects[i] as PostprocessEffect).postprocess(array,NUM_FLOAT_UNIFORMS*i, buffer) |
| 210 | 210 |
|
| 211 |
GLES31.glEnable(GLES31.GL_BLEND)
|
|
| 211 |
GLES.glEnable(GLES.GL_BLEND)
|
|
| 212 | 212 |
|
| 213 | 213 |
return numRenders |
| 214 | 214 |
} |
| src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.kt | ||
|---|---|---|
| 20 | 20 |
|
| 21 | 21 |
package org.distorted.library.effectqueue |
| 22 | 22 |
|
| 23 |
import android.opengl.GLES31
|
|
| 23 |
import org.distorted.library.platform.GLES
|
|
| 24 | 24 |
import org.distorted.library.effect.EffectType |
| 25 | 25 |
import org.distorted.library.effect.VertexEffect |
| 26 | 26 |
import org.distorted.library.message.EffectMessageSender |
| ... | ... | |
| 48 | 48 |
/////////////////////////////////////////////////////////////////////////////////////////// |
| 49 | 49 |
fun uniforms(mProgramH: Int, variant: Int) |
| 50 | 50 |
{
|
| 51 |
mNumEffectsH[variant] = GLES31.glGetUniformLocation(mProgramH, "vNumEffects")
|
|
| 52 |
mInflateH[variant] = GLES31.glGetUniformLocation(mProgramH, "u_Inflate")
|
|
| 53 |
mIntBlockIndex[variant] = GLES31.glGetUniformBlockIndex(mProgramH, "vUniformProperties")
|
|
| 54 |
mFloBlockIndex[variant] = GLES31.glGetUniformBlockIndex(mProgramH, "vUniformFloats")
|
|
| 51 |
mNumEffectsH[variant] = GLES.glGetUniformLocation(mProgramH, "vNumEffects") |
|
| 52 |
mInflateH[variant] = GLES.glGetUniformLocation(mProgramH, "u_Inflate") |
|
| 53 |
mIntBlockIndex[variant] = GLES.glGetUniformBlockIndex(mProgramH, "vUniformProperties") |
|
| 54 |
mFloBlockIndex[variant] = GLES.glGetUniformBlockIndex(mProgramH, "vUniformFloats") |
|
| 55 | 55 |
} |
| 56 | 56 |
} |
| 57 | 57 |
|
| ... | ... | |
| 84 | 84 |
*/ |
| 85 | 85 |
fun send(inflate: Float, programH: Int, variant: Int) |
| 86 | 86 |
{
|
| 87 |
GLES31.glUniform1i(mNumEffectsH[variant], numEffects)
|
|
| 88 |
GLES31.glUniform1f(mInflateH[variant], inflate)
|
|
| 87 |
GLES.glUniform1i(mNumEffectsH[variant], numEffects) |
|
| 88 |
GLES.glUniform1f(mInflateH[variant], inflate) |
|
| 89 | 89 |
|
| 90 | 90 |
if (numEffects>0) |
| 91 | 91 |
{
|
| 92 |
GLES31.glBindBufferBase(GLES31.GL_UNIFORM_BUFFER,VERT_INT_UBO_BINDING,mUBI!!.index)
|
|
| 93 |
GLES31.glUniformBlockBinding(programH, mIntBlockIndex[variant],VERT_INT_UBO_BINDING)
|
|
| 94 |
GLES31.glBindBufferBase(GLES31.GL_UNIFORM_BUFFER,VERT_FLO_UBO_BINDING,mUBF!!.index)
|
|
| 95 |
GLES31.glUniformBlockBinding(programH,mFloBlockIndex[variant],VERT_FLO_UBO_BINDING)
|
|
| 92 |
GLES.glBindBufferBase(GLES.GL_UNIFORM_BUFFER,VERT_INT_UBO_BINDING,mUBI!!.index)
|
|
| 93 |
GLES.glUniformBlockBinding(programH, mIntBlockIndex[variant],VERT_INT_UBO_BINDING) |
|
| 94 |
GLES.glBindBufferBase(GLES.GL_UNIFORM_BUFFER,VERT_FLO_UBO_BINDING,mUBF!!.index)
|
|
| 95 |
GLES.glUniformBlockBinding(programH,mFloBlockIndex[variant],VERT_FLO_UBO_BINDING) |
|
| 96 | 96 |
} |
| 97 | 97 |
} |
| 98 | 98 |
} |
| src/main/java/org/distorted/library/main/DistortedFramebuffer.kt | ||
|---|---|---|
| 19 | 19 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 20 | 20 |
package org.distorted.library.main |
| 21 | 21 |
|
| 22 |
import android.opengl.GLES31
|
|
| 22 |
import org.distorted.library.platform.GLES
|
|
| 23 | 23 |
|
| 24 | 24 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 25 | 25 |
/** |
| ... | ... | |
| 46 | 46 |
// COLOR |
| 47 | 47 |
if( mColorCreated==NOT_CREATED_YET ) |
| 48 | 48 |
{
|
| 49 |
GLES31.glGenTextures(mNumFBOs*mNumColors, mColorH, 0)
|
|
| 50 |
GLES31.glGenFramebuffers(mNumFBOs, mFBOH, 0)
|
|
| 49 |
GLES.glGenTextures(mNumFBOs*mNumColors, mColorH, 0) |
|
| 50 |
GLES.glGenFramebuffers(mNumFBOs, mFBOH, 0) |
|
| 51 | 51 |
|
| 52 | 52 |
for (i in 0 until mNumFBOs) |
| 53 | 53 |
{
|
| 54 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[i])
|
|
| 54 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, mFBOH[i])
|
|
| 55 | 55 |
|
| 56 | 56 |
for (j in 0 until mNumColors) |
| 57 | 57 |
{
|
| 58 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, mColorH!![i*mNumColors+j])
|
|
| 59 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_S, GLES31.GL_REPEAT)
|
|
| 60 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_T, GLES31.GL_REPEAT)
|
|
| 61 |
GLES31.glTexParameterf(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_NEAREST.toFloat())
|
|
| 62 |
GLES31.glTexParameterf(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_LINEAR.toFloat())
|
|
| 63 |
GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_RGBA, mRealWidth, mRealHeight, 0, GLES31.GL_RGBA, GLES31.GL_UNSIGNED_BYTE, null)
|
|
| 58 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, mColorH!![i*mNumColors+j])
|
|
| 59 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_WRAP_S, GLES.GL_REPEAT)
|
|
| 60 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_WRAP_T, GLES.GL_REPEAT)
|
|
| 61 |
GLES.glTexParameterf(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_MIN_FILTER, GLES.GL_NEAREST.toFloat())
|
|
| 62 |
GLES.glTexParameterf(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_MAG_FILTER, GLES.GL_LINEAR.toFloat())
|
|
| 63 |
GLES.glTexImage2D(GLES.GL_TEXTURE_2D, 0, GLES.GL_RGBA, mRealWidth, mRealHeight, 0, GLES.GL_RGBA, GLES.GL_UNSIGNED_BYTE, null)
|
|
| 64 | 64 |
} |
| 65 | 65 |
|
| 66 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_COLOR_ATTACHMENT0, GLES31.GL_TEXTURE_2D, mColorH!![i*mNumColors], 0)
|
|
| 67 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, 0)
|
|
| 66 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_COLOR_ATTACHMENT0, GLES.GL_TEXTURE_2D, mColorH!![i*mNumColors], 0)
|
|
| 67 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, 0)
|
|
| 68 | 68 |
} |
| 69 | 69 |
|
| 70 | 70 |
// TODO |
| 71 | 71 |
mColorCreated = checkStatus("color")
|
| 72 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0)
|
|
| 72 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, 0)
|
|
| 73 | 73 |
} |
| 74 | 74 |
|
| 75 | 75 |
////////////////////////////////////////////////////////////// |
| 76 | 76 |
// DEPTH / STENCIL |
| 77 | 77 |
if( mDepthStencilCreated==NOT_CREATED_YET ) // we need to create a new DEPTH or STENCIL attachment |
| 78 | 78 |
{
|
| 79 |
GLES31.glGenTextures(mNumFBOs, mDepthStencilH, 0)
|
|
| 79 |
GLES.glGenTextures(mNumFBOs, mDepthStencilH, 0) |
|
| 80 | 80 |
|
| 81 | 81 |
for (i in 0 until mNumFBOs) |
| 82 | 82 |
{
|
| 83 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, mDepthStencilH!![i])
|
|
| 84 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_S, GLES31.GL_REPEAT)
|
|
| 85 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_T, GLES31.GL_REPEAT)
|
|
| 86 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_NEAREST)
|
|
| 87 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_NEAREST)
|
|
| 83 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, mDepthStencilH!![i])
|
|
| 84 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_WRAP_S, GLES.GL_REPEAT)
|
|
| 85 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_WRAP_T, GLES.GL_REPEAT)
|
|
| 86 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_MIN_FILTER, GLES.GL_NEAREST)
|
|
| 87 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_MAG_FILTER, GLES.GL_NEAREST)
|
|
| 88 | 88 |
|
| 89 | 89 |
if (mDepthStencil==DEPTH_NO_STENCIL) |
| 90 | 90 |
{
|
| 91 |
GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_DEPTH_COMPONENT, mRealWidth, mRealHeight, 0, GLES31.GL_DEPTH_COMPONENT, GLES31.GL_UNSIGNED_INT, null)
|
|
| 91 |
GLES.glTexImage2D(GLES.GL_TEXTURE_2D, 0, GLES.GL_DEPTH_COMPONENT, mRealWidth, mRealHeight, 0, GLES.GL_DEPTH_COMPONENT, GLES.GL_UNSIGNED_INT, null)
|
|
| 92 | 92 |
} |
| 93 | 93 |
else if (mDepthStencil==BOTH_DEPTH_STENCIL) |
| 94 | 94 |
{
|
| 95 |
GLES31.glTexImage2D(GLES31.GL_TEXTURE_2D, 0, GLES31.GL_DEPTH24_STENCIL8, mRealWidth, mRealHeight, 0, GLES31.GL_DEPTH_STENCIL, GLES31.GL_UNSIGNED_INT_24_8, null)
|
|
| 95 |
GLES.glTexImage2D(GLES.GL_TEXTURE_2D, 0, GLES.GL_DEPTH24_STENCIL8, mRealWidth, mRealHeight, 0, GLES.GL_DEPTH_STENCIL, GLES.GL_UNSIGNED_INT_24_8, null)
|
|
| 96 | 96 |
} |
| 97 | 97 |
} |
| 98 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, 0)
|
|
| 98 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, 0)
|
|
| 99 | 99 |
|
| 100 | 100 |
for (i in 0 until mNumFBOs) |
| 101 | 101 |
{
|
| 102 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[i])
|
|
| 102 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, mFBOH[i])
|
|
| 103 | 103 |
|
| 104 | 104 |
if (mDepthStencil==DEPTH_NO_STENCIL) |
| 105 | 105 |
{
|
| 106 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_ATTACHMENT, GLES31.GL_TEXTURE_2D, mDepthStencilH!![i], 0)
|
|
| 106 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_DEPTH_ATTACHMENT, GLES.GL_TEXTURE_2D, mDepthStencilH!![i], 0)
|
|
| 107 | 107 |
} |
| 108 | 108 |
else if (mDepthStencil==BOTH_DEPTH_STENCIL) |
| 109 | 109 |
{
|
| 110 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_STENCIL_ATTACHMENT, GLES31.GL_TEXTURE_2D, mDepthStencilH!![i], 0)
|
|
| 110 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_DEPTH_STENCIL_ATTACHMENT, GLES.GL_TEXTURE_2D, mDepthStencilH!![i], 0)
|
|
| 111 | 111 |
} |
| 112 | 112 |
} |
| 113 | 113 |
|
| 114 | 114 |
// TODO |
| 115 | 115 |
mDepthStencilCreated = checkStatus("depth")
|
| 116 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0)
|
|
| 116 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, 0)
|
|
| 117 | 117 |
} |
| 118 | 118 |
|
| 119 | 119 |
////////////////////////////////////////////////////////////// |
| ... | ... | |
| 128 | 128 |
|
| 129 | 129 |
for (i in 0 until mNumFBOs) |
| 130 | 130 |
{
|
| 131 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[i])
|
|
| 132 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_ATTACHMENT, GLES31.GL_TEXTURE_2D, 0, 0)
|
|
| 133 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_STENCIL_ATTACHMENT, GLES31.GL_TEXTURE_2D, 0, 0)
|
|
| 131 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, mFBOH[i])
|
|
| 132 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_DEPTH_ATTACHMENT, GLES.GL_TEXTURE_2D, 0, 0)
|
|
| 133 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_DEPTH_STENCIL_ATTACHMENT, GLES.GL_TEXTURE_2D, 0, 0)
|
|
| 134 | 134 |
mDepthStencilH!![i] = 0 |
| 135 | 135 |
} |
| 136 | 136 |
|
| 137 |
GLES31.glDeleteTextures(mNumFBOs, mDepthStencilH, 0)
|
|
| 138 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0)
|
|
| 137 |
GLES.glDeleteTextures(mNumFBOs, mDepthStencilH, 0) |
|
| 138 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, 0)
|
|
| 139 | 139 |
} |
| 140 | 140 |
} |
| 141 | 141 |
|
| ... | ... | |
| 143 | 143 |
// TODO |
| 144 | 144 |
private fun checkStatus(message: String): Int |
| 145 | 145 |
{
|
| 146 |
val status = GLES31.glCheckFramebufferStatus(GLES31.GL_FRAMEBUFFER)
|
|
| 146 |
val status = GLES.glCheckFramebufferStatus(GLES.GL_FRAMEBUFFER)
|
|
| 147 | 147 |
|
| 148 |
if (status!=GLES31.GL_FRAMEBUFFER_COMPLETE)
|
|
| 148 |
if (status!=GLES.GL_FRAMEBUFFER_COMPLETE) |
|
| 149 | 149 |
{
|
| 150 | 150 |
DistortedLibrary.logMessage("DistortedFramebuffer: FRAMEBUFFER INCOMPLETE, $message error=$status")
|
| 151 | 151 |
|
| 152 |
GLES31.glDeleteTextures(1, mColorH, 0)
|
|
| 153 |
GLES31.glDeleteTextures(1, mDepthStencilH, 0)
|
|
| 154 |
GLES31.glDeleteFramebuffers(1, mFBOH, 0)
|
|
| 152 |
GLES.glDeleteTextures(1, mColorH, 0) |
|
| 153 |
GLES.glDeleteTextures(1, mDepthStencilH, 0) |
|
| 154 |
GLES.glDeleteFramebuffers(1, mFBOH, 0) |
|
| 155 | 155 |
mFBOH[0] = 0 |
| 156 | 156 |
|
| 157 | 157 |
return FAILED_TO_CREATE |
| ... | ... | |
| 168 | 168 |
|
| 169 | 169 |
if( colorH[0]>0 ) |
| 170 | 170 |
{
|
| 171 |
GLES31.glDeleteTextures(mNumFBOs*mNumColors, colorH, 0)
|
|
| 171 |
GLES.glDeleteTextures(mNumFBOs*mNumColors, colorH, 0) |
|
| 172 | 172 |
mColorCreated = NOT_CREATED_YET |
| 173 | 173 |
for (i in 0 until mNumFBOs*mNumColors) colorH[i] = 0 |
| 174 | 174 |
} |
| ... | ... | |
| 177 | 177 |
|
| 178 | 178 |
if( depthStencilH[0]>0 ) |
| 179 | 179 |
{
|
| 180 |
GLES31.glDeleteTextures(mNumFBOs, depthStencilH, 0)
|
|
| 180 |
GLES.glDeleteTextures(mNumFBOs, depthStencilH, 0) |
|
| 181 | 181 |
mDepthStencilCreated = NOT_CREATED_YET |
| 182 | 182 |
for (i in 0 until mNumFBOs) depthStencilH[i] = 0 |
| 183 | 183 |
} |
| 184 | 184 |
|
| 185 | 185 |
if( mNumFBOs>0 && mFBOH[0]>0 ) |
| 186 | 186 |
{
|
| 187 |
GLES31.glDeleteFramebuffers(mNumFBOs, mFBOH, 0)
|
|
| 187 |
GLES.glDeleteFramebuffers(mNumFBOs, mFBOH, 0) |
|
| 188 | 188 |
} |
| 189 | 189 |
|
| 190 | 190 |
for (i in 0 until mNumFBOs) |
| ... | ... | |
| 222 | 222 |
|
| 223 | 223 |
if( colorH>0 ) |
| 224 | 224 |
{
|
| 225 |
GLES31.glActiveTexture(GLES31.GL_TEXTURE0)
|
|
| 226 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, colorH)
|
|
| 225 |
GLES.glActiveTexture(GLES.GL_TEXTURE0)
|
|
| 226 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, colorH)
|
|
| 227 | 227 |
return true |
| 228 | 228 |
} |
| 229 | 229 |
} |
| ... | ... | |
| 277 | 277 |
|
| 278 | 278 |
if( colorH>0 ) |
| 279 | 279 |
{
|
| 280 |
GLES31.glActiveTexture(GLES31.GL_TEXTURE0)
|
|
| 281 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, colorH)
|
|
| 280 |
GLES.glActiveTexture(GLES.GL_TEXTURE0)
|
|
| 281 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, colorH)
|
|
| 282 | 282 |
return true |
| 283 | 283 |
} |
| 284 | 284 |
} |
| ... | ... | |
| 299 | 299 |
val colorH = mColorH!![2*mCurrFBO + texture] |
| 300 | 300 |
|
| 301 | 301 |
if( colorH>0 ) |
| 302 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_COLOR_ATTACHMENT0, GLES31.GL_TEXTURE_2D, colorH, 0)
|
|
| 302 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_COLOR_ATTACHMENT0, GLES.GL_TEXTURE_2D, colorH, 0)
|
|
| 303 | 303 |
} |
| 304 | 304 |
} |
| 305 | 305 |
|
| ... | ... | |
| 353 | 353 |
{
|
| 354 | 354 |
if( fbo in 0..<mNumFBOs ) |
| 355 | 355 |
{
|
| 356 |
GLES31.glBindFramebuffer(GLES31.GL_READ_FRAMEBUFFER, mFBOH[fbo])
|
|
| 356 |
GLES.glBindFramebuffer(GLES.GL_READ_FRAMEBUFFER, mFBOH[fbo])
|
|
| 357 | 357 |
return true |
| 358 | 358 |
} |
| 359 | 359 |
|
| src/main/java/org/distorted/library/main/DistortedLibrary.kt | ||
|---|---|---|
| 19 | 19 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 20 | 20 |
package org.distorted.library.main |
| 21 | 21 |
|
| 22 |
import android.opengl.GLES31
|
|
| 22 |
import org.distorted.library.platform.GLES
|
|
| 23 | 23 |
import org.distorted.library.effect.Effect |
| 24 | 24 |
import org.distorted.library.effect.EffectType |
| 25 | 25 |
import org.distorted.library.effect.FragmentEffect |
| ... | ... | |
| 319 | 319 |
mMainProgramH = mMainProgram!!.programHandle |
| 320 | 320 |
EffectQueue.getUniforms(mMainProgramH, 0) |
| 321 | 321 |
MeshBase.getUniforms(mMainProgramH, 0) |
| 322 |
mMainTextureH = GLES31.glGetUniformLocation(mMainProgramH, "u_Texture")
|
|
| 323 |
mTransformFeedbackH = GLES31.glGetUniformLocation(mMainProgramH, "u_TransformFeedback")
|
|
| 322 |
mMainTextureH = GLES.glGetUniformLocation(mMainProgramH, "u_Texture") |
|
| 323 |
mTransformFeedbackH = GLES.glGetUniformLocation(mMainProgramH, "u_TransformFeedback") |
|
| 324 | 324 |
|
| 325 | 325 |
// BLIT PROGRAM //////////////////////////////////// |
| 326 | 326 |
val blitVertStream = Blit.vertex() |
| ... | ... | |
| 337 | 337 |
} |
| 338 | 338 |
|
| 339 | 339 |
val blitProgramH = mBlitProgram!!.programHandle |
| 340 |
mBlitTextureH = GLES31.glGetUniformLocation(blitProgramH, "u_Texture")
|
|
| 341 |
mBlitDepthH = GLES31.glGetUniformLocation(blitProgramH, "u_Depth")
|
|
| 340 |
mBlitTextureH = GLES.glGetUniformLocation(blitProgramH, "u_Texture") |
|
| 341 |
mBlitDepthH = GLES.glGetUniformLocation(blitProgramH, "u_Depth") |
|
| 342 | 342 |
|
| 343 | 343 |
// BLIT DEPTH PROGRAM //////////////////////////////////// |
| 344 | 344 |
val blitDepthVertStream = BlitDepth.vertex() |
| ... | ... | |
| 355 | 355 |
} |
| 356 | 356 |
|
| 357 | 357 |
val blitDepthProgramH = mBlitDepthProgram!!.programHandle |
| 358 |
mBlitDepthTextureH = GLES31.glGetUniformLocation(blitDepthProgramH, "u_Texture")
|
|
| 359 |
mBlitDepthDepthTextureH = GLES31.glGetUniformLocation(blitDepthProgramH, "u_DepthTexture")
|
|
| 360 |
mBlitDepthTexCorrH = GLES31.glGetUniformLocation(blitDepthProgramH, "u_TexCorr")
|
|
| 358 |
mBlitDepthTextureH = GLES.glGetUniformLocation(blitDepthProgramH, "u_Texture") |
|
| 359 |
mBlitDepthDepthTextureH = GLES.glGetUniformLocation(blitDepthProgramH, "u_DepthTexture") |
|
| 360 |
mBlitDepthTexCorrH = GLES.glGetUniformLocation(blitDepthProgramH, "u_TexCorr") |
|
| 361 | 361 |
} |
| 362 | 362 |
|
| 363 | 363 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 377 | 377 |
} |
| 378 | 378 |
|
| 379 | 379 |
val normalProgramH = mNormalProgram!!.programHandle |
| 380 |
mNormalProjectionH = GLES31.glGetUniformLocation(normalProgramH, "u_Projection")
|
|
| 380 |
mNormalProjectionH = GLES.glGetUniformLocation(normalProgramH, "u_Projection") |
|
| 381 | 381 |
} |
| 382 | 382 |
|
| 383 | 383 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 452 | 452 |
mMainOITProgramH = mMainOITProgram!!.programHandle |
| 453 | 453 |
EffectQueue.getUniforms(mMainOITProgramH, 1) |
| 454 | 454 |
MeshBase.getUniforms(mMainOITProgramH, 1) |
| 455 |
mMainOITTextureH = GLES31.glGetUniformLocation(mMainOITProgramH, "u_Texture")
|
|
| 456 |
mMainOITSizeH = GLES31.glGetUniformLocation(mMainOITProgramH, "u_Size")
|
|
| 457 |
mMainOITNumRecordsH = GLES31.glGetUniformLocation(mMainOITProgramH, "u_numRecords")
|
|
| 455 |
mMainOITTextureH = GLES.glGetUniformLocation(mMainOITProgramH, "u_Texture") |
|
| 456 |
mMainOITSizeH = GLES.glGetUniformLocation(mMainOITProgramH, "u_Size") |
|
| 457 |
mMainOITNumRecordsH = GLES.glGetUniformLocation(mMainOITProgramH, "u_numRecords") |
|
| 458 | 458 |
|
| 459 | 459 |
// OIT CLEAR PROGRAM //////////////////////////////////// |
| 460 | 460 |
val oitClearVertStream = Oit.vertex() |
| ... | ... | |
| 471 | 471 |
} |
| 472 | 472 |
|
| 473 | 473 |
val oitClearProgramH = mOITClearProgram!!.programHandle |
| 474 |
mOITClearDepthH = GLES31.glGetUniformLocation(oitClearProgramH, "u_Depth")
|
|
| 475 |
mOITClearTexCorrH = GLES31.glGetUniformLocation(oitClearProgramH, "u_TexCorr")
|
|
| 476 |
mOITClearSizeH = GLES31.glGetUniformLocation(oitClearProgramH, "u_Size")
|
|
| 474 |
mOITClearDepthH = GLES.glGetUniformLocation(oitClearProgramH, "u_Depth") |
|
| 475 |
mOITClearTexCorrH = GLES.glGetUniformLocation(oitClearProgramH, "u_TexCorr") |
|
| 476 |
mOITClearSizeH = GLES.glGetUniformLocation(oitClearProgramH, "u_Size") |
|
| 477 | 477 |
|
| 478 | 478 |
// OIT BUILD PROGRAM //////////////////////////////////// |
| 479 | 479 |
val oitBuildVertStream = Oit.vertex() |
| ... | ... | |
| 490 | 490 |
} |
| 491 | 491 |
|
| 492 | 492 |
val oitBuildProgramH = mOITBuildProgram!!.programHandle |
| 493 |
mOITBuildTextureH = GLES31.glGetUniformLocation(oitBuildProgramH, "u_Texture")
|
|
| 494 |
mOITBuildDepthTextureH = GLES31.glGetUniformLocation(oitBuildProgramH, "u_DepthTexture")
|
|
| 495 |
mOITBuildDepthH = GLES31.glGetUniformLocation(oitBuildProgramH, "u_Depth")
|
|
| 496 |
mOITBuildTexCorrH = GLES31.glGetUniformLocation(oitBuildProgramH, "u_TexCorr")
|
|
| 497 |
mOITBuildSizeH = GLES31.glGetUniformLocation(oitBuildProgramH, "u_Size")
|
|
| 498 |
mOITBuildNumRecordsH = GLES31.glGetUniformLocation(oitBuildProgramH, "u_numRecords")
|
|
| 493 |
mOITBuildTextureH = GLES.glGetUniformLocation(oitBuildProgramH, "u_Texture") |
|
| 494 |
mOITBuildDepthTextureH = GLES.glGetUniformLocation(oitBuildProgramH, "u_DepthTexture") |
|
| 495 |
mOITBuildDepthH = GLES.glGetUniformLocation(oitBuildProgramH, "u_Depth") |
|
| 496 |
mOITBuildTexCorrH = GLES.glGetUniformLocation(oitBuildProgramH, "u_TexCorr") |
|
| 497 |
mOITBuildSizeH = GLES.glGetUniformLocation(oitBuildProgramH, "u_Size") |
|
| 498 |
mOITBuildNumRecordsH = GLES.glGetUniformLocation(oitBuildProgramH, "u_numRecords") |
|
| 499 | 499 |
|
| 500 | 500 |
// OIT COLLAPSE PROGRAM /////////////////////////// |
| 501 | 501 |
val oitCollapseVertStream = Oit.vertex() |
| ... | ... | |
| 512 | 512 |
} |
| 513 | 513 |
|
| 514 | 514 |
val oitCollapseProgramH = mOITCollapseProgram!!.programHandle |
| 515 |
mOITCollapseDepthTextureH = GLES31.glGetUniformLocation(oitCollapseProgramH, "u_DepthTexture")
|
|
| 516 |
mOITCollapseDepthH = GLES31.glGetUniformLocation(oitCollapseProgramH, "u_Depth")
|
|
| 517 |
mOITCollapseTexCorrH = GLES31.glGetUniformLocation(oitCollapseProgramH, "u_TexCorr")
|
|
| 518 |
mOITCollapseSizeH = GLES31.glGetUniformLocation(oitCollapseProgramH, "u_Size")
|
|
| 515 |
mOITCollapseDepthTextureH = GLES.glGetUniformLocation(oitCollapseProgramH, "u_DepthTexture") |
|
| 516 |
mOITCollapseDepthH = GLES.glGetUniformLocation(oitCollapseProgramH, "u_Depth") |
|
| 517 |
mOITCollapseTexCorrH = GLES.glGetUniformLocation(oitCollapseProgramH, "u_TexCorr") |
|
| 518 |
mOITCollapseSizeH = GLES.glGetUniformLocation(oitCollapseProgramH, "u_Size") |
|
| 519 | 519 |
|
| 520 | 520 |
// OIT RENDER PROGRAM /////////////////////////// |
| 521 | 521 |
val oitRenderVertStream = Oit.vertex() |
| ... | ... | |
| 532 | 532 |
} |
| 533 | 533 |
|
| 534 | 534 |
val oitRenderProgramH = mOITRenderProgram!!.programHandle |
| 535 |
mOITRenderDepthH = GLES31.glGetUniformLocation(oitRenderProgramH, "u_Depth")
|
|
| 536 |
mOITRenderTexCorrH = GLES31.glGetUniformLocation(oitRenderProgramH, "u_TexCorr")
|
|
| 537 |
mOITRenderSizeH = GLES31.glGetUniformLocation(oitRenderProgramH, "u_Size")
|
|
| 535 |
mOITRenderDepthH = GLES.glGetUniformLocation(oitRenderProgramH, "u_Depth") |
|
| 536 |
mOITRenderTexCorrH = GLES.glGetUniformLocation(oitRenderProgramH, "u_TexCorr") |
|
| 537 |
mOITRenderSizeH = GLES.glGetUniformLocation(oitRenderProgramH, "u_Size") |
|
| 538 | 538 |
} |
| 539 | 539 |
|
| 540 | 540 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 556 | 556 |
val num = mesh.getNumVertices() |
| 557 | 557 |
val tfo = mesh.tFO |
| 558 | 558 |
|
| 559 |
GLES31.glUniform1i(mTransformFeedbackH, 1)
|
|
| 560 |
GLES31.glBindBufferBase(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo)
|
|
| 561 |
GLES31.glBeginTransformFeedback(GLES31.GL_POINTS)
|
|
| 559 |
GLES.glUniform1i(mTransformFeedbackH, 1) |
|
| 560 |
GLES.glBindBufferBase(GLES.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo)
|
|
| 561 |
GLES.glBeginTransformFeedback(GLES.GL_POINTS)
|
|
| 562 | 562 |
switchOffDrawing() |
| 563 |
GLES31.glDrawArrays(GLES31.GL_POINTS, 0, num)
|
|
| 563 |
GLES.glDrawArrays(GLES.GL_POINTS, 0, num)
|
|
| 564 | 564 |
restoreDrawing() |
| 565 |
GLES31.glEndTransformFeedback()
|
|
| 566 |
GLES31.glBindBufferBase(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0)
|
|
| 567 |
GLES31.glUniform1i(mTransformFeedbackH, 0)
|
|
| 565 |
GLES.glEndTransformFeedback() |
|
| 566 |
GLES.glBindBufferBase(GLES.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0)
|
|
| 567 |
GLES.glUniform1i(mTransformFeedbackH, 0) |
|
| 568 | 568 |
|
| 569 | 569 |
mNormalProgram!!.useProgram() |
| 570 |
GLES31.glUniformMatrix4fv(mNormalProjectionH, 1, false, projection, 0)
|
|
| 570 |
GLES.glUniformMatrix4fv(mNormalProjectionH, 1, false, projection, 0) |
|
| 571 | 571 |
mesh.bindTransformAttribs(mNormalProgram!!) |
| 572 |
GLES31.glLineWidth(8.0f)
|
|
| 573 |
GLES31.glDrawArrays(GLES31.GL_LINES, 0, 2*num)
|
|
| 572 |
GLES.glLineWidth(8.0f) |
|
| 573 |
GLES.glDrawArrays(GLES.GL_LINES, 0, 2*num)
|
|
| 574 | 574 |
mNormalProgram!!.stopUsingProgram() |
| 575 | 575 |
} |
| 576 | 576 |
|
| ... | ... | |
| 602 | 602 |
queue.send(0.0f, mFullProgramH, 3) |
| 603 | 603 |
mesh.send(mFullProgramH, 3) |
| 604 | 604 |
|
| 605 |
GLES31.glBindBufferBase(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo)
|
|
| 606 |
GLES31.glBeginTransformFeedback(GLES31.GL_POINTS)
|
|
| 605 |
GLES.glBindBufferBase(GLES.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo)
|
|
| 606 |
GLES.glBeginTransformFeedback(GLES.GL_POINTS)
|
|
| 607 | 607 |
switchOffDrawing() |
| 608 |
GLES31.glDrawArrays(GLES31.GL_POINTS, 0, num)
|
|
| 608 |
GLES.glDrawArrays(GLES.GL_POINTS, 0, num)
|
|
| 609 | 609 |
restoreDrawing() |
| 610 |
GLES31.glEndTransformFeedback()
|
|
| 610 |
GLES.glEndTransformFeedback() |
|
| 611 | 611 |
mesh.copyTransformToVertex() |
| 612 |
GLES31.glBindBufferBase(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0)
|
|
| 612 |
GLES.glBindBufferBase(GLES.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0)
|
|
| 613 | 613 |
mFullProgram!!.stopUsingProgram() |
| 614 | 614 |
} |
| 615 | 615 |
|
| ... | ... | |
| 623 | 623 |
val queues = effects.queues |
| 624 | 624 |
|
| 625 | 625 |
compute(queues, currTime, step) |
| 626 |
GLES31.glViewport(0, 0, w, h)
|
|
| 626 |
GLES.glViewport(0, 0, w, h) |
|
| 627 | 627 |
|
| 628 | 628 |
mMainOITProgram!!.useProgram() |
| 629 |
GLES31.glUniform1i(mMainOITTextureH, 0)
|
|
| 630 |
GLES31.glUniform2ui(mMainOITSizeH, w, h)
|
|
| 631 |
GLES31.glUniform1ui(mMainOITNumRecordsH, (mBufferSize*w*h).toInt())
|
|
| 629 |
GLES.glUniform1i(mMainOITTextureH, 0) |
|
| 630 |
GLES.glUniform2ui(mMainOITSizeH, w, h) |
|
| 631 |
GLES.glUniform1ui(mMainOITNumRecordsH, (mBufferSize*w*h).toInt()) |
|
| 632 | 632 |
mesh.bindVertexAttribs(mMainOITProgram!!) |
| 633 | 633 |
mesh.send(mMainOITProgramH, 1) |
| 634 | 634 |
|
| ... | ... | |
| 638 | 638 |
val projection = surface.mProjectionMatrix |
| 639 | 639 |
|
| 640 | 640 |
send(queues, mMainOITProgramH, distance, mipmap, projection, inflate, 1) |
| 641 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices())
|
|
| 641 |
GLES.glDrawArrays(GLES.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices())
|
|
| 642 | 642 |
if (mesh.showNormals) displayNormals(projection, mesh) |
| 643 | 643 |
mMainOITProgram!!.stopUsingProgram() |
| 644 | 644 |
} |
| ... | ... | |
| 653 | 653 |
val w = surface.getWidth() |
| 654 | 654 |
val h = surface.getHeight() |
| 655 | 655 |
compute(queues, currTime, step) |
| 656 |
GLES31.glViewport(0, 0, w, h)
|
|
| 656 |
GLES.glViewport(0, 0, w, h) |
|
| 657 | 657 |
|
| 658 | 658 |
mMainProgram!!.useProgram() |
| 659 |
GLES31.glUniform1i(mMainTextureH, 0)
|
|
| 659 |
GLES.glUniform1i(mMainTextureH, 0) |
|
| 660 | 660 |
mesh.bindVertexAttribs(mMainProgram!!) |
| 661 | 661 |
mesh.send(mMainProgramH, 0) |
| 662 | 662 |
|
| ... | ... | |
| 666 | 666 |
val projection = surface.mProjectionMatrix |
| 667 | 667 |
|
| 668 | 668 |
send(queues, mMainProgramH, distance, mipmap, projection, inflate, 0) |
| 669 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices())
|
|
| 669 |
GLES.glDrawArrays(GLES.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices())
|
|
| 670 | 670 |
if (mesh.showNormals) displayNormals(projection, mesh) |
| 671 | 671 |
mMainProgram!!.stopUsingProgram() |
| 672 | 672 |
} |
| ... | ... | |
| 681 | 681 |
val h = surface.getHeight() |
| 682 | 682 |
val n = surface.getNear() |
| 683 | 683 |
mBlitProgram!!.useProgram() |
| 684 |
GLES31.glViewport(0, 0, w, h)
|
|
| 685 |
GLES31.glUniform1i(mBlitTextureH, 0)
|
|
| 686 |
GLES31.glUniform1f(mBlitDepthH, 1.0f-n)
|
|
| 687 |
GLES31.glVertexAttribPointer(mBlitProgram!!.mAttribute!![0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 688 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 684 |
GLES.glViewport(0, 0, w, h) |
|
| 685 |
GLES.glUniform1i(mBlitTextureH, 0) |
|
| 686 |
GLES.glUniform1f(mBlitDepthH, 1.0f-n) |
|
| 687 |
GLES.glVertexAttribPointer(mBlitProgram!!.mAttribute!![0], 2, GLES.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 688 |
GLES.glDrawArrays(GLES.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 689 | 689 |
mBlitProgram!!.stopUsingProgram() |
| 690 | 690 |
} |
| 691 | 691 |
} |
| ... | ... | |
| 698 | 698 |
mBlitDepthProgram!!.useProgram() |
| 699 | 699 |
val w = surface.getWidth() |
| 700 | 700 |
val h = surface.getHeight() |
| 701 |
GLES31.glViewport(0, 0, w, h)
|
|
| 702 |
GLES31.glUniform1i(mBlitDepthTextureH, 0)
|
|
| 703 |
GLES31.glUniform1i(mBlitDepthDepthTextureH, 1)
|
|
| 704 |
GLES31.glUniform2f(mBlitDepthTexCorrH, corrW, corrH)
|
|
| 705 |
GLES31.glVertexAttribPointer(mBlitDepthProgram!!.mAttribute!![0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 706 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 701 |
GLES.glViewport(0, 0, w, h) |
|
| 702 |
GLES.glUniform1i(mBlitDepthTextureH, 0) |
|
| 703 |
GLES.glUniform1i(mBlitDepthDepthTextureH, 1) |
|
| 704 |
GLES.glUniform2f(mBlitDepthTexCorrH, corrW, corrH) |
|
| 705 |
GLES.glVertexAttribPointer(mBlitDepthProgram!!.mAttribute!![0], 2, GLES.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 706 |
GLES.glDrawArrays(GLES.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 707 | 707 |
mBlitDepthProgram!!.stopUsingProgram() |
| 708 | 708 |
} |
| 709 | 709 |
} |
| ... | ... | |
| 712 | 712 |
// yes it is safe to be mixing 3.0 and 3.1 like that, senior members of the OpenGL discussions forum assert |
| 713 | 713 |
private fun printPreviousBuffer(): Int |
| 714 | 714 |
{
|
| 715 |
val atomicBuf = GLES31.glMapBufferRange(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4, GLES31.GL_MAP_READ_BIT) as ByteBuffer
|
|
| 715 |
val atomicBuf = GLES.glMapBufferRange(GLES.GL_ATOMIC_COUNTER_BUFFER, 0, 4, GLES.GL_MAP_READ_BIT)
|
|
| 716 | 716 |
val atomicIntBuf = atomicBuf.order(ByteOrder.nativeOrder()).asIntBuffer() |
| 717 | 717 |
val counter = atomicIntBuf[0] |
| 718 | 718 |
|
| 719 |
GLES31.glUnmapBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER)
|
|
| 719 |
GLES.glUnmapBuffer(GLES.GL_ATOMIC_COUNTER_BUFFER)
|
|
| 720 | 720 |
|
| 721 | 721 |
return counter |
| 722 | 722 |
} |
| ... | ... | |
| 724 | 724 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 725 | 725 |
private fun zeroBuffer() |
| 726 | 726 |
{
|
| 727 |
val atomicBuf = GLES31.glMapBufferRange(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4, GLES31.GL_MAP_WRITE_BIT or GLES31.GL_MAP_INVALIDATE_BUFFER_BIT) as ByteBuffer
|
|
| 727 |
val atomicBuf = GLES.glMapBufferRange(GLES.GL_ATOMIC_COUNTER_BUFFER, 0, 4, GLES.GL_MAP_WRITE_BIT or GLES.GL_MAP_INVALIDATE_BUFFER_BIT)
|
|
| 728 | 728 |
val atomicIntBuf = atomicBuf.order(ByteOrder.nativeOrder()).asIntBuffer() |
| 729 | 729 |
atomicIntBuf.put(0, 0) |
| 730 | 730 |
|
| 731 |
GLES31.glUnmapBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER)
|
|
| 731 |
GLES.glUnmapBuffer(GLES.GL_ATOMIC_COUNTER_BUFFER)
|
|
| 732 | 732 |
} |
| 733 | 733 |
|
| 734 | 734 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 741 | 741 |
{
|
| 742 | 742 |
mAtomicCounter = IntArray(queueSize) |
| 743 | 743 |
|
| 744 |
GLES31.glGenBuffers(queueSize, mAtomicCounter, 0)
|
|
| 744 |
GLES.glGenBuffers(queueSize, mAtomicCounter!!, 0)
|
|
| 745 | 745 |
|
| 746 | 746 |
for (i in 0 until queueSize) |
| 747 | 747 |
{
|
| 748 |
GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter!![i])
|
|
| 749 |
GLES31.glBufferData(GLES31.GL_ATOMIC_COUNTER_BUFFER, 4, null, GLES31.GL_DYNAMIC_DRAW)
|
|
| 748 |
GLES.glBindBuffer(GLES.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter!![i])
|
|
| 749 |
GLES.glBufferData(GLES.GL_ATOMIC_COUNTER_BUFFER, 4, null, GLES.GL_DYNAMIC_DRAW)
|
|
| 750 | 750 |
zeroBuffer() |
| 751 | 751 |
} |
| 752 | 752 |
} |
| ... | ... | |
| 755 | 755 |
// about 3%; doing it only once every 5 frames affects speed by less than 1%. |
| 756 | 756 |
if (mCurrBuffer==0) |
| 757 | 757 |
{
|
| 758 |
GLES31.glBindBufferBase(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter!![mCurrBuffer])
|
|
| 758 |
GLES.glBindBufferBase(GLES.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter!![mCurrBuffer])
|
|
| 759 | 759 |
counter = printPreviousBuffer() |
| 760 | 760 |
} |
| 761 | 761 |
|
| 762 | 762 |
if (++mCurrBuffer>=queueSize) mCurrBuffer = 0 |
| 763 | 763 |
|
| 764 |
GLES31.glBindBufferBase(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter!![mCurrBuffer])
|
|
| 764 |
GLES.glBindBufferBase(GLES.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter!![mCurrBuffer])
|
|
| 765 | 765 |
zeroBuffer() |
| 766 | 766 |
|
| 767 | 767 |
return counter |
| ... | ... | |
| 798 | 798 |
|
| 799 | 799 |
if (mLinkedListSSBO[0]<0) |
| 800 | 800 |
{
|
| 801 |
GLES31.glGenBuffers(1, mLinkedListSSBO, 0)
|
|
| 801 |
GLES.glGenBuffers(1, mLinkedListSSBO, 0) |
|
| 802 | 802 |
|
| 803 | 803 |
val size = (w*h*(3*mBufferSize+1)*4).toInt() |
| 804 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0])
|
|
| 805 |
GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES31.GL_DYNAMIC_READ or GLES31.GL_DYNAMIC_DRAW)
|
|
| 806 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0)
|
|
| 804 |
GLES.glBindBuffer(GLES.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0])
|
|
| 805 |
GLES.glBufferData(GLES.GL_SHADER_STORAGE_BUFFER, size, null, GLES.GL_DYNAMIC_READ or GLES.GL_DYNAMIC_DRAW)
|
|
| 806 |
GLES.glBindBuffer(GLES.GL_SHADER_STORAGE_BUFFER, 0)
|
|
| 807 | 807 |
|
| 808 |
GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0])
|
|
| 808 |
GLES.glBindBufferBase(GLES.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0])
|
|
| 809 | 809 |
} |
| 810 | 810 |
|
| 811 | 811 |
// See if we have overflown the SSBO in one of the previous frames. |
| ... | ... | |
| 816 | 816 |
{
|
| 817 | 817 |
mBufferSize *= (overflow+1.0f).toInt().toFloat() |
| 818 | 818 |
val size = (w*h*(3*mBufferSize+1)*4).toInt() |
| 819 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0])
|
|
| 820 |
GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES31.GL_DYNAMIC_READ or GLES31.GL_DYNAMIC_DRAW)
|
|
| 821 |
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0)
|
|
| 819 |
GLES.glBindBuffer(GLES.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0])
|
|
| 820 |
GLES.glBufferData(GLES.GL_SHADER_STORAGE_BUFFER, size, null, GLES.GL_DYNAMIC_READ or GLES.GL_DYNAMIC_DRAW)
|
|
| 821 |
GLES.glBindBuffer(GLES.GL_SHADER_STORAGE_BUFFER, 0)
|
|
| 822 | 822 |
} |
| 823 | 823 |
|
| 824 | 824 |
mOITClearProgram!!.useProgram() |
| 825 |
GLES31.glViewport(0, 0, w, h)
|
|
| 826 |
GLES31.glUniform2f(mOITClearTexCorrH, 1.0f, 1.0f) // corrections do not really matter here - only present because of common vertex shader.
|
|
| 827 |
GLES31.glUniform1f(mOITClearDepthH, 1.0f) // likewise depth
|
|
| 828 |
GLES31.glUniform2ui(mOITClearSizeH, w, h)
|
|
| 829 |
GLES31.glVertexAttribPointer(mOITClearProgram!!.mAttribute!![0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 830 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 825 |
GLES.glViewport(0, 0, w, h) |
|
| 826 |
GLES.glUniform2f(mOITClearTexCorrH, 1.0f, 1.0f) // corrections do not really matter here - only present because of common vertex shader. |
|
| 827 |
GLES.glUniform1f(mOITClearDepthH, 1.0f) // likewise depth |
|
| 828 |
GLES.glUniform2ui(mOITClearSizeH, w, h) |
|
| 829 |
GLES.glVertexAttribPointer(mOITClearProgram!!.mAttribute!![0], 2, GLES.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 830 |
GLES.glDrawArrays(GLES.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 831 | 831 |
mOITClearProgram!!.stopUsingProgram() |
| 832 | 832 |
} |
| 833 | 833 |
|
| ... | ... | |
| 841 | 841 |
val h = surface.getHeight() |
| 842 | 842 |
val n = surface.getNear() |
| 843 | 843 |
mOITBuildProgram!!.useProgram() |
| 844 |
GLES31.glViewport(0, 0, w, h)
|
|
| 845 |
GLES31.glUniform1i(mOITBuildTextureH, 0)
|
|
| 846 |
GLES31.glUniform1i(mOITBuildDepthTextureH, 1)
|
|
| 847 |
GLES31.glUniform2f(mOITBuildTexCorrH, corrW, corrH)
|
|
| 848 |
GLES31.glUniform2ui(mOITBuildSizeH, w, h)
|
|
| 849 |
GLES31.glUniform1ui(mOITBuildNumRecordsH, (mBufferSize*w*h).toInt())
|
|
| 850 |
GLES31.glUniform1f(mOITBuildDepthH, 1.0f-n)
|
|
| 851 |
GLES31.glVertexAttribPointer(mOITBuildProgram!!.mAttribute!![0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 852 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 844 |
GLES.glViewport(0, 0, w, h) |
|
| 845 |
GLES.glUniform1i(mOITBuildTextureH, 0) |
|
| 846 |
GLES.glUniform1i(mOITBuildDepthTextureH, 1) |
|
| 847 |
GLES.glUniform2f(mOITBuildTexCorrH, corrW, corrH) |
|
| 848 |
GLES.glUniform2ui(mOITBuildSizeH, w, h) |
|
| 849 |
GLES.glUniform1ui(mOITBuildNumRecordsH, (mBufferSize*w*h).toInt()) |
|
| 850 |
GLES.glUniform1f(mOITBuildDepthH, 1.0f-n) |
|
| 851 |
GLES.glVertexAttribPointer(mOITBuildProgram!!.mAttribute!![0], 2, GLES.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 852 |
GLES.glDrawArrays(GLES.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 853 | 853 |
mOITBuildProgram!!.stopUsingProgram() |
| 854 | 854 |
} |
| 855 | 855 |
} |
| ... | ... | |
| 864 | 864 |
val h = surface.getHeight() |
| 865 | 865 |
val n = surface.getNear() |
| 866 | 866 |
mOITCollapseProgram!!.useProgram() |
| 867 |
GLES31.glViewport(0, 0, w, h)
|
|
| 868 |
GLES31.glUniform1i(mOITCollapseDepthTextureH, 1)
|
|
| 869 |
GLES31.glUniform2f(mOITCollapseTexCorrH, corrW, corrH)
|
|
| 870 |
GLES31.glUniform2ui(mOITCollapseSizeH, w, h)
|
|
| 871 |
GLES31.glUniform1f(mOITCollapseDepthH, 1.0f-n)
|
|
| 872 |
GLES31.glVertexAttribPointer(mOITCollapseProgram!!.mAttribute!![0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 873 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 867 |
GLES.glViewport(0, 0, w, h) |
|
| 868 |
GLES.glUniform1i(mOITCollapseDepthTextureH, 1) |
|
| 869 |
GLES.glUniform2f(mOITCollapseTexCorrH, corrW, corrH) |
|
| 870 |
GLES.glUniform2ui(mOITCollapseSizeH, w, h) |
|
| 871 |
GLES.glUniform1f(mOITCollapseDepthH, 1.0f-n) |
|
| 872 |
GLES.glVertexAttribPointer(mOITCollapseProgram!!.mAttribute!![0], 2, GLES.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 873 |
GLES.glDrawArrays(GLES.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 874 | 874 |
mOITCollapseProgram!!.stopUsingProgram() |
| 875 | 875 |
} |
| 876 | 876 |
} |
| ... | ... | |
| 885 | 885 |
val h = surface.getHeight() |
| 886 | 886 |
val n = surface.getNear() |
| 887 | 887 |
mOITRenderProgram!!.useProgram() |
| 888 |
GLES31.glViewport(0, 0, w, h)
|
|
| 889 |
GLES31.glUniform2f(mOITRenderTexCorrH, corrW, corrH)
|
|
| 890 |
GLES31.glUniform2ui(mOITRenderSizeH, w, h)
|
|
| 891 |
GLES31.glUniform1f(mOITRenderDepthH, 1.0f-n)
|
|
| 892 |
GLES31.glVertexAttribPointer(mOITRenderProgram!!.mAttribute!![0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 893 |
GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 888 |
GLES.glViewport(0, 0, w, h) |
|
| 889 |
GLES.glUniform2f(mOITRenderTexCorrH, corrW, corrH) |
|
| 890 |
GLES.glUniform2ui(mOITRenderSizeH, w, h) |
|
| 891 |
GLES.glUniform1f(mOITRenderDepthH, 1.0f-n) |
|
| 892 |
GLES.glVertexAttribPointer(mOITRenderProgram!!.mAttribute!![0], 2, GLES.GL_FLOAT, false, 0, mQuadPositions)
|
|
| 893 |
GLES.glDrawArrays(GLES.GL_TRIANGLE_STRIP, 0, 4)
|
|
| 894 | 894 |
mOITRenderProgram!!.stopUsingProgram() |
| 895 | 895 |
} |
| 896 | 896 |
} |
| ... | ... | |
| 925 | 925 |
// PowerVR GE8100 / GE8300 compiler fails to compile OIT programs. |
| 926 | 926 |
private fun detectBuggyDriversAndSetQueueSize(queueSize: Int) |
| 927 | 927 |
{
|
| 928 |
driverVendor = GLES31.glGetString(GLES31.GL_VENDOR)
|
|
| 929 |
driverVersion = GLES31.glGetString(GLES31.GL_VERSION)
|
|
| 930 |
driverRenderer = GLES31.glGetString(GLES31.GL_RENDERER)
|
|
| 928 |
driverVendor = GLES.glGetString(GLES.GL_VENDOR)
|
|
| 929 |
driverVersion = GLES.glGetString(GLES.GL_VERSION)
|
|
| 930 |
driverRenderer = GLES.glGetString(GLES.GL_RENDERER)
|
|
| 931 | 931 |
|
| 932 | 932 |
DistortedLibrary.queueSize = 1 |
| 933 | 933 |
mFastCompilationTF = true |
| ... | ... | |
| 955 | 955 |
if ( driverRenderer!!.contains("GE8") )
|
| 956 | 956 |
{
|
| 957 | 957 |
mUser.logMessage("You are running this on a PowerVR GE8XXX.\nDue to a buggy compiler OIT rendering will not work")
|
| 958 |
mUser.logMessage("GLSL Version "+GLES31.glGetString(GLES31.GL_SHADING_LANGUAGE_VERSION))
|
|
| 958 |
mUser.logMessage("GLSL Version "+GLES.glGetString(GLES.GL_SHADING_LANGUAGE_VERSION))
|
|
| 959 | 959 |
} |
| 960 | 960 |
} |
| 961 | 961 |
else if (driverVendor!=null && driverVendor!!.contains("Qualcomm"))
|
| ... | ... | |
| 981 | 981 |
{
|
| 982 | 982 |
val major = IntArray(1) |
| 983 | 983 |
val minor = IntArray(1) |
| 984 |
GLES31.glGetIntegerv(GLES31.GL_MAJOR_VERSION, major, 0)
|
|
| 985 |
GLES31.glGetIntegerv(GLES31.GL_MINOR_VERSION, minor, 0)
|
|
| 984 |
GLES.glGetIntegerv(GLES.GL_MAJOR_VERSION, major, 0)
|
|
| 985 |
GLES.glGetIntegerv(GLES.GL_MINOR_VERSION, minor, 0)
|
|
| 986 | 986 |
return major[0]*100+minor[0]*10 |
| 987 | 987 |
} |
| 988 | 988 |
|
| ... | ... | |
| 1021 | 1021 |
} |
| 1022 | 1022 |
|
| 1023 | 1023 |
val tmp = IntArray(1) |
| 1024 |
GLES31.glGetIntegerv(GLES31.GL_MAX_TEXTURE_SIZE, tmp, 0)
|
|
| 1024 |
GLES.glGetIntegerv(GLES.GL_MAX_TEXTURE_SIZE, tmp, 0)
|
|
| 1025 | 1025 |
maxTextureSize = tmp[0] |
| 1026 |
GLES31.glGetIntegerv(GLES31.GL_MAX_VERTEX_UNIFORM_VECTORS, tmp, 0)
|
|
| 1026 |
GLES.glGetIntegerv(GLES.GL_MAX_VERTEX_UNIFORM_VECTORS, tmp, 0)
|
|
| 1027 | 1027 |
maxVertexUniforms = tmp[0] |
| 1028 |
GLES31.glGetIntegerv(GLES31.GL_MAX_FRAGMENT_UNIFORM_VECTORS, tmp, 0)
|
|
| 1028 |
GLES.glGetIntegerv(GLES.GL_MAX_FRAGMENT_UNIFORM_VECTORS, tmp, 0)
|
|
| 1029 | 1029 |
maxFragmentUniforms = tmp[0] |
| 1030 | 1030 |
|
| 1031 | 1031 |
mUser.logMessage("Using OpenGL ES $major.$minor texSize=$maxTextureSize maxVerUniforms: $maxVertexUniforms maxFraUniforms: $maxFragmentUniforms")
|
| ... | ... | |
| 1077 | 1077 |
{
|
| 1078 | 1078 |
if (on) |
| 1079 | 1079 |
{
|
| 1080 |
GLES31.glEnable(GLES31.GL_CULL_FACE)
|
|
| 1081 |
GLES31.glCullFace(GLES31.GL_FRONT)
|
|
| 1080 |
GLES.glEnable(GLES.GL_CULL_FACE)
|
|
| 1081 |
GLES.glCullFace(GLES.GL_FRONT)
|
|
| 1082 | 1082 |
} |
| 1083 | 1083 |
else |
| 1084 | 1084 |
{
|
| 1085 |
GLES31.glDisable(GLES31.GL_CULL_FACE)
|
|
| 1085 |
GLES.glDisable(GLES.GL_CULL_FACE)
|
|
| 1086 | 1086 |
} |
| 1087 | 1087 |
} |
| 1088 | 1088 |
|
| src/main/java/org/distorted/library/main/DistortedNode.kt | ||
|---|---|---|
| 19 | 19 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 20 | 20 |
package org.distorted.library.main |
| 21 | 21 |
|
| 22 |
import android.opengl.GLES31
|
|
| 22 |
import org.distorted.library.platform.GLES
|
|
| 23 | 23 |
import org.distorted.library.main.InternalNodeData.Companion.returnData |
| 24 | 24 |
import org.distorted.library.mesh.MeshBase |
| 25 | 25 |
|
| ... | ... | |
| 165 | 165 |
if( setAsInput() ) |
| 166 | 166 |
{
|
| 167 | 167 |
mState.apply() |
| 168 |
GLES31.glDisable(GLES31.GL_BLEND)
|
|
| 168 |
GLES.glDisable(GLES.GL_BLEND)
|
|
| 169 | 169 |
if (mLastTime==0L) mLastTime = currTime |
| 170 | 170 |
DistortedLibrary.drawPriv(mEffects, mMesh, surface, currTime, (currTime-mLastTime)) |
| 171 | 171 |
mLastTime = currTime |
| 172 |
GLES31.glEnable(GLES31.GL_BLEND)
|
|
| 172 |
GLES.glEnable(GLES.GL_BLEND)
|
|
| 173 | 173 |
return 1 |
| 174 | 174 |
} |
| 175 | 175 |
|
| src/main/java/org/distorted/library/main/DistortedScreen.kt | ||
|---|---|---|
| 22 | 22 |
import android.graphics.Bitmap |
| 23 | 23 |
import android.graphics.Canvas |
| 24 | 24 |
import android.graphics.Paint |
| 25 |
import android.opengl.GLES31
|
|
| 25 |
import org.distorted.library.platform.GLES
|
|
| 26 | 26 |
import org.distorted.library.effect.MatrixEffectMove |
| 27 | 27 |
import org.distorted.library.effect.MatrixEffectScale |
| 28 | 28 |
import org.distorted.library.mesh.MeshQuad |
| ... | ... | |
| 171 | 171 |
|
| 172 | 172 |
val numrender = super.render(time, mCurRenderedFBO) |
| 173 | 173 |
|
| 174 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0)
|
|
| 174 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, 0)
|
|
| 175 | 175 |
|
| 176 | 176 |
// workaround for the Mali issues: blit the framebuffer we have computed DistortedLibrary.FBO_QUEUE_SIZE |
| 177 | 177 |
// frames ago. Looks like FBO_QUEUE_SIZE=2 solves the issue already but I decided to play it safe and |
| ... | ... | |
| 180 | 180 |
// on speed. Maybe a slight positive effect if any! |
| 181 | 181 |
setAsInput(mToBeBlittedFBO, 0) |
| 182 | 182 |
|
| 183 |
GLES31.glColorMask(true, true, true, true)
|
|
| 184 |
GLES31.glDepthMask(false)
|
|
| 185 |
GLES31.glDisable(GLES31.GL_STENCIL_TEST)
|
|
| 186 |
GLES31.glDisable(GLES31.GL_DEPTH_TEST)
|
|
| 187 |
GLES31.glDisable(GLES31.GL_BLEND)
|
|
| 183 |
GLES.glColorMask(true, true, true, true) |
|
| 184 |
GLES.glDepthMask(false) |
|
| 185 |
GLES.glDisable(GLES.GL_STENCIL_TEST)
|
|
| 186 |
GLES.glDisable(GLES.GL_DEPTH_TEST)
|
|
| 187 |
GLES.glDisable(GLES.GL_BLEND)
|
|
| 188 | 188 |
|
| 189 | 189 |
DistortedLibrary.blitPriv(this) |
| 190 | 190 |
|
| ... | ... | |
| 208 | 208 |
mToBeBlittedFBO = 0 |
| 209 | 209 |
} |
| 210 | 210 |
/* |
| 211 |
int err = GLES31.glGetError();
|
|
| 211 |
int err = GLES.glGetError(); |
|
| 212 | 212 |
|
| 213 |
if( err!=GLES31.GL_NO_ERROR )
|
|
| 213 |
if( err!=GLES.GL_NO_ERROR ) |
|
| 214 | 214 |
{
|
| 215 | 215 |
DistortedLibrary.logMessage("DistortedScreen: OpenGL error "+err);
|
| 216 | 216 |
} |
| src/main/java/org/distorted/library/main/DistortedTexture.kt | ||
|---|---|---|
| 23 | 23 |
import android.graphics.Canvas |
| 24 | 24 |
import android.graphics.Matrix |
| 25 | 25 |
import android.graphics.Paint |
| 26 |
import android.opengl.GLES31
|
|
| 26 |
import org.distorted.library.platform.GLES
|
|
| 27 | 27 |
import android.opengl.GLUtils |
| 28 | 28 |
|
| 29 | 29 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 67 | 67 |
if (mColorCreated==NOT_CREATED_YET) |
| 68 | 68 |
{
|
| 69 | 69 |
mColorCreated = CREATED |
| 70 |
GLES31.glGenTextures(1, mColorH, 0)
|
|
| 70 |
GLES.glGenTextures(1, mColorH, 0) |
|
| 71 | 71 |
} |
| 72 | 72 |
|
| 73 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, mColorH!![0])
|
|
| 74 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MIN_FILTER, GLES31.GL_LINEAR)
|
|
| 75 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_MAG_FILTER, GLES31.GL_LINEAR)
|
|
| 76 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_S, GLES31.GL_CLAMP_TO_EDGE)
|
|
| 77 |
GLES31.glTexParameteri(GLES31.GL_TEXTURE_2D, GLES31.GL_TEXTURE_WRAP_T, GLES31.GL_CLAMP_TO_EDGE)
|
|
| 78 |
GLUtils.texImage2D(GLES31.GL_TEXTURE_2D, 0, if (mBitmapInverted) mBmp else flipBitmap(mBmp!!), 0)
|
|
| 79 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, 0)
|
|
| 73 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, mColorH!![0])
|
|
| 74 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_MIN_FILTER, GLES.GL_LINEAR)
|
|
| 75 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_MAG_FILTER, GLES.GL_LINEAR)
|
|
| 76 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_WRAP_S, GLES.GL_CLAMP_TO_EDGE)
|
|
| 77 |
GLES.glTexParameteri(GLES.GL_TEXTURE_2D, GLES.GL_TEXTURE_WRAP_T, GLES.GL_CLAMP_TO_EDGE)
|
|
| 78 |
GLUtils.texImage2D(GLES.GL_TEXTURE_2D, 0, if (mBitmapInverted) mBmp else flipBitmap(mBmp!!), 0) |
|
| 79 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, 0)
|
|
| 80 | 80 |
|
| 81 | 81 |
mBmp = null |
| 82 | 82 |
} |
| ... | ... | |
| 88 | 88 |
{
|
| 89 | 89 |
if (mColorH!![0]>0) |
| 90 | 90 |
{
|
| 91 |
GLES31.glDeleteTextures(1, mColorH, 0)
|
|
| 91 |
GLES.glDeleteTextures(1, mColorH, 0) |
|
| 92 | 92 |
mColorH!![0] = 0 |
| 93 | 93 |
mColorCreated = NOT_CREATED_YET |
| 94 | 94 |
} |
| src/main/java/org/distorted/library/main/InternalBuffer.kt | ||
|---|---|---|
| 19 | 19 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 20 | 20 |
package org.distorted.library.main |
| 21 | 21 |
|
| 22 |
import android.opengl.GLES31
|
|
| 22 |
import org.distorted.library.platform.GLES
|
|
| 23 | 23 |
|
| 24 | 24 |
import java.nio.Buffer |
| 25 | 25 |
import java.nio.ByteBuffer |
| ... | ... | |
| 55 | 55 |
constructor() : super(TYPE_USER, STORAGE_PRIVATE) |
| 56 | 56 |
{
|
| 57 | 57 |
mIndex = IntArray(1) |
| 58 |
mTarget = GLES31.GL_UNIFORM_BUFFER
|
|
| 59 |
mUsage = GLES31.GL_STATIC_DRAW
|
|
| 58 |
mTarget = GLES.GL_UNIFORM_BUFFER |
|
| 59 |
mUsage = GLES.GL_STATIC_DRAW |
|
| 60 | 60 |
mBuffer = null |
| 61 | 61 |
mSize = 0 |
| 62 | 62 |
mStatus = RECREATE |
| ... | ... | |
| 92 | 92 |
mBuffer = null |
| 93 | 93 |
} |
| 94 | 94 |
|
| 95 |
GLES31.glGenBuffers(1, mIndex, 0)
|
|
| 96 |
GLES31.glBindBuffer(mTarget, mIndex[0])
|
|
| 97 |
GLES31.glBufferData(mTarget, mSize, mBuffer, mUsage)
|
|
| 98 |
GLES31.glBindBuffer(mTarget, 0)
|
|
| 95 |
GLES.glGenBuffers(1, mIndex, 0) |
|
| 96 |
GLES.glBindBuffer(mTarget, mIndex[0]) |
|
| 97 |
GLES.glBufferData(mTarget, mSize, mBuffer, mUsage) |
|
| 98 |
GLES.glBindBuffer(mTarget, 0) |
|
| 99 | 99 |
|
| 100 | 100 |
markWasCreatedImmediately() |
| 101 | 101 |
} |
| ... | ... | |
| 128 | 128 |
mBuffer = null |
| 129 | 129 |
} |
| 130 | 130 |
|
| 131 |
GLES31.glGenBuffers(1, mIndex, 0)
|
|
| 132 |
GLES31.glBindBuffer(mTarget, mIndex[0])
|
|
| 133 |
GLES31.glBufferData(mTarget, mSize, mBuffer, mUsage)
|
|
| 134 |
GLES31.glBindBuffer(mTarget, 0)
|
|
| 131 |
GLES.glGenBuffers(1, mIndex, 0) |
|
| 132 |
GLES.glBindBuffer(mTarget, mIndex[0]) |
|
| 133 |
GLES.glBufferData(mTarget, mSize, mBuffer, mUsage) |
|
| 134 |
GLES.glBindBuffer(mTarget, 0) |
|
| 135 | 135 |
|
| 136 | 136 |
markWasCreatedImmediately() |
| 137 | 137 |
} |
| ... | ... | |
| 151 | 151 |
{
|
| 152 | 152 |
(mBuffer as FloatBuffer).put(buffer).position(0) |
| 153 | 153 |
|
| 154 |
GLES31.glBindBuffer(mTarget, mIndex[0])
|
|
| 155 |
GLES31.glBufferData(mTarget, mSize, mBuffer, mUsage)
|
|
| 156 |
GLES31.glBindBuffer(mTarget, 0)
|
|
| 154 |
GLES.glBindBuffer(mTarget, mIndex[0]) |
|
| 155 |
GLES.glBufferData(mTarget, mSize, mBuffer, mUsage) |
|
| 156 |
GLES.glBindBuffer(mTarget, 0) |
|
| 157 | 157 |
|
| 158 | 158 |
mStatus = mStatus and (UPDATE.inv()) |
| 159 | 159 |
} |
| ... | ... | |
| 164 | 164 |
{
|
| 165 | 165 |
(mBuffer as IntBuffer).put(buffer).position(0) |
| 166 | 166 |
|
| 167 |
GLES31.glBindBuffer(mTarget, mIndex[0])
|
|
| 168 |
GLES31.glBufferData(mTarget, mSize, mBuffer, mUsage)
|
|
| 169 |
GLES31.glBindBuffer(mTarget, 0)
|
|
| 167 |
GLES.glBindBuffer(mTarget, mIndex[0]) |
|
| 168 |
GLES.glBufferData(mTarget, mSize, mBuffer, mUsage) |
|
| 169 |
GLES.glBindBuffer(mTarget, 0) |
|
| 170 | 170 |
|
| 171 | 171 |
mStatus = mStatus and (UPDATE.inv()) |
| 172 | 172 |
} |
| ... | ... | |
| 190 | 190 |
// must be called from a thread holding OpenGL Context |
| 191 | 191 |
override fun delete() |
| 192 | 192 |
{
|
| 193 |
GLES31.glDeleteBuffers(1, mIndex, 0)
|
|
| 193 |
GLES.glDeleteBuffers(1, mIndex, 0) |
|
| 194 | 194 |
mStatus = mStatus or RECREATE |
| 195 | 195 |
removeFromDone() |
| 196 | 196 |
} |
| src/main/java/org/distorted/library/main/InternalOutputSurface.kt | ||
|---|---|---|
| 19 | 19 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 20 | 20 |
package org.distorted.library.main |
| 21 | 21 |
|
| 22 |
import android.opengl.GLES31
|
|
| 22 |
import org.distorted.library.platform.GLES
|
|
| 23 | 23 |
import org.distorted.library.effect.EffectQuality |
| 24 | 24 |
import org.distorted.library.effect.EffectQuality.Companion.getMipmap |
| 25 | 25 |
import org.distorted.library.effectqueue.EffectQueuePostprocess |
| ... | ... | |
| 101 | 101 |
InternalStackFrameList.toDo() // create the FBOs immediately. This is safe as we must be holding the OpenGL context now. |
| 102 | 102 |
|
| 103 | 103 |
InternalRenderState.colorDepthStencilOn() |
| 104 |
GLES31.glClearColor(CLEAR_R, CLEAR_G, CLEAR_B, CLEAR_A)
|
|
| 105 |
GLES31.glClearDepthf(CLEAR_D)
|
|
| 106 |
GLES31.glClearStencil(CLEAR_S)
|
|
| 104 |
GLES.glClearColor(CLEAR_R, CLEAR_G, CLEAR_B, CLEAR_A) |
|
| 105 |
GLES.glClearDepthf(CLEAR_D) |
|
| 106 |
GLES.glClearStencil(CLEAR_S) |
|
| 107 | 107 |
|
| 108 | 108 |
val colorH = mBuffer[quality]!!.mColorH!! |
| 109 | 109 |
|
| 110 | 110 |
for (k in 0 until queueSize) |
| 111 | 111 |
{
|
| 112 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mBuffer[quality]!!.mFBOH[k])
|
|
| 113 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_COLOR_ATTACHMENT0, GLES31.GL_TEXTURE_2D, colorH[2*k+1], 0)
|
|
| 114 |
GLES31.glClear(GLES31.GL_COLOR_BUFFER_BIT or GLES31.GL_DEPTH_BUFFER_BIT or GLES31.GL_STENCIL_BUFFER_BIT)
|
|
| 115 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_COLOR_ATTACHMENT0, GLES31.GL_TEXTURE_2D, colorH[2*k], 0)
|
|
| 116 |
GLES31.glClear(GLES31.GL_COLOR_BUFFER_BIT)
|
|
| 112 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, mBuffer[quality]!!.mFBOH[k])
|
|
| 113 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_COLOR_ATTACHMENT0, GLES.GL_TEXTURE_2D, colorH[2*k+1], 0)
|
|
| 114 |
GLES.glClear(GLES.GL_COLOR_BUFFER_BIT or GLES.GL_DEPTH_BUFFER_BIT or GLES.GL_STENCIL_BUFFER_BIT)
|
|
| 115 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_COLOR_ATTACHMENT0, GLES.GL_TEXTURE_2D, colorH[2*k], 0)
|
|
| 116 |
GLES.glClear(GLES.GL_COLOR_BUFFER_BIT)
|
|
| 117 | 117 |
} |
| 118 | 118 |
|
| 119 | 119 |
InternalRenderState.colorDepthStencilRestore() |
| 120 | 120 |
|
| 121 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0)
|
|
| 121 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, 0)
|
|
| 122 | 122 |
} |
| 123 | 123 |
|
| 124 | 124 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 137 | 137 |
{
|
| 138 | 138 |
val counter = DistortedLibrary.zeroOutAtomic() |
| 139 | 139 |
DistortedLibrary.oitClear(buffer, counter) |
| 140 |
GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT or GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT)
|
|
| 140 |
GLES.glMemoryBarrier(GLES.GL_SHADER_STORAGE_BARRIER_BIT or GLES.GL_ATOMIC_COUNTER_BARRIER_BIT)
|
|
| 141 | 141 |
} |
| 142 | 142 |
} |
| 143 | 143 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 153 | 153 |
|
| 154 | 154 |
mDepthStencilCreated = (if (mDepthStencil==NO_DEPTH_NO_STENCIL) DONT_CREATE else NOT_CREATED_YET) |
| 155 | 155 |
|
| 156 |
mClear = GLES31.GL_DEPTH_BUFFER_BIT or GLES31.GL_COLOR_BUFFER_BIT
|
|
| 156 |
mClear = GLES.GL_DEPTH_BUFFER_BIT or GLES.GL_COLOR_BUFFER_BIT
|
|
| 157 | 157 |
|
| 158 | 158 |
mChildren = InternalChildrenList(this) |
| 159 | 159 |
|
| ... | ... | |
| 234 | 234 |
{
|
| 235 | 235 |
val colorH = buffer.mColorH!! |
| 236 | 236 |
|
| 237 |
GLES31.glViewport(0, 0, mWidth, mHeight)
|
|
| 237 |
GLES.glViewport(0, 0, mWidth, mHeight) |
|
| 238 | 238 |
setAsOutput(currTime) |
| 239 |
GLES31.glActiveTexture(GLES31.GL_TEXTURE0)
|
|
| 240 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, colorH[2*fbo])
|
|
| 241 |
GLES31.glActiveTexture(GLES31.GL_TEXTURE1)
|
|
| 242 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, buffer.mDepthStencilH!![fbo])
|
|
| 239 |
GLES.glActiveTexture(GLES.GL_TEXTURE0)
|
|
| 240 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, colorH[2*fbo])
|
|
| 241 |
GLES.glActiveTexture(GLES.GL_TEXTURE1)
|
|
| 242 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, buffer.mDepthStencilH!![fbo])
|
|
| 243 | 243 |
|
| 244 |
GLES31.glDisable(GLES31.GL_STENCIL_TEST)
|
|
| 245 |
GLES31.glStencilMask(0x00)
|
|
| 244 |
GLES.glDisable(GLES.GL_STENCIL_TEST)
|
|
| 245 |
GLES.glStencilMask(0x00) |
|
| 246 | 246 |
|
| 247 | 247 |
DistortedLibrary.blitDepthPriv(this, buffer.widthCorrection, buffer.heightCorrection) |
| 248 |
GLES31.glActiveTexture(GLES31.GL_TEXTURE0)
|
|
| 249 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, 0)
|
|
| 250 |
GLES31.glActiveTexture(GLES31.GL_TEXTURE1)
|
|
| 251 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, 0)
|
|
| 248 |
GLES.glActiveTexture(GLES.GL_TEXTURE0)
|
|
| 249 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, 0)
|
|
| 250 |
GLES.glActiveTexture(GLES.GL_TEXTURE1)
|
|
| 251 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, 0)
|
|
| 252 | 252 |
|
| 253 | 253 |
// clear buffers |
| 254 |
GLES31.glStencilMask(0xff)
|
|
| 255 |
GLES31.glDepthMask(true)
|
|
| 256 |
GLES31.glColorMask(true, true, true, true)
|
|
| 257 |
GLES31.glClearColor(buffer.mClearR, buffer.mClearG, buffer.mClearB, buffer.mClearA)
|
|
| 258 |
GLES31.glClearDepthf(buffer.mClearDepth)
|
|
| 259 |
GLES31.glClearStencil(buffer.mClearStencil)
|
|
| 254 |
GLES.glStencilMask(0xff) |
|
| 255 |
GLES.glDepthMask(true) |
|
| 256 |
GLES.glColorMask(true, true, true, true) |
|
| 257 |
GLES.glClearColor(buffer.mClearR, buffer.mClearG, buffer.mClearB, buffer.mClearA) |
|
| 258 |
GLES.glClearDepthf(buffer.mClearDepth) |
|
| 259 |
GLES.glClearStencil(buffer.mClearStencil) |
|
| 260 | 260 |
|
| 261 | 261 |
buffer.setAsOutput() |
| 262 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_COLOR_ATTACHMENT0, GLES31.GL_TEXTURE_2D, colorH[2*fbo+1], 0)
|
|
| 263 |
GLES31.glClear(GLES31.GL_COLOR_BUFFER_BIT or GLES31.GL_DEPTH_BUFFER_BIT or GLES31.GL_STENCIL_BUFFER_BIT)
|
|
| 264 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_COLOR_ATTACHMENT0, GLES31.GL_TEXTURE_2D, colorH[2*fbo], 0)
|
|
| 265 |
GLES31.glClear(GLES31.GL_COLOR_BUFFER_BIT)
|
|
| 262 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_COLOR_ATTACHMENT0, GLES.GL_TEXTURE_2D, colorH[2*fbo+1], 0)
|
|
| 263 |
GLES.glClear(GLES.GL_COLOR_BUFFER_BIT or GLES.GL_DEPTH_BUFFER_BIT or GLES.GL_STENCIL_BUFFER_BIT)
|
|
| 264 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_COLOR_ATTACHMENT0, GLES.GL_TEXTURE_2D, colorH[2*fbo], 0)
|
|
| 265 |
GLES.glClear(GLES.GL_COLOR_BUFFER_BIT)
|
|
| 266 | 266 |
|
| 267 | 267 |
return 1 |
| 268 | 268 |
} |
| ... | ... | |
| 270 | 270 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 271 | 271 |
private fun oitBuild(time: Long, buffer: InternalOutputSurface, fbo: Int): Int |
| 272 | 272 |
{
|
| 273 |
GLES31.glViewport(0, 0, mWidth, mHeight)
|
|
| 273 |
GLES.glViewport(0, 0, mWidth, mHeight) |
|
| 274 | 274 |
setAsOutput(time) |
| 275 |
GLES31.glActiveTexture(GLES31.GL_TEXTURE0)
|
|
| 276 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, buffer.mColorH!![2*fbo])
|
|
| 277 |
GLES31.glActiveTexture(GLES31.GL_TEXTURE1)
|
|
| 278 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, buffer.mDepthStencilH!![fbo])
|
|
| 275 |
GLES.glActiveTexture(GLES.GL_TEXTURE0)
|
|
| 276 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, buffer.mColorH!![2*fbo])
|
|
| 277 |
GLES.glActiveTexture(GLES.GL_TEXTURE1)
|
|
| 278 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, buffer.mDepthStencilH!![fbo])
|
|
| 279 | 279 |
|
| 280 | 280 |
InternalRenderState.colorDepthStencilOn() |
| 281 | 281 |
InternalRenderState.enableDepthTest() |
| 282 | 282 |
|
| 283 | 283 |
DistortedLibrary.oitBuild(this, buffer.widthCorrection, buffer.heightCorrection) |
| 284 |
GLES31.glActiveTexture(GLES31.GL_TEXTURE0)
|
|
| 285 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, 0)
|
|
| 286 |
GLES31.glActiveTexture(GLES31.GL_TEXTURE1)
|
|
| 287 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, 0)
|
|
| 284 |
GLES.glActiveTexture(GLES.GL_TEXTURE0)
|
|
| 285 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, 0)
|
|
| 286 |
GLES.glActiveTexture(GLES.GL_TEXTURE1)
|
|
| 287 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, 0)
|
|
| 288 | 288 |
|
| 289 | 289 |
InternalRenderState.colorDepthStencilRestore() |
| 290 | 290 |
InternalRenderState.restoreDepthTest() |
| ... | ... | |
| 304 | 304 |
// Otherwise there's no point (in fact we then would create a feedback loop!) |
| 305 | 305 |
if( depthStencil[fbo]!=0 ) |
| 306 | 306 |
{
|
| 307 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0)
|
|
| 308 |
GLES31.glActiveTexture(GLES31.GL_TEXTURE1)
|
|
| 309 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, depthStencil[fbo])
|
|
| 307 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, 0)
|
|
| 308 |
GLES.glActiveTexture(GLES.GL_TEXTURE1)
|
|
| 309 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, depthStencil[fbo])
|
|
| 310 | 310 |
InternalRenderState.switchOffColorDepthStencil() |
| 311 | 311 |
DistortedLibrary.oitCollapse(this, corrW, corrH) |
| 312 |
GLES31.glBindTexture(GLES31.GL_TEXTURE_2D, 0)
|
|
| 312 |
GLES.glBindTexture(GLES.GL_TEXTURE_2D, 0)
|
|
| 313 | 313 |
} |
| 314 | 314 |
|
| 315 | 315 |
setAsOutput(currTime) |
| ... | ... | |
| 324 | 324 |
private fun clear() |
| 325 | 325 |
{
|
| 326 | 326 |
InternalRenderState.colorDepthStencilOn() |
| 327 |
GLES31.glClearColor(mClearR, mClearG, mClearB, mClearA)
|
|
| 328 |
GLES31.glClearDepthf(mClearDepth)
|
|
| 329 |
GLES31.glClearStencil(mClearStencil)
|
|
| 330 |
GLES31.glClear(mClear)
|
|
| 327 |
GLES.glClearColor(mClearR, mClearG, mClearB, mClearA) |
|
| 328 |
GLES.glClearDepthf(mClearDepth) |
|
| 329 |
GLES.glClearStencil(mClearStencil) |
|
| 330 |
GLES.glClear(mClear) |
|
| 331 | 331 |
InternalRenderState.colorDepthStencilRestore() |
| 332 | 332 |
} |
| 333 | 333 |
|
| ... | ... | |
| 361 | 361 |
if( oit ) |
| 362 | 362 |
{
|
| 363 | 363 |
numRenders += oitBuild(time, buffer, fbo) |
| 364 |
GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT or GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT)
|
|
| 364 |
GLES.glMemoryBarrier(GLES.GL_SHADER_STORAGE_BARRIER_BIT or GLES.GL_ATOMIC_COUNTER_BARRIER_BIT)
|
|
| 365 | 365 |
buffer.clearBuffer(fbo) |
| 366 | 366 |
} |
| 367 | 367 |
else |
| ... | ... | |
| 385 | 385 |
if (oit) |
| 386 | 386 |
{
|
| 387 | 387 |
numRenders = child.drawOIT(time, this) |
| 388 |
GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT or GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT)
|
|
| 388 |
GLES.glMemoryBarrier(GLES.GL_SHADER_STORAGE_BARRIER_BIT or GLES.GL_ATOMIC_COUNTER_BARRIER_BIT)
|
|
| 389 | 389 |
} |
| 390 | 390 |
else |
| 391 | 391 |
{
|
| ... | ... | |
| 518 | 518 |
|
| 519 | 519 |
InternalRenderState.colorDepthStencilOn() |
| 520 | 520 |
|
| 521 |
GLES31.glClearColor(mClearR, mClearG, mClearB, mClearA)
|
|
| 522 |
GLES31.glClearDepthf(mClearDepth)
|
|
| 523 |
GLES31.glClearStencil(mClearStencil)
|
|
| 521 |
GLES.glClearColor(mClearR, mClearG, mClearB, mClearA) |
|
| 522 |
GLES.glClearDepthf(mClearDepth) |
|
| 523 |
GLES.glClearStencil(mClearStencil) |
|
| 524 | 524 |
|
| 525 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[fbo])
|
|
| 526 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_COLOR_ATTACHMENT0, GLES31.GL_TEXTURE_2D, colorH[2*fbo+1], 0)
|
|
| 527 |
GLES31.glClear(GLES31.GL_COLOR_BUFFER_BIT or GLES31.GL_DEPTH_BUFFER_BIT or GLES31.GL_STENCIL_BUFFER_BIT)
|
|
| 528 |
GLES31.glFramebufferTexture2D(GLES31.GL_FRAMEBUFFER, GLES31.GL_COLOR_ATTACHMENT0, GLES31.GL_TEXTURE_2D, colorH[2*fbo], 0)
|
|
| 529 |
GLES31.glClear(GLES31.GL_COLOR_BUFFER_BIT)
|
|
| 525 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, mFBOH[fbo])
|
|
| 526 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_COLOR_ATTACHMENT0, GLES.GL_TEXTURE_2D, colorH[2*fbo+1], 0)
|
|
| 527 |
GLES.glClear(GLES.GL_COLOR_BUFFER_BIT or GLES.GL_DEPTH_BUFFER_BIT or GLES.GL_STENCIL_BUFFER_BIT)
|
|
| 528 |
GLES.glFramebufferTexture2D(GLES.GL_FRAMEBUFFER, GLES.GL_COLOR_ATTACHMENT0, GLES.GL_TEXTURE_2D, colorH[2*fbo], 0)
|
|
| 529 |
GLES.glClear(GLES.GL_COLOR_BUFFER_BIT)
|
|
| 530 | 530 |
|
| 531 | 531 |
InternalRenderState.colorDepthStencilRestore() |
| 532 | 532 |
} |
| ... | ... | |
| 534 | 534 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 535 | 535 |
fun setAsOutput(time: Long) |
| 536 | 536 |
{
|
| 537 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[mCurrFBO])
|
|
| 537 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, mFBOH[mCurrFBO])
|
|
| 538 | 538 |
|
| 539 | 539 |
if (mTime[mCurrFBO]!=time) |
| 540 | 540 |
{
|
| ... | ... | |
| 615 | 615 |
*/ |
| 616 | 616 |
fun setAsOutput() |
| 617 | 617 |
{
|
| 618 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[mCurrFBO])
|
|
| 618 |
GLES.glBindFramebuffer(GLES.GL_FRAMEBUFFER, mFBOH[mCurrFBO])
|
|
| 619 | 619 |
} |
| 620 | 620 |
|
| 621 | 621 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 644 | 644 |
|
| 645 | 645 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 646 | 646 |
/** |
| 647 |
* Set the (R,G,B,A) values of GLES31.glClearColor() to set up color with which to clear |
|
| 647 |
* Set the (R,G,B,A) values of GLES.glClearColor() to set up color with which to clear |
|
Also available in: Unified diff
major step forward in collecting all GLES stuff in a single class 'platform.GLES'