val img = Mat(frame_height, frame_width, CV_8UC4)
val buffer = img.createBuffer<ByteBuffer>()
gl.glReadBuffer(GL2.GL_FRONT)
gl.glReadPixels(0, 0, frame_width, frame_height, GL2.GL_RGBA, GL2.GL_UNSIGNED_BYTE, buffer)
val img_ = Mat(frame_height, frame_width, CV_8UC4)
flip(img, img_, 0)
opencv_imgproc.cvtColor(img_, img, opencv_imgproc.COLOR_BGRA2RGBA)
imwrite("read_pixel.png", img)
・Vertex Array
glVertexPointerとglDrawArraysで描画
import com.jogamp.common.nio.Buffers
import com.jogamp.opengl.*
import com.jogamp.opengl.awt.GLJPanel
import java.awt.Dimension
import javax.swing.JFrame
class VertexArrayTest : GLEventListener {
val vertices = floatArrayOf(
-0.9f, -0.9f, 0.0f,
0.9f, -0.9f, 0.0f,
0.9f, 0.9f, 0.0f,
-0.9f, 0.9f, 0.0f
)
val vertexBuffer = Buffers.newDirectFloatBuffer(vertices)
override fun init(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)
}
}
override fun reshape(drawable: GLAutoDrawable?, x: Int, y:Int, width: Int, height: Int) {}
override fun display(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClear(GL2.GL_COLOR_BUFFER_BIT)
gl.glEnableClientState(GL2.GL_VERTEX_ARRAY)
gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexBuffer)
gl.glDrawArrays(GL2.GL_QUADS, 0, vertices.size)
gl.glDisableClientState(GL2.GL_VERTEX_ARRAY)
}
}
override fun dispose(drawable: GLAutoDrawable?) {}
}
fun main() {
val frameSize = Dimension(300, 300)
val caps = GLCapabilities(GLProfile.get(GLProfile.GL2))
val frame = JFrame().apply {
size = frameSize
}
val panel = GLJPanel(caps).apply {
addGLEventListener(VertexArrayTest())
}
frame.contentPane.add(panel)
frame.isVisible = true
}
・VBO(頂点情報のみ)
import com.jogamp.common.nio.Buffers
import com.jogamp.opengl.*
import com.jogamp.opengl.awt.GLJPanel
import java.awt.Dimension
import java.nio.IntBuffer
import javax.swing.JFrame
class VboTest : GLEventListener {
val vertices = floatArrayOf(
-0.9f, -0.9f, 0.0f,
0.9f, -0.9f, 0.0f,
0.9f, 0.9f, 0.0f,
-0.9f, 0.9f, 0.0f
)
val vertexBuffer = Buffers.newDirectFloatBuffer(vertices)
val vbo = IntBuffer.allocate(1)
override fun init(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)
// VBOを作成し、頂点データを紐付け
gl.glGenBuffers(1, vbo)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[0])
gl.glBufferData(GL2.GL_ARRAY_BUFFER, vertices.size.toLong() * 4, vertexBuffer, GL2.GL_STATIC_DRAW)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0)
}
}
override fun reshape(drawable: GLAutoDrawable?, x: Int, y:Int, width: Int, height: Int) {}
override fun display(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClear(GL2.GL_COLOR_BUFFER_BIT)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[0])
gl.glEnableClientState(GL2.GL_VERTEX_ARRAY)
gl.glVertexPointer(3, GL2.GL_FLOAT, 0, 0)
gl.glDrawArrays(GL2.GL_QUADS, 0, vertices.size)
gl.glDisableClientState(GL2.GL_VERTEX_ARRAY)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0)
}
}
override fun dispose(drawable: GLAutoDrawable?) {}
}
fun main() {
val frameSize = Dimension(300, 300)
val caps = GLCapabilities(GLProfile.get(GLProfile.GL2))
val frame = JFrame().apply {
size = frameSize
}
val panel = GLJPanel(caps).apply {
addGLEventListener(VboTest())
}
frame.contentPane.add(panel)
frame.isVisible = true
}
・VBO(頂点+インデックス)
import com.jogamp.common.nio.Buffers
import com.jogamp.opengl.*
import com.jogamp.opengl.awt.GLJPanel
import java.awt.Dimension
import java.nio.IntBuffer
import javax.swing.JFrame
class VboTest2 : GLEventListener {
val vertices = floatArrayOf(
-0.9f, -0.9f, 0.0f,
0.9f, -0.9f, 0.0f,
0.9f, 0.9f, 0.0f,
-0.9f, 0.9f, 0.0f
)
val vertexBuffer = Buffers.newDirectFloatBuffer(vertices)
val indices = intArrayOf(0, 1, 2, 0, 2, 3)
val indexBuffer = Buffers.newDirectIntBuffer(indices)
val vertexVbo = IntBuffer.allocate(1)
val indexVbo = IntBuffer.allocate(1)
override fun init(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)
// VBOを作成し、頂点データを紐付け
gl.glGenBuffers(1, vertexVbo)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vertexVbo[0])
gl.glBufferData(GL2.GL_ARRAY_BUFFER, vertices.size.toLong() * 4, vertexBuffer, GL2.GL_STATIC_DRAW)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0)
gl.glGenBuffers(1, indexVbo)
gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, indexVbo[0])
gl.glBufferData(GL2.GL_ELEMENT_ARRAY_BUFFER, indices.size.toLong() * 4, indexBuffer, GL2.GL_STATIC_DRAW)
gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, 0)
}
}
override fun reshape(drawable: GLAutoDrawable?, x: Int, y:Int, width: Int, height: Int) {}
override fun display(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClear(GL2.GL_COLOR_BUFFER_BIT)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vertexVbo[0])
gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, indexVbo[0])
gl.glEnableClientState(GL2.GL_VERTEX_ARRAY)
gl.glVertexPointer(3, GL2.GL_FLOAT, 0, 0)
gl.glDrawElements(GL2.GL_TRIANGLES, indices.size, GL2.GL_UNSIGNED_INT, 0)
gl.glDisableClientState(GL2.GL_VERTEX_ARRAY)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0)
gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, 0)
}
}
override fun dispose(drawable: GLAutoDrawable?) {}
}
fun main() {
val frameSize = Dimension(300, 300)
val caps = GLCapabilities(GLProfile.get(GLProfile.GL2))
val frame = JFrame().apply {
size = frameSize
}
val panel = GLJPanel(caps).apply {
addGLEventListener(VboTest2())
}
frame.contentPane.add(panel)
frame.isVisible = true
}
]]>