Skip to content

Instantly share code, notes, and snippets.

@WanghongLin
Created March 17, 2020 12:10
Show Gist options
  • Save WanghongLin/17f8c84690e3563a0a852f9b53d25d83 to your computer and use it in GitHub Desktop.
Save WanghongLin/17f8c84690e3563a0a852f9b53d25d83 to your computer and use it in GitHub Desktop.
GL10 for Android
import android.graphics.Bitmap
import android.graphics.Canvas
import android.opengl.GLES10
import android.opengl.GLSurfaceView
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_glone.*
import kotlinx.android.synthetic.main.content_glone.*
import java.nio.ByteBuffer
import java.nio.ByteOrder
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10
class GLOneActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_glone)
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
val triangleCoords = ByteBuffer.allocateDirect(9 * 4).order(ByteOrder.nativeOrder())
.asFloatBuffer().put(floatArrayOf(
+0.0f, +0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
+0.5f, -0.5f, 0.0f
)).rewind()
val rectangleCoords = ByteBuffer.allocateDirect(12 * 4).order(ByteOrder.nativeOrder())
.asFloatBuffer().put(floatArrayOf(
-0.7f, +0.7f, 0.0f,
+0.7f, +0.7f, 0.0f,
-0.7f, -0.7f, 0.0f,
+0.7f, -0.7f, 0.0f
)).rewind()
val vertexCoords = ByteBuffer.allocateDirect(12 * 4).order(ByteOrder.nativeOrder())
.asFloatBuffer().put(floatArrayOf(
-1.0f, +1.0f, 0.0f,
+1.0f, +1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
+1.0f, -1.0f, 0.0f
)).rewind()
val texCoords = ByteBuffer.allocateDirect(8 * 4).order(ByteOrder.nativeOrder())
.asFloatBuffer().put(floatArrayOf(
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f
)).rewind()
val drawable = resources.getDrawable(R.mipmap.ic_launcher)
val bitmap = Bitmap.createBitmap(drawable.intrinsicWidth, drawable.intrinsicHeight, Bitmap.Config.ARGB_8888)
Canvas(bitmap).also {
drawable.setBounds(0, 0, it.width, it.height)
drawable.draw(it)
}
glSurfaceView.setRenderer(object : GLSurfaceView.Renderer {
override fun onDrawFrame(gl: GL10?) {
GLES10.glEnable(GLES10.GL_STENCIL_TEST)
GLES10.glEnable(GLES10.GL_DEPTH_TEST)
GLES10.glClearColor(0f, 0f, 0f, 1.0f)
GLES10.glClearStencil(0)
GLES10.glClear(GLES10.GL_COLOR_BUFFER_BIT.or(GLES10.GL_STENCIL_BUFFER_BIT).or(GLES10.GL_DEPTH_BUFFER_BIT))
// GLES10.glColorMask(false, false, false, false)
// GLES10.glDepthMask(false)
GLES10.glStencilFunc(GLES10.GL_ALWAYS, 1, 0xFF)
GLES10.glStencilOp(GLES10.GL_KEEP, GLES10.GL_KEEP, GLES10.GL_REPLACE)
GLES10.glEnableClientState(GLES10.GL_VERTEX_ARRAY)
GLES10.glColor4f(0.0f, 0.0f, 0.0f, 1.0f)
GLES10.glVertexPointer(3, GLES10.GL_FLOAT, 0, triangleCoords)
GLES10.glDrawArrays(GLES10.GL_TRIANGLES, 0, 3)
// GLES10.glColorMask(true, true, true, true)
// GLES10.glDepthMask(true)
GLES10.glStencilFunc(GLES10.GL_NOTEQUAL, 1, 0xFF)
GLES10.glStencilOp(GLES10.GL_KEEP, GLES10.GL_KEEP, GLES10.GL_KEEP)
GLES10.glColor4f(0.0f, 1.0f, 1.0f, 1.0f)
GLES10.glVertexPointer(3, GLES10.GL_FLOAT, 0, rectangleCoords)
GLES10.glDrawArrays(GLES10.GL_TRIANGLE_STRIP, 0, 4)
}
override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
}
override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
}
})
// glSurfaceView.setRenderer(object : GLSurfaceView.Renderer {
// override fun onDrawFrame(gl: GL10?) {
// GLES10.glClearColor(0f, 1.0f, 1.0f, 1.0f)
// GLES10.glClear(GLES10.GL_COLOR_BUFFER_BIT)
//
// GLES10.glEnable(GLES10.GL_TEXTURE_2D)
// GLES10.glClientActiveTexture(GLES10.GL_TEXTURE0)
// GLES10.glActiveTexture(GLES10.GL_TEXTURE0)
// val textures = intArrayOf(0)
// GLES10.glGenTextures(1, textures, 0)
// GLES10.glBindTexture(GLES10.GL_TEXTURE_2D, textures[0])
// GLES10.glTexParameterx(GLES10.GL_TEXTURE_2D, GLES10.GL_TEXTURE_MAG_FILTER, GLES10.GL_LINEAR)
// GLES10.glTexParameterx(GLES10.GL_TEXTURE_2D, GLES10.GL_TEXTURE_MIN_FILTER, GLES10.GL_LINEAR)
// GLES10.glTexParameterx(GLES10.GL_TEXTURE_2D, GLES10.GL_TEXTURE_WRAP_S, GLES10.GL_CLAMP_TO_EDGE)
// GLES10.glTexParameterx(GLES10.GL_TEXTURE_2D, GLES10.GL_TEXTURE_WRAP_S, GLES10.GL_CLAMP_TO_EDGE)
//
// val byteBuffer = ByteBuffer.allocateDirect(bitmap.width * bitmap.height * 4)
// bitmap.copyPixelsToBuffer(byteBuffer)
// byteBuffer.rewind()
// GLES10.glTexImage2D(GLES10.GL_TEXTURE_2D, 0, GLES10.GL_RGBA, bitmap.width, bitmap.height, 0,
// GLES10.GL_RGBA, GLES10.GL_UNSIGNED_BYTE, byteBuffer)
//
// GLES10.glEnableClientState(GLES10.GL_VERTEX_ARRAY)
// GLES10.glEnableClientState(GLES10.GL_TEXTURE_COORD_ARRAY)
//
// GLES10.glTexCoordPointer(2, GLES10.GL_FLOAT, 0, texCoords)
// GLES10.glVertexPointer(3, GLES10.GL_FLOAT, 0, vertexCoords)
// GLES10.glDrawArrays(GLES10.GL_TRIANGLE_STRIP, 0, 4)
//
// GLES10.glDeleteTextures(1, textures, 0)
// GLES10.glDisableClientState(GLES10.GL_VERTEX_ARRAY)
// GLES10.glDisableClientState(GLES10.GL_TEXTURE_COORD_ARRAY)
// GLES10.glDisable(GLES10.GL_TEXTURE_2D)
// }
//
// override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
// GLES10.glViewport(0, 0, width, height)
// }
//
// override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
// }
// })
glSurfaceView.renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment