あかすくぱるふぇ

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

久しぶりにポエムを書きます。

題材は「3年間の振り返りと2023年の抱負」です。
なぜ3年間なのか。
それは、ちょうど3年前に今の会社に転職し、コロナが流行し、その中でサークルNutrientsに所属してゲーム制作をしてきたからです。

実際には転職よりも1年くらい前からNutrientsでの活動はスタートしていますが、転職とコロナ流行によるフルリモート勤務がなければ活動の継続は難しかったと思うので、この3年間というのは自分にとって特別な区切りなんです。

まず、転職について語ります。
転職する前は、情報系のエンジニアとして、カメラの画像処理やAIに関する業務に取り組んでいました。
そんな中、会社への失望やらなんやらで転職を決意するわけですが、画像処理やAIといった専門分野を軸にしつつも、趣味であるゲームやアニメの業界に移りたいと考えました。
そんなわけで今は2DCG系の会社でエンジニアをやっています。

つまり、この3年間は「仕事:2DCGエンジニア」と「趣味:ノベルゲーム制作」という二本柱で活動をしてきました。
そして、この二本柱作戦はある程度成功しました。
仕事においては、業界内では珍しい専門分野を持っていることで成果を上げることができましたし、趣味のゲーム制作においては、プログラミングを活用して効率化を図り、長編作品をコンスタントに制作することができました。
コロナ流行でフルリモート勤務となったことで、仕事とゲーム制作を両立することもできました。

はいはい、それはめでたいですね……とならないのが、ポエムたる所以。
本題に入りましょう。





仕事やゲーム制作に対してワクワクすることが、3年前と比べてだいぶ減りました。
家にこもって同じような作業を3年間淡々とやっていたわけで、当然といえば当然ではあるのですが。
どうすべきか、去年はずっと考えていたような気がします。
そして、自分の中で結論が出つつあります。

今年2023年を集大成の年としつつ、2024年からは新しい活動に軸足を移すつもりです。
具体的には、仕事では今までの成果を今年の製品に載せる計画があるので、それを着実に成し遂げます。
ゲーム制作では、サークル史上最高傑作を今年の夏にリリースします。
……まあ、傑作になるかはぶっちゃけシナリオ次第ではありますが、最高のシナリオが上がってきた暁には、そこに最高の演出を載せるつもりでいます。
(さらに言うと、新作は前後編に分けて制作するので、サークル活動は24年まで続きます)

そして、仕事・ゲーム制作と並行して、24年からの新しい活動に向けた準備を今年は行います。
具体的には、「仕事:2DCGエンジニア」と「趣味:ノベルゲーム制作」の間に三本目の柱を作り、三本柱の相乗効果によって、まだ世の中にはない全く新しい表現を生み出したいと考えています。

というのも、元々この二本柱の間にもっと相乗効果が生まれることを期待していたのですが、実際にはあまりそうならなかったという現実があります。
仕事がらみで技術を身につけてもそれがゲームの実制作に生きることはほぼ無いし、ゲーム制作の知識や経験が仕事に生きることもあまりありませんでした。

そこで三本目の柱として、3DCGやゲームエンジン(UnityやUnreal Engine)、画像生成AI、動画制作などの技術を身につけたいと考えています。
これら三本の柱から、具体的にどのような相乗効果が生まれるかは現時点ではわかりません。
しかし、そこから生まれる新しい表現が、画像処理/CGの研究開発に長年携わったり、美少女ゲームにハマり自分でも制作を続けてきた自分の人生の集大成的なものとなるだろうという期待を抱いています。

思えばこの3年間は、良くも悪くも着実に成果を上げようとした期間であり、こういった妄想を抱くことが少なすぎた気がします。
妄想してばかりで手を動かさないのも良くないですが、淡々と手を動かすばかりでは人間というよりも機械や歯車の人生となってしまいます。

今年は未来への妄想を抱きつつ手も動かす。
そんな一年にしたいと思っています。

import com.jogamp.common.nio.Buffers
import com.jogamp.opengl.*
import com.jogamp.opengl.awt.GLJPanel
import com.jogamp.opengl.glu.GLU
import java.awt.Dimension
import java.io.BufferedReader
import java.io.FileReader
import java.nio.IntBuffer
import javax.swing.JFrame

class Practice09 : GLEventListener {

private var glu : GLU? = null
private var programId : Int? = null

val vertices = floatArrayOf(
0.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f,
1.0f, 1.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 1.0f,
1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f
)

val indices = intArrayOf(
0, 1,
1, 2,
2, 3,
3, 0,
4, 5,
5, 6,
6, 7,
7, 4,
0, 4,
1, 5,
2, 6,
3, 7
)

val vertexBuffer = Buffers.newDirectFloatBuffer(vertices)
val indexBuffer = Buffers.newDirectIntBuffer(indices)

val vertexVbo = IntBuffer.allocate(1)
val indexVbo = IntBuffer.allocate(1)

private 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
}

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

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 init(drawable: GLAutoDrawable?) {
drawable?.let {

// シェーダーの初期化
initializeShader(drawable)

val gl = it.gl.gL2
gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)
glu = GLU()

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) {
drawable?.let {
val gl = it.gl.gL2

gl.glMatrixMode(GL2.GL_PROJECTION)
gl.glLoadIdentity()
glu!!.gluPerspective(30.0, width.toDouble() / height, 1.0, 100.0)
gl.glTranslatef(0.0f, 0.0f, -5.0f)

gl.glMatrixMode(GL2.GL_MODELVIEW)
gl.glLoadIdentity()
glu!!.gluLookAt(3.0f, 4.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f)
}
}

override fun display(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClear(GL2.GL_COLOR_BUFFER_BIT)
gl.glUseProgram(programId!!)

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_LINES, 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 caps = GLCapabilities(GLProfile.get(GLProfile.GL2))
val frame = JFrame().apply {
contentPane.add(GLJPanel().apply {
addGLEventListener(Practice09())
})
size = Dimension(300, 300)
isVisible = true
}
}
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
void main (void)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

import com.jogamp.common.nio.Buffers
import com.jogamp.opengl.*
import com.jogamp.opengl.awt.GLJPanel
import com.jogamp.opengl.glu.GLU
import java.awt.Dimension
import java.nio.IntBuffer
import javax.swing.JFrame

class Practice08 : GLEventListener {

private var glu : GLU? = null

val vertices = floatArrayOf(
0.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f,
1.0f, 1.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 1.0f,
1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f
)

val indices = intArrayOf(
0, 1,
1, 2,
2, 3,
3, 0,
4, 5,
5, 6,
6, 7,
7, 4,
0, 4,
1, 5,
2, 6,
3, 7
)

val vertexBuffer = Buffers.newDirectFloatBuffer(vertices)
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)
glu = GLU()

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) {
drawable?.let {
val gl = it.gl.gL2

gl.glMatrixMode(GL2.GL_PROJECTION)
gl.glLoadIdentity()
glu!!.gluPerspective(30.0, width.toDouble() / height, 1.0, 100.0)
gl.glTranslatef(0.0f, 0.0f, -5.0f)

gl.glMatrixMode(GL2.GL_MODELVIEW)
gl.glLoadIdentity()
glu!!.gluLookAt(3.0f, 4.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f)
}
}

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_LINES, 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 caps = GLCapabilities(GLProfile.get(GLProfile.GL2))
val frame = JFrame().apply {
contentPane.add(GLJPanel().apply {
addGLEventListener(Practice08())
})
size = Dimension(300, 300)
isVisible = true
}
}

↑このページのトップヘ