Created
June 26, 2020 04:26
-
-
Save andremichelle/e9394e6830e65e8d3b04f62c0b84f67d to your computer and use it in GitHub Desktop.
One file shadertoy shaders to openrndr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.openrndr.application | |
import org.openrndr.draw.* | |
import org.openrndr.internal.Driver | |
import org.openrndr.math.Vector2 | |
import org.openrndr.math.Vector3 | |
import java.io.File | |
class ShaderToy(fsCode: String) { | |
companion object { | |
fun fromFile(pathname: String): ShaderToy { | |
val file = File(pathname) | |
return ShaderToy(file.readText(Charsets.UTF_8)) | |
} | |
fun exampleCode(): ShaderToy { | |
return ShaderToy( | |
""" | |
void mainImage( out vec4 fragColor, in vec2 fragCoord ) | |
{ | |
// Normalized pixel coordinates (from 0 to 1) | |
vec2 uv = fragCoord/iResolution.xy; | |
// Time varying pixel color | |
vec3 col = 0.5 + 0.5*cos(iTime+uv.xyx+vec3(0,2,4)); | |
// Output to screen | |
fragColor = vec4(col,1.0); | |
} | |
""" | |
) | |
} | |
private val vertexBuffer: VertexBuffer = init() | |
private const val vsCode = """ | |
#version 330 | |
in vec3 a_position; | |
void main() { | |
gl_Position = vec4(a_position, 1.0); | |
} | |
""" | |
private const val pre_fsCode = """ | |
#version 330 | |
in vec4 gl_FragCoord; | |
out vec4 o_output; | |
uniform float iTime; | |
uniform vec2 iResolution; | |
""" | |
private const val after_fsCode = """ | |
void main() { | |
mainImage(o_output, gl_FragCoord.xy); | |
} | |
""" | |
private fun init(): VertexBuffer { | |
val geometry: VertexBuffer = vertexBuffer(vertexFormat { | |
position(3) | |
}, 6) | |
geometry.put { | |
write( | |
Vector3(-1.0, 1.0, 0.0), | |
Vector3(1.0, 1.0, 0.0), | |
Vector3(1.0, -1.0, 0.0), | |
Vector3(-1.0, 1.0, 0.0), | |
Vector3(1.0, -1.0, 0.0), | |
Vector3(-1.0, -1.0, 0.0) | |
) | |
} | |
return geometry | |
} | |
} | |
private val shader: Shader | |
init { | |
shader = Shader.createFromCode(vsCode, pre_fsCode + fsCode + after_fsCode, name = "shadertoy") | |
} | |
fun render(size: Vector2, time: Double) { | |
render(size, time, uniforms = { Unit }) | |
} | |
fun render(size: Vector2, time: Double, uniforms: (Shader) -> Unit) { | |
shader.begin() | |
shader.uniform("iTime", time.toFloat()) | |
shader.uniform("iResolution", size) | |
uniforms(shader) | |
Driver.instance.drawVertexBuffer( | |
shader, listOf(vertexBuffer), | |
DrawPrimitive.TRIANGLES, 0, 6 | |
) | |
shader.end() | |
} | |
} | |
fun main() { | |
application { | |
configure { | |
width = 640 | |
height = 360 | |
} | |
program { | |
val shaderToy = ShaderToy.exampleCode() | |
extend { | |
shaderToy.render(window.size * window.scale, seconds) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment