あかすくぱるふぇ

同人サークル「あかすくぱるふぇ」のブログです。

2022年02月

import com.jogamp.common.nio.Buffers
import com.jogamp.opengl.GL2
import com.jogamp.opengl.GLAutoDrawable
import com.jogamp.opengl.GLEventListener
import java.io.BufferedReader
import java.io.FileReader
import java.nio.IntBuffer

class ColorShader : GLEventListener {

private var frame_width = 0
private var frame_height = 0

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 colors = floatArrayOf(
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f
)

val vertexBuffer = Buffers.newDirectFloatBuffer(vertices)
val colorBuffer = Buffers.newDirectFloatBuffer(colors)

val vbo = IntBuffer.allocate(2)

private var programId : Int? = null

fun readShaderSource(filename : String) : String {
val br = BufferedReader(FileReader(filename))
var result = ""
var str = br.readLine()
while (str != null) {
result += str + "\n"
str = br.readLine()
}
return result
}

override fun init(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)

gl.glGenBuffers(2, 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, vbo[1])
gl.glBufferData(GL2.GL_ARRAY_BUFFER, colors.size.toLong() * 4, colorBuffer, GL2.GL_STATIC_DRAW)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0)

val vertSource = readShaderSource("simple3.vert")
val fragSource = readShaderSource("simple3.frag")

programId = gl.glCreateProgram()

val vertexShader = gl.glCreateShader(GL2.GL_VERTEX_SHADER)
gl.glShaderSource(vertexShader, 1, arrayOf(vertSource), null)
gl.glCompileShader(vertexShader)
gl.glAttachShader(programId!!, vertexShader)

val fragmentShader = gl.glCreateShader(GL2.GL_FRAGMENT_SHADER)
gl.glShaderSource(fragmentShader, 1, arrayOf(fragSource), null)
gl.glCompileShader(fragmentShader)
gl.glAttachShader(programId!!, fragmentShader)

gl.glLinkProgram(programId!!)
}
}

override fun reshape(drawable: GLAutoDrawable?, x: Int, y: Int, width: Int, height: Int) {
frame_width = width
frame_height = height
}

override fun display(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2

gl.glViewport(0, 0, frame_width, frame_height)
gl.glClear(GL2.GL_COLOR_BUFFER_BIT or GL2.GL_DEPTH_BUFFER_BIT)

gl.glUseProgram(programId!!)

val vertexPositionId = gl.glGetAttribLocation(programId!!, "VertexPosition")
val vertexColorId = gl.glGetAttribLocation(programId!!, "VertexColor")
gl.glEnableVertexAttribArray(vertexPositionId)
gl.glEnableVertexAttribArray(vertexColorId)

gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[0])
gl.glVertexAttribPointer(vertexPositionId, 3, GL2.GL_FLOAT, false, 0, 0)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[1])
gl.glVertexAttribPointer(vertexColorId, 3, GL2.GL_FLOAT, false, 0, 0)

gl.glDrawArrays(GL2.GL_QUADS, 0, vertices.size)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0)
}
}
override fun dispose(drawable: GLAutoDrawable?) {}
}
#version 400
in vec4 VertexPosition;
in vec4 VertexColor;
out vec4 color;

void main(void)
{
gl_Position = VertexPosition;
color = VertexColor;
}
#version 400
in vec4 color;

void main (void)
{
gl_FragColor = color;
}

import com.jogamp.common.nio.Buffers
import com.jogamp.opengl.GL2
import com.jogamp.opengl.GLAutoDrawable
import com.jogamp.opengl.GLEventListener
import java.io.BufferedReader
import java.io.FileReader
import java.nio.IntBuffer

class Renderer4 : GLEventListener {

private var frame_width = 0
private var frame_height = 0

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)

val indices = intArrayOf(0, 1, 2, 0, 2, 3)
val indexBuffer = Buffers.newDirectIntBuffer(indices)
val ibo = IntBuffer.allocate(1)

private var programId : Int? = null

fun readShaderSource(filename : String) : String {
val br = BufferedReader(FileReader(filename))
var result = ""
var str = br.readLine()
while (str != null) {
result += str + "\n"
str = br.readLine()
}
return result
}

override fun init(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)

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)

gl.glGenBuffers(1, ibo)
gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, ibo[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)

val vertSource = readShaderSource("simple2.vert")
val fragSource = readShaderSource("simple2.frag")

programId = gl.glCreateProgram()

val vertexShader = gl.glCreateShader(GL2.GL_VERTEX_SHADER)
gl.glShaderSource(vertexShader, 1, arrayOf(vertSource), null)
gl.glCompileShader(vertexShader)
gl.glAttachShader(programId!!, vertexShader)

val fragmentShader = gl.glCreateShader(GL2.GL_FRAGMENT_SHADER)
gl.glShaderSource(fragmentShader, 1, arrayOf(fragSource), null)
gl.glCompileShader(fragmentShader)
gl.glAttachShader(programId!!, fragmentShader)

gl.glLinkProgram(programId!!)
}
}

override fun reshape(drawable: GLAutoDrawable?, x: Int, y: Int, width: Int, height: Int) {
frame_width = width
frame_height = height
}

override fun display(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2

gl.glViewport(0, 0, frame_width, frame_height)
gl.glClear(GL2.GL_COLOR_BUFFER_BIT or GL2.GL_DEPTH_BUFFER_BIT)

gl.glUseProgram(programId!!)

val positionId = gl.glGetAttribLocation(programId!!, "position")
gl.glEnableVertexAttribArray(positionId)

gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[0])
gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, ibo[0])
gl.glVertexAttribPointer(positionId, 3, GL2.GL_FLOAT, false, 0, 0)
gl.glDrawElements(GL2.GL_TRIANGLES, indices.size, GL2.GL_UNSIGNED_INT, 0)
gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, 0)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0)
}
}
override fun dispose(drawable: GLAutoDrawable?) {}
}

・attributeとin/out
attributeは古い。
https://siguma-sig.hatenablog.com/entry/2017/04/25/203250

・glEnableClientStateとglEnableVertexAttribArray
glEnableClientStateはgl_Vertexなどの組み込み属性配列を利用する。
glEnableVertexAttribArrayはattribute変数を利用する。
https://jpcodeqa.com/q/a2b139f4eebef00e3630c83d6eaaaec9

・attribute変数の利用方法
#version 400
in vec4 position;

void main(void)
{
gl_Position = position;
}
#version 400
out vec4 color;

void main (void)
{
color = vec4(0.0, 1.0, 0.0, 1.0);
}
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[0])
val positionId = gl.glGetAttribLocation(programId!!, "position")
gl.glEnableVertexAttribArray(positionId)
gl.glVertexAttribPointer(positionId, 3, GL2.GL_FLOAT, false, 0, 0)
gl.glDrawArrays(GL2.GL_QUADS, 0, vertices.size)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0)

class Renderer2 : GLEventListener {

private var frame_width = 0
private var frame_height = 0

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)

private var programId : Int? = null

fun readShaderSource(filename : String) : String {
val br = BufferedReader(FileReader(filename))
var result = ""
var str = br.readLine()
while (str != null) {
result += str + "\n"
str = br.readLine()
}
return result
}

override fun init(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)

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)

val vertSource = readShaderSource("simple.vert")
val fragSource = readShaderSource("simple.frag")

programId = gl.glCreateProgram()

val vertexShader = gl.glCreateShader(GL2.GL_VERTEX_SHADER)
gl.glShaderSource(vertexShader, 1, arrayOf(vertSource), null)
gl.glCompileShader(vertexShader)
gl.glAttachShader(programId!!, vertexShader)

val fragmentShader = gl.glCreateShader(GL2.GL_FRAGMENT_SHADER)
gl.glShaderSource(fragmentShader, 1, arrayOf(fragSource), null)
gl.glCompileShader(fragmentShader)
gl.glAttachShader(programId!!, fragmentShader)

gl.glLinkProgram(programId!!)
}
}

override fun reshape(drawable: GLAutoDrawable?, x: Int, y: Int, width: Int, height: Int) {
frame_width = width
frame_height = height
}

override fun display(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2

gl.glViewport(0, 0, frame_width, frame_height)
gl.glClear(GL2.GL_COLOR_BUFFER_BIT or GL2.GL_DEPTH_BUFFER_BIT)

gl.glUseProgram(programId!!)

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?) {}
}

↑このページのトップヘ