From e3f5e07b867b9d6ecf9055acd2af8d30f257e444 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Sun, 10 Mar 2024 18:39:21 +0100 Subject: [PATCH] Improve compatibility with GLES back-end --- .../src/main/kotlin/CollectScreenShots.kt | 4 +- .../extra/convention/kotlin-jvm.gradle.kts | 4 ++ .../kotlin-multiplatform.gradle.kts | 8 +++- gradlew | 17 ++++---- .../src/demo/kotlin/DemoCircleBatch02.kt | 4 +- .../src/demo/kotlin/DemoCubemap01.kt | 7 +-- .../src/demo/kotlin/DemoCubemap02.kt | 2 +- .../src/demo/kotlin/DemoCubemap03.kt | 2 +- .../src/commonMain/kotlin/phrases/Phrases.kt | 6 +-- .../src/jvmDemo/kotlin/DemoCompositor02.kt | 3 +- .../commonMain/kotlin/blend/BlendSpectral.kt | 8 ++-- .../src/commonMain/kotlin/distort/Lenses.kt | 2 +- orx-fx/src/jvmDemo/kotlin/DemoBlur01.kt | 1 - .../kotlin/DemoDitherLumaHalftone01.kt | 1 - .../src/jvmDemo/kotlin/DemoFluidDistort01.kt | 5 --- orx-fx/src/shaders/glsl/blend/add.frag | 6 +-- orx-fx/src/shaders/glsl/blend/hard-light.frag | 6 +-- orx-fx/src/shaders/glsl/blend/normal.frag | 6 +-- orx-fx/src/shaders/glsl/blend/overlay.frag | 2 +- orx-fx/src/shaders/glsl/blend/subtract.frag | 4 +- .../glsl/blur/approximate-gaussian-blur.frag | 2 +- .../shaders/glsl/blur/bloom-downscale.frag | 12 +++--- .../src/shaders/glsl/blur/bloom-upscale.frag | 40 +++++++++--------- .../src/shaders/glsl/blur/gaussian-blur.frag | 10 ++--- orx-fx/src/shaders/glsl/color/posterize.frag | 4 +- .../src/shaders/glsl/color/rgb-to-ycbcr.frag | 4 +- .../src/shaders/glsl/color/ycbcr-to-rgb.frag | 2 +- .../shaders/glsl/distort/displace-blend.frag | 2 +- .../shaders/glsl/distort/fluid-distort.frag | 8 ++-- orx-fx/src/shaders/glsl/distort/lenses.frag | 2 +- .../shaders/glsl/distort/stack-repeat.frag | 8 ++-- .../src/shaders/glsl/distort/tape-noise.frag | 18 ++++---- .../shaders/glsl/distort/video-glitch.frag | 10 ++--- orx-fx/src/shaders/glsl/dither/a-dither.frag | 18 ++++---- .../shaders/glsl/dither/cmyk-halftone.frag | 8 ++-- .../shaders/glsl/dither/luma-halftone.frag | 12 +++--- .../glsl/edges/canny-edge-detector.frag | 5 ++- orx-fx/src/shaders/glsl/edges/contour.frag | 4 +- orx-fx/src/shaders/glsl/edges/luma-sobel.frag | 4 +- .../src/shaders/glsl/patterns/checkers.frag | 2 +- .../shaders/glsl/shadow/dropshadow-blend.frag | 2 +- .../shaders/glsl/shadow/dropshadow-blur.frag | 6 +-- .../shaders/glsl/tonemap/aces-tonemap.frag | 4 +- .../glsl/tonemap/reinhard-tonemap.frag | 2 +- .../glsl/tonemap/uncharted2-tonemap.frag | 2 +- .../src/shaders/glsl/encode-subpixel.frag | 24 +++++------ .../src/shaders/glsl/pixel-direction.frag | 4 +- .../src/shaders/glsl/straight-skeleton.frag | 2 +- .../orx-dnk3/src/main/kotlin/PBRMaterial.kt | 6 +-- .../orx-dnk3/src/main/kotlin/SceneRenderer.kt | 2 +- .../src/main/kotlin/ShaderUtilities.kt | 4 +- orx-jvm/orx-dnk3/src/main/kotlin/Shadows.kt | 14 +++--- .../src/main/kotlin/gltf/GltfScene.kt | 2 +- .../shaders/screenspace-reflections.frag | 2 +- .../resources/shaders/segment-contours.frag | 6 +-- orx-jvm/orx-olive/images/DemoOlive01Kt.png | Bin 33331 -> 0 bytes .../src/demo/kotlin/DemoPoissonFill01.kt | 4 +- .../shaders/gl3/poisson/downscale.frag | 6 +-- .../shaders/gl3/poisson/fill-boundary.frag | 2 - .../shaders/gl3/poisson/fill-combine.frag | 2 - .../resources/shaders/gl3/poisson/filter.frag | 4 +- .../shaders/gl3/poisson/upscale.frag | 4 +- 62 files changed, 182 insertions(+), 195 deletions(-) delete mode 100644 orx-jvm/orx-olive/images/DemoOlive01Kt.png diff --git a/buildSrc/src/main/kotlin/CollectScreenShots.kt b/buildSrc/src/main/kotlin/CollectScreenShots.kt index 8b0a3a63..fbdb1ad1 100644 --- a/buildSrc/src/main/kotlin/CollectScreenShots.kt +++ b/buildSrc/src/main/kotlin/CollectScreenShots.kt @@ -73,7 +73,9 @@ abstract class CollectScreenshotsTask @Inject constructor() : DefaultTask() { this.jvmArgs( "-DtakeScreenshot=true", "-DscreenshotPath=${outputDir.get().asFile}/$imageName.png", - "-Dorg.openrndr.exceptions=JVM" + "-Dorg.openrndr.exceptions=JVM", + "-Dorg.openrndr.gl3.debug=true", + "-Dorg.openrndr.gl3.delete_angle_on_exit=false" ) } } diff --git a/buildSrc/src/main/kotlin/org/openrndr/extra/convention/kotlin-jvm.gradle.kts b/buildSrc/src/main/kotlin/org/openrndr/extra/convention/kotlin-jvm.gradle.kts index 22212f1c..c951d34a 100644 --- a/buildSrc/src/main/kotlin/org/openrndr/extra/convention/kotlin-jvm.gradle.kts +++ b/buildSrc/src/main/kotlin/org/openrndr/extra/convention/kotlin-jvm.gradle.kts @@ -49,6 +49,10 @@ dependencies { "demoImplementation"(main.output.classesDirs + main.runtimeClasspath) "demoImplementation"(libs.openrndr.application) "demoImplementation"(libs.openrndr.extensions) + + if (DefaultNativePlatform.getCurrentOperatingSystem().isMacOsX) { + "demoRuntimeOnly"(libs.openrndr.gl3.natives.macos.arm64) + } "demoRuntimeOnly"(libs.openrndr.gl3.core) "demoRuntimeOnly"(libs.slf4j.simple) } diff --git a/buildSrc/src/main/kotlin/org/openrndr/extra/convention/kotlin-multiplatform.gradle.kts b/buildSrc/src/main/kotlin/org/openrndr/extra/convention/kotlin-multiplatform.gradle.kts index a676ddce..8076a777 100644 --- a/buildSrc/src/main/kotlin/org/openrndr/extra/convention/kotlin-multiplatform.gradle.kts +++ b/buildSrc/src/main/kotlin/org/openrndr/extra/convention/kotlin-multiplatform.gradle.kts @@ -1,11 +1,10 @@ package org.openrndr.extra.convention import CollectScreenshotsTask -import gradle.kotlin.dsl.accessors._a37e1a3c5785f18372ed85a4dc9bbdf6.testRuntimeOnly import org.gradle.accessors.dm.LibrariesForLibs import org.gradle.api.tasks.testing.logging.TestExceptionFormat +import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import java.net.URI val libs = the() @@ -49,6 +48,11 @@ kotlin { outputDir.set(project.file(project.projectDir.toString() + "/images")) dependsOn(compileTaskProvider) } + dependencies { + if (DefaultNativePlatform.getCurrentOperatingSystem().isMacOsX) { + runtimeOnly(libs.openrndr.gl3.natives.macos.arm64) + } + } } } testRuns["test"].executionTask { diff --git a/gradlew b/gradlew index fcb6fca1..1aa94a42 100755 --- a/gradlew +++ b/gradlew @@ -83,7 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -201,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/openrndr-demos/src/demo/kotlin/DemoCircleBatch02.kt b/openrndr-demos/src/demo/kotlin/DemoCircleBatch02.kt index b07a947e..16771dc2 100644 --- a/openrndr-demos/src/demo/kotlin/DemoCircleBatch02.kt +++ b/openrndr-demos/src/demo/kotlin/DemoCircleBatch02.kt @@ -29,8 +29,8 @@ fun main() = application { // sets angle and radius based on time and shape ID. drawer.shadeStyle = shadeStyle { vertexTransform = """ - float a = c_instance + p_time * 0.1; - float r = 200 + 100 * sin(a * 0.998); + float a = float(c_instance) + p_time * 0.1; + float r = 200.0 + 100.0 * sin(a * 0.998); x_position.x += r * sin(a); x_position.y += r * cos(a); """.trimIndent() diff --git a/openrndr-demos/src/demo/kotlin/DemoCubemap01.kt b/openrndr-demos/src/demo/kotlin/DemoCubemap01.kt index cf72e7f0..fd052c05 100644 --- a/openrndr-demos/src/demo/kotlin/DemoCubemap01.kt +++ b/openrndr-demos/src/demo/kotlin/DemoCubemap01.kt @@ -1,15 +1,12 @@ import org.openrndr.application -import org.openrndr.draw.Cubemap -import org.openrndr.draw.DrawPrimitive -import org.openrndr.draw.Session -import org.openrndr.draw.shadeStyle +import org.openrndr.draw.* import org.openrndr.extra.camera.Orbital import org.openrndr.extra.meshgenerators.boxMesh fun main() = application { program { - val cubemap = Cubemap.fromUrl("file:demo-data/cubemaps/garage_iem.dds", null, session = Session.active) + val cubemap = loadCubemap("demo-data/cubemaps/garage_iem.dds", null, session = Session.active) val cube = boxMesh() extend(Orbital()) { diff --git a/openrndr-demos/src/demo/kotlin/DemoCubemap02.kt b/openrndr-demos/src/demo/kotlin/DemoCubemap02.kt index d9139400..f3cb0972 100644 --- a/openrndr-demos/src/demo/kotlin/DemoCubemap02.kt +++ b/openrndr-demos/src/demo/kotlin/DemoCubemap02.kt @@ -5,7 +5,7 @@ import org.openrndr.extra.meshgenerators.boxMesh fun main() = application { program { - val cubemap1 = Cubemap.fromUrl("file:demo-data/cubemaps/garage_iem.dds", null, session = Session.active) + val cubemap1 = loadCubemap("demo-data/cubemaps/garage_iem.dds", null, session = Session.active) val cube = boxMesh() val cubemap2 = cubemap(cubemap1.width, format = cubemap1.format, type = cubemap1.type, levels = 2, session = Session.active) cubemap1.copyTo(cubemap2, 0, 0) diff --git a/openrndr-demos/src/demo/kotlin/DemoCubemap03.kt b/openrndr-demos/src/demo/kotlin/DemoCubemap03.kt index 369d4897..8b0027c5 100644 --- a/openrndr-demos/src/demo/kotlin/DemoCubemap03.kt +++ b/openrndr-demos/src/demo/kotlin/DemoCubemap03.kt @@ -5,7 +5,7 @@ import org.openrndr.extra.meshgenerators.boxMesh fun main() = application { program { - val cubemap1 = Cubemap.fromUrl("file:demo-data/cubemaps/garage_iem.dds", null, session = Session.active) + val cubemap1 = loadCubemap("demo-data/cubemaps/garage_iem.dds", null, session = Session.active) val cube = boxMesh() val cubemap2 = cubemap(cubemap1.width, format = cubemap1.format, type = cubemap1.type, levels = 2, session = Session.active) cubemap1.copyTo(cubemap2, 0, 0) diff --git a/orx-color/src/commonMain/kotlin/phrases/Phrases.kt b/orx-color/src/commonMain/kotlin/phrases/Phrases.kt index 0a0d3354..c8a94d67 100644 --- a/orx-color/src/commonMain/kotlin/phrases/Phrases.kt +++ b/orx-color/src/commonMain/kotlin/phrases/Phrases.kt @@ -61,9 +61,9 @@ object ColorPhraseBook : ShaderPhraseBook("color") { |vec4 linear_rgb_to_srgb(vec4 c) { | const float t = 0.00313066844250063; | return vec4( - | c.r <= t ? c.r * 12.92 : 1.055 * pow(c.r, 1 / 2.4) - 0.055, - | c.g <= t ? c.g * 12.92 : 1.055 * pow(c.g, 1 / 2.4) - 0.055, - | c.b <= t ? c.b * 12.92 : 1.055 * pow(c.b, 1 / 2.4) - 0.055, + | c.r <= t ? c.r * 12.92 : 1.055 * pow(c.r, 1.0 / 2.4) - 0.055, + | c.g <= t ? c.g * 12.92 : 1.055 * pow(c.g, 1.0 / 2.4) - 0.055, + | c.b <= t ? c.b * 12.92 : 1.055 * pow(c.b, 1.0 / 2.4) - 0.055, | c.a); |}""".trimMargin()) diff --git a/orx-compositor/src/jvmDemo/kotlin/DemoCompositor02.kt b/orx-compositor/src/jvmDemo/kotlin/DemoCompositor02.kt index ec152ceb..997995bf 100644 --- a/orx-compositor/src/jvmDemo/kotlin/DemoCompositor02.kt +++ b/orx-compositor/src/jvmDemo/kotlin/DemoCompositor02.kt @@ -14,6 +14,7 @@ import org.openrndr.shape.Rectangle * Try changing which layer has multisampling applied and observe the results. */ fun main() = application { + System.setProperty("org.openrndr.gl3.debug", "true") configure { width = 800 height = 800 @@ -21,7 +22,7 @@ fun main() = application { program { val layers = compose { - layer(multisample = BufferMultisample.SampleCount(16)) { + layer(multisample = BufferMultisample.SampleCount(4)) { draw { drawer.translate(drawer.bounds.center) drawer.rotate(seconds) diff --git a/orx-fx/src/commonMain/kotlin/blend/BlendSpectral.kt b/orx-fx/src/commonMain/kotlin/blend/BlendSpectral.kt index b66fb0aa..f89b39d1 100644 --- a/orx-fx/src/commonMain/kotlin/blend/BlendSpectral.kt +++ b/orx-fx/src/commonMain/kotlin/blend/BlendSpectral.kt @@ -33,9 +33,9 @@ vec3 srgb_to_linear(vec3 c) { vec3 linear_to_srgb(vec3 c) { const float t = 0.00313066844250063; return vec3( - c.r <= t ? c.r * 12.92 : 1.055 * pow(c.r, 1 / 2.4) - 0.055, - c.g <= t ? c.g * 12.92 : 1.055 * pow(c.g, 1 / 2.4) - 0.055, - c.b <= t ? c.b * 12.92 : 1.055 * pow(c.b, 1 / 2.4) - 0.055 + c.r <= t ? c.r * 12.92 : 1.055 * pow(c.r, 1.0 / 2.4) - 0.055, + c.g <= t ? c.g * 12.92 : 1.055 * pow(c.g, 1.0 / 2.4) - 0.055, + c.b <= t ? c.b * 12.92 : 1.055 * pow(c.b, 1.0 / 2.4) - 0.055 ); } @@ -86,7 +86,7 @@ void main() { */ @Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED") @Description("Blend spectral") -class BlendSpectral : Filter2to1(filterShaderFromCode(spectralBlendShader, "color-burn")) { +class BlendSpectral : Filter2to1(filterShaderFromCode(spectralBlendShader, "blend-spectral")) { @BooleanParameter("source clip") var clip: Boolean by parameters diff --git a/orx-fx/src/commonMain/kotlin/distort/Lenses.kt b/orx-fx/src/commonMain/kotlin/distort/Lenses.kt index 69605af8..68be3d86 100644 --- a/orx-fx/src/commonMain/kotlin/distort/Lenses.kt +++ b/orx-fx/src/commonMain/kotlin/distort/Lenses.kt @@ -12,7 +12,7 @@ import org.openrndr.extra.parameters.IntParameter import org.openrndr.shape.Rectangle @Description("Lenses") -class Lenses : Filter1to1(mppFilterShader(fx_lenses, "block-repeat")) { +class Lenses : Filter1to1(mppFilterShader(fx_lenses, "lenses")) { @IntParameter("rows", 1, 64, order = 0) var rows: Int by parameters diff --git a/orx-fx/src/jvmDemo/kotlin/DemoBlur01.kt b/orx-fx/src/jvmDemo/kotlin/DemoBlur01.kt index 50866c77..12967a92 100644 --- a/orx-fx/src/jvmDemo/kotlin/DemoBlur01.kt +++ b/orx-fx/src/jvmDemo/kotlin/DemoBlur01.kt @@ -1,7 +1,6 @@ import org.openrndr.application import org.openrndr.color.ColorRGBa import org.openrndr.draw.* -import org.openrndr.extensions.SingleScreenshot import org.openrndr.extra.fx.blur.* import org.openrndr.math.Polar import kotlin.math.sin diff --git a/orx-fx/src/jvmDemo/kotlin/DemoDitherLumaHalftone01.kt b/orx-fx/src/jvmDemo/kotlin/DemoDitherLumaHalftone01.kt index 9d488ff1..8f74f339 100644 --- a/orx-fx/src/jvmDemo/kotlin/DemoDitherLumaHalftone01.kt +++ b/orx-fx/src/jvmDemo/kotlin/DemoDitherLumaHalftone01.kt @@ -2,7 +2,6 @@ import org.openrndr.application import org.openrndr.draw.createEquivalent import org.openrndr.draw.loadImage import org.openrndr.extra.fx.dither.LumaHalftone -import org.openrndr.math.mod_ fun main() { application { diff --git a/orx-fx/src/jvmDemo/kotlin/DemoFluidDistort01.kt b/orx-fx/src/jvmDemo/kotlin/DemoFluidDistort01.kt index 7a990c4e..b6992d13 100644 --- a/orx-fx/src/jvmDemo/kotlin/DemoFluidDistort01.kt +++ b/orx-fx/src/jvmDemo/kotlin/DemoFluidDistort01.kt @@ -16,11 +16,6 @@ fun main() { checkers.size = 64.0 checkers.apply(emptyArray(), image) - if (System.getProperty("takeScreenshot") == "true") { - extend(SingleScreenshot()) { - this.outputFile = System.getProperty("screenshotPath") - } - } extend { fd.blend = mouse.position.x/width fd.apply(image, distorted) diff --git a/orx-fx/src/shaders/glsl/blend/add.frag b/orx-fx/src/shaders/glsl/blend/add.frag index c2a5f43d..f557b46e 100644 --- a/orx-fx/src/shaders/glsl/blend/add.frag +++ b/orx-fx/src/shaders/glsl/blend/add.frag @@ -21,14 +21,14 @@ void main() { vec4 b = texture2D(tex1, v_texCoord0); #endif - vec3 na = a.a > 0 ? a.rgb/a.a : vec3(0.0); - vec3 nb = b.a > 0 ? b.rgb/b.a : vec3(0.0); + vec3 na = a.a > 0.0 ? a.rgb/a.a : vec3(0.0); + vec3 nb = b.a > 0.0 ? b.rgb/b.a : vec3(0.0); vec3 addColor = b.rgb; vec4 result; if (clip) { - result = vec4((na + addColor), 1) * a.a; + result = vec4((na + addColor), 1.0) * a.a; } else { result = (1.0-a.a) * b + a.a * b.a * vec4(min(na + nb, vec3(1.0)), 1.0) + (1.0-b.a) * a; } diff --git a/orx-fx/src/shaders/glsl/blend/hard-light.frag b/orx-fx/src/shaders/glsl/blend/hard-light.frag index a45a82c7..ca8cb2bc 100644 --- a/orx-fx/src/shaders/glsl/blend/hard-light.frag +++ b/orx-fx/src/shaders/glsl/blend/hard-light.frag @@ -25,9 +25,9 @@ void main() { vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a; vec3 m = vec3( - nb.r <= 0.5? 2*na.r * nb.r : 1.0 - 2.0*(1.0 - na.r)*(1.0 - nb.r), - nb.g <= 0.5? 2*na.g * nb.g : 1.0 - 2.0*(1.0 - na.g)*(1.0 - nb.g), - nb.b <= 0.5? 2*na.b * nb.b : 1.0 - 2.0*(1.0 - na.b)*(1.0 - nb.b) + nb.r <= 0.5? 2.0*na.r * nb.r : 1.0 - 2.0*(1.0 - na.r)*(1.0 - nb.r), + nb.g <= 0.5? 2.0*na.g * nb.g : 1.0 - 2.0*(1.0 - na.g)*(1.0 - nb.g), + nb.b <= 0.5? 2.0*na.b * nb.b : 1.0 - 2.0*(1.0 - na.b)*(1.0 - nb.b) ); vec4 result; diff --git a/orx-fx/src/shaders/glsl/blend/normal.frag b/orx-fx/src/shaders/glsl/blend/normal.frag index 199d2ff5..6ea8e99c 100644 --- a/orx-fx/src/shaders/glsl/blend/normal.frag +++ b/orx-fx/src/shaders/glsl/blend/normal.frag @@ -21,14 +21,14 @@ void main() { vec4 b = texture2D(tex1, v_texCoord0); #endif - float alpha = min(1,max(0, b.a)); + float alpha = min(1.0, max(0.0, b.a)); vec4 result; if (!clip) { - result = a * (1.0-alpha) + b; + result = a * (1.0 - alpha) + b; result.a = clamp(o_color.a, 0.0, 1.0); } else { - result = a * (1.0-alpha) + b * a.a; + result = a * (1.0 - alpha) + b * a.a; } #ifdef OR_GL_FRAGCOLOR diff --git a/orx-fx/src/shaders/glsl/blend/overlay.frag b/orx-fx/src/shaders/glsl/blend/overlay.frag index ece28e0e..11b14196 100644 --- a/orx-fx/src/shaders/glsl/blend/overlay.frag +++ b/orx-fx/src/shaders/glsl/blend/overlay.frag @@ -13,7 +13,7 @@ out vec4 o_color; #endif vec3 demul(vec4 c) { - if (c.a == 0) { + if (c.a == 0.0) { return vec3(0.0); } else { return c.rgb / c.a; diff --git a/orx-fx/src/shaders/glsl/blend/subtract.frag b/orx-fx/src/shaders/glsl/blend/subtract.frag index e5cce4dc..d4f2189a 100644 --- a/orx-fx/src/shaders/glsl/blend/subtract.frag +++ b/orx-fx/src/shaders/glsl/blend/subtract.frag @@ -21,8 +21,8 @@ void main() { vec4 b = texture2D(tex1, v_texCoord0); #endif - vec3 na = a.a > 0 ? a.rgb/a.a : vec3(0.0); - vec3 nb = b.a > 0 ? b.rgb/b.a : vec3(0.0); + vec3 na = a.a > 0.0 ? a.rgb/a.a : vec3(0.0); + vec3 nb = b.a > 0.0 ? b.rgb/b.a : vec3(0.0); vec3 subColor = b.rgb; vec4 result; if (clip) { diff --git a/orx-fx/src/shaders/glsl/blur/approximate-gaussian-blur.frag b/orx-fx/src/shaders/glsl/blur/approximate-gaussian-blur.frag index f1f9999f..ae304d9f 100644 --- a/orx-fx/src/shaders/glsl/blur/approximate-gaussian-blur.frag +++ b/orx-fx/src/shaders/glsl/blur/approximate-gaussian-blur.frag @@ -20,7 +20,7 @@ void main() { float lw = exp( float(-(x*x)) / (2.0 * sigma * sigma) ) ; vec2 tc = v_texCoord0 + float(x) * blurDirection * s;// * spread; #ifndef OR_WEBGL2 - sum += textureLod(tex0, tc, sourceLevel) * lw; + sum += textureLod(tex0, tc, float(sourceLevel)) * lw; #else sum += texture(tex0, tc); #endif diff --git a/orx-fx/src/shaders/glsl/blur/bloom-downscale.frag b/orx-fx/src/shaders/glsl/blur/bloom-downscale.frag index a4d3583f..68218097 100644 --- a/orx-fx/src/shaders/glsl/blur/bloom-downscale.frag +++ b/orx-fx/src/shaders/glsl/blur/bloom-downscale.frag @@ -8,12 +8,12 @@ void main() { float centerWeight = 0.16210282163712664; vec2 diagonalOffsets = vec2(0.3842896354828526, 1.2048616327242379); - vec4 offsets = vec4(-diagonalOffsets.xy, +diagonalOffsets.xy) / textureSize(tex0, 0).xyxy; + vec4 offsets = vec4(-diagonalOffsets.xy, +diagonalOffsets.xy) / vec2(textureSize(tex0, 0)).xyxy; float diagonalWeight = 0.2085034734347498; - o_output = textureLod(tex0, v_texCoord0, 0) * centerWeight + - textureLod(tex0, v_texCoord0 + offsets.xy, 0) * diagonalWeight + - textureLod(tex0, v_texCoord0 + offsets.wx, 0) * diagonalWeight + - textureLod(tex0, v_texCoord0 + offsets.zw, 0) * diagonalWeight + - textureLod(tex0, v_texCoord0 + offsets.yz, 0) * diagonalWeight; + o_output = textureLod(tex0, v_texCoord0, 0.0) * centerWeight + + textureLod(tex0, v_texCoord0 + offsets.xy, 0.0) * diagonalWeight + + textureLod(tex0, v_texCoord0 + offsets.wx, 0.0) * diagonalWeight + + textureLod(tex0, v_texCoord0 + offsets.zw, 0.0) * diagonalWeight + + textureLod(tex0, v_texCoord0 + offsets.yz, 0.0) * diagonalWeight; } \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/blur/bloom-upscale.frag b/orx-fx/src/shaders/glsl/blur/bloom-upscale.frag index 09daaca0..573d10d9 100644 --- a/orx-fx/src/shaders/glsl/blur/bloom-upscale.frag +++ b/orx-fx/src/shaders/glsl/blur/bloom-upscale.frag @@ -20,55 +20,55 @@ uniform sampler2D tex4; uniform sampler2D tex5; vec4 sampleBloom(vec2 pos, float shape) { - vec4 sum = vec4(0); - float total = 0; + vec4 sum = vec4(0.0); + float total = 0.0; { float weight = pow(0.0, shape); - vec2 rnd = vec2(nrand(3 + 0.0 + pos.xy + noiseSeed), - nrand(5 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 2 - 1) / textureSize(tex0, 0); + vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), + nrand(5.0 + 0.0 + pos.yx - noiseSeed)); + rnd = (rnd * 2.0 - 1.0) / vec2(textureSize(tex0, 0)); sum += textureLod(tex0, pos + rnd * noiseGain, 0.0) * weight; total += weight; } { float weight = pow(1.0, shape); - vec2 rnd = vec2(nrand(3 + 0.0 + pos.xy + noiseSeed), - nrand(5 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 2 - 1) / textureSize(tex1, 0); + vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), + nrand(5.0 + 0.0 + pos.yx - noiseSeed)); + rnd = (rnd * 2.0 - 1.0) / vec2(textureSize(tex0, 0)); sum += textureLod(tex1, pos + rnd * noiseGain, 0.0) * weight; total += weight; } { float weight = pow(2.0, shape); - vec2 rnd = vec2(nrand(3 + 0.0 + pos.xy + noiseSeed), - nrand(5 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 2 - 1) / textureSize(tex2, 0); + vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), + nrand(5.0 + 0.0 + pos.yx - noiseSeed)); + rnd = (rnd * 2.0 - 1.0) / vec2(textureSize(tex0, 0)); sum += textureLod(tex2, pos + rnd * noiseGain, 0.0) * weight; total += weight; } { float weight = pow(3.0, shape); - vec2 rnd = vec2(nrand(3 + 0.0 + pos.xy + noiseSeed), - nrand(5 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 3 - 1) / textureSize(tex3, 0); + vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), + nrand(5.0 + 0.0 + pos.yx - noiseSeed)); + rnd = (rnd * 3.0 - 1.0) / vec2(textureSize(tex0, 0)); sum += textureLod(tex3, pos + rnd * noiseGain, 0.0) * weight; total += weight; } { float weight = pow(4.0, shape); - vec2 rnd = vec2(nrand(3 + 0.0 + pos.xy + noiseSeed), - nrand(5 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 3 - 1) / textureSize(tex3, 0); + vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), + nrand(5.0 + 0.0 + pos.yx - noiseSeed)); + rnd = (rnd * 3.0 - 1.0) / vec2(textureSize(tex0, 0)); sum += textureLod(tex4, pos + rnd * noiseGain, 0.0) * weight; total += weight; } { float weight = pow(5.0, shape); - vec2 rnd = vec2(nrand(3 + 0.0 + pos.xy + noiseSeed), - nrand(5 + 0.0 + pos.yx - noiseSeed)); - rnd = (rnd * 3 - 1) / textureSize(tex3, 0); + vec2 rnd = vec2(nrand(3.0 + 0.0 + pos.xy + noiseSeed), + nrand(5.0 + 0.0 + pos.yx - noiseSeed)); + rnd = (rnd * 3.0 - 1.0) / vec2(textureSize(tex0, 0)); sum += textureLod(tex5, pos + rnd * noiseGain, 0.0) * weight; total += weight; } diff --git a/orx-fx/src/shaders/glsl/blur/gaussian-blur.frag b/orx-fx/src/shaders/glsl/blur/gaussian-blur.frag index f769d71f..8ff16558 100644 --- a/orx-fx/src/shaders/glsl/blur/gaussian-blur.frag +++ b/orx-fx/src/shaders/glsl/blur/gaussian-blur.frag @@ -10,17 +10,17 @@ uniform float gain; out vec4 o_color; void main() { - vec2 s = textureSize(tex0, 0).xy; + vec2 s = vec2(textureSize(tex0, 0).xy); s = vec2(1.0/s.x, 1.0/s.y); int w = window; - vec4 sum = vec4(0,0,0,0); - float weight = 0; + vec4 sum = vec4(0.0, 0.0, 0.0, 0.0); + float weight = 0.0; for (int y = -w; y<= w; ++y) { for (int x = -w; x<= w; ++x) { - float lw = exp(-(x*x+y*y) / (2 * sigma * sigma)); - sum+=texture(tex0, v_texCoord0 + vec2(x,y) * s * spread) * lw; + float lw = exp(-float(x*x+y*y) / (2.0 * sigma * sigma)); + sum+=texture(tex0, v_texCoord0 + vec2(x, y) * s * spread) * lw; weight+=lw; } } diff --git a/orx-fx/src/shaders/glsl/color/posterize.frag b/orx-fx/src/shaders/glsl/color/posterize.frag index 92a3ae69..40f1ba58 100644 --- a/orx-fx/src/shaders/glsl/color/posterize.frag +++ b/orx-fx/src/shaders/glsl/color/posterize.frag @@ -5,7 +5,7 @@ uniform int levels; out vec4 o_output; void main() { vec4 c = texture(tex0, v_texCoord0); - vec2 step = 1.0 / textureSize(tex0, 0); + vec2 step = 1.0 / vec2(textureSize(tex0, 0)); float w = 0.0; vec3 s = vec3(0.0); for (int v = -window; v <= window; ++v) { @@ -14,7 +14,7 @@ void main() { if (c.a != 0.0) { c.rgb /= c.a; } - vec3 q = min(floor(c.rgb * float(levels))/float(levels-1.0), vec3(1.0)); + vec3 q = min(floor(c.rgb * float(levels))/float(levels-1), vec3(1.0)); s += q; w += 1.0; } diff --git a/orx-fx/src/shaders/glsl/color/rgb-to-ycbcr.frag b/orx-fx/src/shaders/glsl/color/rgb-to-ycbcr.frag index c3a66eae..546fe9bf 100644 --- a/orx-fx/src/shaders/glsl/color/rgb-to-ycbcr.frag +++ b/orx-fx/src/shaders/glsl/color/rgb-to-ycbcr.frag @@ -10,7 +10,7 @@ void main() { } c.rgb *= 255.0; float y = 0.0 + 0.299 * c.r + 0.587 * c.g + 0.114 * c.b; - float cb = 128 - (0.168736 * c.r) - (0.331264 * c.g) + (0.5 * c.b); - float cr = 128 + (0.5 * c.r) - 0.418688 * c.g - 0.081312 * c.b; + float cb = 128.0 - (0.168736 * c.r) - (0.331264 * c.g) + (0.5 * c.b); + float cr = 128.0 + (0.5 * c.r) - 0.418688 * c.g - 0.081312 * c.b; o_color = vec4(y/255.0, cb/255.0, cr/255.0, 1.0) * c.a; } \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/color/ycbcr-to-rgb.frag b/orx-fx/src/shaders/glsl/color/ycbcr-to-rgb.frag index acf90020..28cabf82 100644 --- a/orx-fx/src/shaders/glsl/color/ycbcr-to-rgb.frag +++ b/orx-fx/src/shaders/glsl/color/ycbcr-to-rgb.frag @@ -4,7 +4,7 @@ uniform sampler2D tex0; out vec4 o_color; void main() { - vec2 ts = textureSize(tex0, 0); + vec2 ts = vec2(textureSize(tex0, 0)); vec4 c = texture(tex0, v_texCoord0); if (c.a != 0.0) { diff --git a/orx-fx/src/shaders/glsl/distort/displace-blend.frag b/orx-fx/src/shaders/glsl/distort/displace-blend.frag index 9b56b4d4..2990a9be 100644 --- a/orx-fx/src/shaders/glsl/distort/displace-blend.frag +++ b/orx-fx/src/shaders/glsl/distort/displace-blend.frag @@ -22,7 +22,7 @@ void main() { float ar = targetSize.y / targetSize.x; - vec4 nb = b.a > 0? b/b.a : vec4(0.0); + vec4 nb = b.a > 0.0? b/b.a : vec4(0.0); vec2 offset = (nb.rg - vec2(offset))*vec2(gain) * nb.a; offset = rm * offset * vec2(1.0, ar); diff --git a/orx-fx/src/shaders/glsl/distort/fluid-distort.frag b/orx-fx/src/shaders/glsl/distort/fluid-distort.frag index ac3cca01..da87c220 100644 --- a/orx-fx/src/shaders/glsl/distort/fluid-distort.frag +++ b/orx-fx/src/shaders/glsl/distort/fluid-distort.frag @@ -34,11 +34,11 @@ uniform float blend; out vec4 o_color; float getRot(vec2 pos, vec2 b) { - vec2 Res = textureSize(tex0, 0); + vec2 Res = vec2(textureSize(tex0, 0)); vec2 p = b; float rot = 0.0; for (int i = 0; i < RotNum; i++) { - rot += dot(texture(tex0, fract((pos + p) / Res.xy)).xy -vec2(0.5), p.yx * vec2(1, -1)); + rot += dot(texture(tex0, fract((pos + p) / Res.xy)).xy -vec2(0.5), p.yx * vec2(1.0, -1.0)); p = m * p; } return rot / float(RotNum)/dot(b, b); @@ -46,10 +46,10 @@ float getRot(vec2 pos, vec2 b) { void main() { vec2 pos = v_texCoord0 * targetSize; - vec2 Res = textureSize(tex0, 0); + vec2 Res = vec2(textureSize(tex0, 0)); vec2 b = vec2(cos(ang * random), sin(ang * random)); - vec2 v = vec2(0); + vec2 v = vec2(0.0); float bbMax = 0.5 * Res.y; bbMax *= bbMax; for (int l = 0; l < 20; l++) { diff --git a/orx-fx/src/shaders/glsl/distort/lenses.frag b/orx-fx/src/shaders/glsl/distort/lenses.frag index a171da99..8240e9fe 100644 --- a/orx-fx/src/shaders/glsl/distort/lenses.frag +++ b/orx-fx/src/shaders/glsl/distort/lenses.frag @@ -18,7 +18,7 @@ void main() { float ca = cos(radians(rotation)); float sa = sin(radians(rotation)); - vec2 ts = textureSize(tex0, 0); + vec2 ts = vec2(textureSize(tex0, 0)); mat2 rm = mat2(1.0, 0.0, 0.0, ts.x / ts.y) * mat2(vec2(ca, sa), vec2(-sa, ca)) * mat2(1.0, 0.0, 0.0, ts.y / ts.x); vec2 ruv = (uv - blockCenter); vec2 luv; diff --git a/orx-fx/src/shaders/glsl/distort/stack-repeat.frag b/orx-fx/src/shaders/glsl/distort/stack-repeat.frag index 3a9198f1..debd0ba6 100644 --- a/orx-fx/src/shaders/glsl/distort/stack-repeat.frag +++ b/orx-fx/src/shaders/glsl/distort/stack-repeat.frag @@ -11,11 +11,11 @@ uniform float rotation; out vec4 o_color; void main() { vec2 origin = vec2((xOrigin+1.0)/2.0, (yOrigin+1.0)/2.0); - vec2 ts = textureSize(tex0, 0); + vec2 ts = vec2(textureSize(tex0, 0)); float r = ts.x/ts.y; vec2 offset = vec2(1.0, r) * vec2(xOffset, yOffset); vec2 uv = v_texCoord0 - vec2(origin); - float rad = (rotation/180) * 3.1415926535; + float rad = (rotation / 180.0) * 3.1415926535; vec2 cs0 = vec2(cos(rad), -sin(rad)); vec2 cs1 = vec2(sin(rad), cos(rad)); mat2 rotStep = mat2(cs0, cs1); @@ -24,7 +24,7 @@ void main() { vec4 c = texture(tex0, v_texCoord0); for (int i = 1; i <= repeats; ++i) { //vec2 s = (uv * (1.0 + zoom) * i) + vec2(0.5); - vec2 s = (rot * uv * pow(1.0 + zoom,i*1.0) )+ vec2(origin) + vec2(offset) * i; + vec2 s = (rot * uv * pow(1.0 + zoom, float(i) * 1.0))+ vec2(origin) + vec2(offset) * float(i); float f = s.x >= 0.0 && s.y > 0.0 && s.x < 1.0 && s.y < 1.0? 1.0 : 0.0; vec4 sc = texture(tex0, s) * f; @@ -34,7 +34,5 @@ void main() { } rot *= rotStep; } - - o_color = c; } diff --git a/orx-fx/src/shaders/glsl/distort/tape-noise.frag b/orx-fx/src/shaders/glsl/distort/tape-noise.frag index d9c93d0c..edc00ef8 100644 --- a/orx-fx/src/shaders/glsl/distort/tape-noise.frag +++ b/orx-fx/src/shaders/glsl/distort/tape-noise.frag @@ -35,19 +35,19 @@ void main() { o_output = vec4(0.0); for (int k = 0; k < 10; ++k ) { vec2 duv = v_texCoord0; - duv.y += smoothstep(pow(cos(time+k*dk+v_texCoord0.y*1.0),10.0)*0.1+0.1, 0.0, v_texCoord0.x)*deformAmplitude * cos((time+k*dk)*deformFrequency); - duv.y += smoothstep(pow(1.0-cos(time+k*dk+v_texCoord0.y*1.0),10.0)*0.1+0.1, 0.9, v_texCoord0.x)*deformAmplitude * cos((time+k*dk)*deformFrequency); + duv.y += smoothstep(pow(cos(time+float(k)*dk+v_texCoord0.y*1.0),10.0)*0.1+0.1, 0.0, v_texCoord0.x)*deformAmplitude * cos((time+float(k)*dk)*deformFrequency); + duv.y += smoothstep(pow(1.0-cos(time+float(k)*dk+v_texCoord0.y*1.0),10.0)*0.1+0.1, 0.9, v_texCoord0.x)*deformAmplitude * cos((time+float(k)*dk)*deformFrequency); duv.y += sin(v_texCoord0.x*3.1415926535)*0.0; - float bc = floor(hash22(vec2(time+k*dk, (time+k*dk)*0.1)).x*20.0); + float bc = floor(hash22(vec2(time+float(k)*dk, (time+float(k)*dk)*0.1)).x*20.0); float gb3 = floor(duv.y*bc)/bc; - vec2 v = hash22(duv.xy*0.003+time+k*dk); - vec2 v2 = hash22(duv.xy*0.03+time+k*dk); - vec2 v2b = hash22(duv.yx*0.03+time+k*dk); - float stretch = (cos(time+k*dk)*0.001+0.002)*0.3+0.001; - vec2 h = hash22(duv.yy*stretch+time+k*dk); - float gap = smoothstep(gapLow, gapHigh, cos(gb3*(gapFrequency+duv.y*gapFrequency + (time+k*dk)*gapFrequency) +duv.x*gapFrequency)) * (cos(gb3)*0.5+0.5); + vec2 v = hash22(duv.xy*0.003+time+float(k)*dk); + vec2 v2 = hash22(duv.xy*0.03+time+float(k)*dk); + vec2 v2b = hash22(duv.yx*0.03+time+float(k)*dk); + float stretch = (cos(time+float(k)*dk)*0.001+0.002)*0.3+0.001; + vec2 h = hash22(duv.yy*stretch+time+float(k)*dk); + float gap = smoothstep(gapLow, gapHigh, cos(gb3*(gapFrequency+duv.y*gapFrequency + (time+float(k)*dk)*gapFrequency) +duv.x*gapFrequency)) * (cos(gb3)*0.5+0.5); float r = smoothstep(noiseLow, noiseHigh, h.x*gap*v2.x)*1.0; float g = smoothstep(noiseLow, noiseHigh, h.x*gap*v2.y)*1.0; diff --git a/orx-fx/src/shaders/glsl/distort/video-glitch.frag b/orx-fx/src/shaders/glsl/distort/video-glitch.frag index a1cfda36..1955c24d 100644 --- a/orx-fx/src/shaders/glsl/distort/video-glitch.frag +++ b/orx-fx/src/shaders/glsl/distort/video-glitch.frag @@ -30,8 +30,8 @@ vec4 getVideo(vec2 uv, float amplitude, float seconds) { float iTime = seconds; vec2 look = mod(uv, vec2(1.0)); float window = 1.0/(1.0 + 20.0*(look.y-mod(iTime*vfreq, 1.0))*(look.y-mod(iTime*vfreq, 1.))); - look.x = look.x + sin(look.y*pfreq + poffset * 3.1415)/50 *(1.+cos(iTime*hfreq))*window*amplitude; - look.y = mod(look.y, 1.); + look.x = look.x + sin(look.y*pfreq + poffset * 3.1415)/50.0 *(1.0+cos(iTime*hfreq))*window*amplitude; + look.y = mod(look.y, 1.0); vec4 video = texture(tex0, look); return video; @@ -48,11 +48,11 @@ void main() { float ds = scrollOffset1 - scrollOffset0; if (aa > 0.0 || ds > 0.0) { for (int i = 1; i < 16; ++i) { - vec4 lc = getVideo(v_texCoord0 + vec2(0.0, scrollOffset0+ds*i), aa, time-i/(16*60.0)); + vec4 lc = getVideo(v_texCoord0 + vec2(0.0, scrollOffset0+ds*float(i)), aa, time-float(i)/(16.0*60.0)); if (!linearInput) { lc.rgb = pow(lc.rgb, vec3(2.2)); } - c += lc * (3.0/16.0) * aberrationColor(i/16.0); + c += lc * (3.0/16.0) * aberrationColor(float(i)/16.0); } o_output = c; } else { @@ -63,6 +63,6 @@ void main() { o_output = lc; } if (!linearOutput) { - o_output.rgb = pow(o_output.rgb, vec3(1/2.2)); + o_output.rgb = pow(o_output.rgb, vec3(1.0/2.2)); } } diff --git a/orx-fx/src/shaders/glsl/dither/a-dither.frag b/orx-fx/src/shaders/glsl/dither/a-dither.frag index e92f2972..8789895e 100644 --- a/orx-fx/src/shaders/glsl/dither/a-dither.frag +++ b/orx-fx/src/shaders/glsl/dither/a-dither.frag @@ -7,22 +7,22 @@ uniform int pattern; uniform int levels; float mask1(int levels, float l, int x, int y, int c) { - float mask = ((x ^ y * 149) * 1234& 511)/511.0; - return floor(levels * l + mask)/levels; + float mask = float((x ^ y * 149) * 1234& 511)/511.0; + return floor(float(levels) * l + mask)/float(levels); } float mask2(int levels, float l, int x, int y, int c) { - float mask = (((x+c*17) ^ y * 149) * 1234 & 511)/511.0; - return floor(levels * l + mask)/levels; + float mask = float(((x+c*17) ^ y * 149) * 1234 & 511)/511.0; + return floor(float(levels) * l + mask)/float(levels); } float mask3(int levels, float l, int x, int y, int c) { - float mask = ((x + y * 237) * 119 & 255)/255.0; - return floor(levels * l + mask)/levels; + float mask = float((x + y * 237) * 119 & 255)/255.0; + return floor(float(levels) * float(l) + mask)/float(levels); } float mask4(int levels, float l, int x, int y, int c) { - float mask = (((x+c*67) + y * 236) * 119 & 255)/255.0; - return floor(levels * l + mask)/levels; + float mask = float(((x+c*67) + y * 236) * 119 & 255)/255.0; + return floor(float(levels) * float(l) + mask)/float(levels); } out vec4 o_color; @@ -31,7 +31,7 @@ void main() { if (c.a > 0.0) { c.rgb/=c.a; } - ivec2 ic = ivec2(v_texCoord0 * textureSize(tex0, 0)); + ivec2 ic = ivec2(v_texCoord0 * vec2(textureSize(tex0, 0))); vec4 rgba = vec4(0.0); if (pattern == 0) { diff --git a/orx-fx/src/shaders/glsl/dither/cmyk-halftone.frag b/orx-fx/src/shaders/glsl/dither/cmyk-halftone.frag index 55ebf991..a5c31ea7 100644 --- a/orx-fx/src/shaders/glsl/dither/cmyk-halftone.frag +++ b/orx-fx/src/shaders/glsl/dither/cmyk-halftone.frag @@ -23,7 +23,7 @@ vec3 cmyki2rgb(in vec4 c) return c.rgb * c.a; } vec3 u(vec4 c) { - if (c.a == 0) { + if (c.a == 0.0) { return vec3(0.0); } else { return c.rgb/c.a; @@ -46,7 +46,7 @@ vec4 cmyki2rgba(in vec4 cmyk){ vec2 px2uv(in vec2 px) { - return vec2(px / textureSize(tex0, 0)); + return vec2(px / vec2(textureSize(tex0, 0))); } vec2 grid(in vec2 px) @@ -63,7 +63,7 @@ vec4 halftone(in vec2 fc,in mat2 m) { vec2 smp = (grid(m*fc) + 0.5*scale) * m; float s = min(length(fc-smp) / (dotSize*0.5*scale), 1.0); - vec3 texc = texture(tex0, px2uv(smp+textureSize(tex0, 0)/2.0)).rgb; + vec3 texc = texture(tex0, px2uv(smp+vec2(textureSize(tex0, 0))/2.0)).rgb; vec4 c = rgb2cmyki(texc); return c+s; } @@ -79,7 +79,7 @@ mat2 rotm(in float r) } void main() { - vec2 fc = v_texCoord0 * textureSize(tex0, 0) - textureSize(tex0, 0)/2.0; + vec2 fc = v_texCoord0 * vec2(textureSize(tex0, 0)) - vec2(textureSize(tex0, 0))/2.0; mat2 mc = rotm(rotation + radians(15.0)); mat2 mm = rotm(rotation + radians(75.0)); diff --git a/orx-fx/src/shaders/glsl/dither/luma-halftone.frag b/orx-fx/src/shaders/glsl/dither/luma-halftone.frag index 23da91f7..ba835e74 100644 --- a/orx-fx/src/shaders/glsl/dither/luma-halftone.frag +++ b/orx-fx/src/shaders/glsl/dither/luma-halftone.frag @@ -16,7 +16,7 @@ float cosine_sample(vec2 uv){ float ca = cos(radians(rotation)); float sa = sin(radians(rotation)); - vec2 ts = textureSize(tex0, 0); + vec2 ts = vec2(textureSize(tex0, 0)); mat2 rm = mat2(1.0, 0.0, 0.0, ts.x/ts.y) * mat2(vec2(ca, sa), vec2(-sa, ca)) * mat2(1.0, 0.0, 0.0, ts.y/ts.x); vec2 cuv = (rm * (uv - vec2(0.5))) + vec2(0.5); @@ -28,7 +28,7 @@ float cosine_sample(vec2 uv){ } float l = dot(vec3(1.0/3.0), c.rgb); if (invert) { - l = 1 - l; + l = 1.0 - l; } float t = 0.0; @@ -38,14 +38,14 @@ float cosine_sample(vec2 uv){ float cosine_halftone(vec2 uv) { int w = 3; - vec2 step = 1.0 / textureSize(tex0, 0); - step /= (2*w); + vec2 step = 1.0 / vec2(textureSize(tex0, 0)); + step /= (2.0*float(w)); float weight = 0.0; float sum = 0.0; for (int v = -w; v <= w; ++v) { for (int u = -w; u <= w; ++u) { sum += cosine_sample(uv + step * vec2(u, v)); - weight+=1; + weight+=1.0; } } return sum / weight; @@ -56,7 +56,7 @@ void main() { vec4 c = texture(tex0, v_texCoord0); float t = cosine_halftone(v_texCoord0); if (invert) { - t = 1 - t; + t = 1.0 - t; } o_color = vec4(t, t, t, 1.0) * c.a; } \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/edges/canny-edge-detector.frag b/orx-fx/src/shaders/glsl/edges/canny-edge-detector.frag index f1a0552a..9e9c9db7 100644 --- a/orx-fx/src/shaders/glsl/edges/canny-edge-detector.frag +++ b/orx-fx/src/shaders/glsl/edges/canny-edge-detector.frag @@ -15,8 +15,7 @@ uniform vec4 foregroundColor; uniform float backgroundOpacity; uniform float foregroundOpacity; -vec2 iResolution = textureSize(tex0, 0); -vec2 fragCoord = v_texCoord0 * iResolution; +vec2 iResolution; float getAve(vec2 uv){ vec3 rgb = texture(tex0, uv).rgb; @@ -104,6 +103,8 @@ float cannyEdge(vec2 fragCoord, float mn, float mx){ } void main(){ + iResolution = vec2(textureSize(tex0, 0)); + vec2 fragCoord = v_texCoord0 * iResolution; float edge = cannyEdge(fragCoord, threshold0, threshold1); o_output = mix(foregroundColor * foregroundOpacity, backgroundColor * backgroundOpacity, 1.-edge); } \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/edges/contour.frag b/orx-fx/src/shaders/glsl/edges/contour.frag index 3d82721d..25a75945 100644 --- a/orx-fx/src/shaders/glsl/edges/contour.frag +++ b/orx-fx/src/shaders/glsl/edges/contour.frag @@ -17,13 +17,13 @@ float calc_contour(vec2 uv) { } void main() { - vec2 step = 1.0 / textureSize(tex0, 0); + vec2 step = 1.0 / vec2(textureSize(tex0, 0)); float contour = 0.0; float weight = 0.0; for (int i = -window; i <= window; ++i) { for (int j = -window; j <= window; ++j) { - contour += calc_contour(v_texCoord0 + step/(window+1.0) * vec2(i, j)); + contour += calc_contour(v_texCoord0 + step/(float(window)+1.0) * vec2(float(i), float(j))); weight += 1.0; } } diff --git a/orx-fx/src/shaders/glsl/edges/luma-sobel.frag b/orx-fx/src/shaders/glsl/edges/luma-sobel.frag index 67fd3cdf..3220633e 100644 --- a/orx-fx/src/shaders/glsl/edges/luma-sobel.frag +++ b/orx-fx/src/shaders/glsl/edges/luma-sobel.frag @@ -16,7 +16,7 @@ float luma(vec4 color){ } void main() { - vec2 step = 1.0 / textureSize(tex0, 0); + vec2 step = 1.0 / vec2(textureSize(tex0, 0)); float tl = luma(texture(tex0, v_texCoord0 + vec2(-step.x, step.y))); float l = luma(texture(tex0, v_texCoord0 + vec2(-step.x, 0))); @@ -39,7 +39,7 @@ void main() { float x = tl + 2.0 * l + bl - tr - 2.0 * r - br; float y = -tl - 2.0 * t - tr + bl + 2.0 * b + br; - float intensity = sqrt((x*x) + (y*y)) / sqrt(2); + float intensity = sqrt(x*x + y*y) / sqrt(2.0); vec4 color = mix(vec4(backgroundColor.rgb, backgroundOpacity), vec4(edgeColor.rgb, edgeOpacity), intensity); vec4 a = texture(tex0, v_texCoord0); diff --git a/orx-fx/src/shaders/glsl/patterns/checkers.frag b/orx-fx/src/shaders/glsl/patterns/checkers.frag index c94e7299..c6102654 100644 --- a/orx-fx/src/shaders/glsl/patterns/checkers.frag +++ b/orx-fx/src/shaders/glsl/patterns/checkers.frag @@ -21,7 +21,7 @@ void main() { vec2 cell = (uv / size); ivec2 cellIndex = ivec2(floor(cell)); - vec2 cellUV = cell - cellIndex; + vec2 cellUV = cell - vec2(cellIndex); int c = (cellIndex.x + cellIndex.y) % 2; vec2 w = fwidth(cell); diff --git a/orx-fx/src/shaders/glsl/shadow/dropshadow-blend.frag b/orx-fx/src/shaders/glsl/shadow/dropshadow-blend.frag index 0ed91c32..99168750 100644 --- a/orx-fx/src/shaders/glsl/shadow/dropshadow-blend.frag +++ b/orx-fx/src/shaders/glsl/shadow/dropshadow-blend.frag @@ -7,6 +7,6 @@ out vec4 o_color; void main() { vec4 a = texture(tex0, v_texCoord0-shift); vec4 b = texture(tex1, v_texCoord0); - float alpha = min(1,max(0, b.a)); + float alpha = min(1.0,max(0.0, b.a)); o_color = a * (1.0-alpha) + b; } \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/shadow/dropshadow-blur.frag b/orx-fx/src/shaders/glsl/shadow/dropshadow-blur.frag index 0a593b17..42aa1e0e 100644 --- a/orx-fx/src/shaders/glsl/shadow/dropshadow-blur.frag +++ b/orx-fx/src/shaders/glsl/shadow/dropshadow-blur.frag @@ -10,16 +10,16 @@ uniform float spread; uniform vec4 color; out vec4 o_color; void main() { - vec2 s = textureSize(tex0, 0).xy; + vec2 s = vec2(textureSize(tex0, 0)).xy; s = vec2(1.0/s.x, 1.0/s.y); int w = window; vec4 sum = vec4(0, 0, 0, 0); - float weight = 0; + float weight = 0.0; for (int x = -w; x<= w; ++x) { float lw = 1.0; - sum += texture(tex0, v_texCoord0 + x * blurDirection * s * spread); + sum += texture(tex0, v_texCoord0 + float(x) * blurDirection * s * spread); weight += lw; } diff --git a/orx-fx/src/shaders/glsl/tonemap/aces-tonemap.frag b/orx-fx/src/shaders/glsl/tonemap/aces-tonemap.frag index db244c2a..d477d39b 100644 --- a/orx-fx/src/shaders/glsl/tonemap/aces-tonemap.frag +++ b/orx-fx/src/shaders/glsl/tonemap/aces-tonemap.frag @@ -20,6 +20,6 @@ vec3 ACESFilm(vec3 x) { void main() { vec3 texColor = texture(tex0,v_texCoord0).rgb; vec3 color = ACESFilm(texColor * exposureBias); - vec3 retColor = pow(color, vec3(1/2.2)); - o_output = vec4(retColor, 1); + vec3 retColor = pow(color, vec3(1.0/2.2)); + o_output = vec4(retColor, 1.0); } \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/tonemap/reinhard-tonemap.frag b/orx-fx/src/shaders/glsl/tonemap/reinhard-tonemap.frag index 2b9fde22..834e2e50 100644 --- a/orx-fx/src/shaders/glsl/tonemap/reinhard-tonemap.frag +++ b/orx-fx/src/shaders/glsl/tonemap/reinhard-tonemap.frag @@ -28,6 +28,6 @@ vec3 reinhard_extended_luminance(vec3 v, float max_white_l) { void main() { vec3 texColor = texture(tex0,v_texCoord0).rgb; vec3 color = reinhard_extended_luminance(texColor * exposureBias, maxLuminance); - vec3 retColor = pow(color, vec3(1/2.2)); + vec3 retColor = pow(color, vec3(1.0/2.2)); o_output = vec4(retColor, 1); } \ No newline at end of file diff --git a/orx-fx/src/shaders/glsl/tonemap/uncharted2-tonemap.frag b/orx-fx/src/shaders/glsl/tonemap/uncharted2-tonemap.frag index dc0d25b8..e5bf89af 100644 --- a/orx-fx/src/shaders/glsl/tonemap/uncharted2-tonemap.frag +++ b/orx-fx/src/shaders/glsl/tonemap/uncharted2-tonemap.frag @@ -22,6 +22,6 @@ void main() { vec3 whiteScale = 1.0f/Uncharted2Tonemap(vec3(W)); vec3 color = curr*whiteScale; - vec3 retColor = pow(color, vec3(1/2.2)); + vec3 retColor = pow(color, vec3(1.0/2.2)); o_output = vec4(retColor, 1); } \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/encode-subpixel.frag b/orx-jumpflood/src/shaders/glsl/encode-subpixel.frag index c357759f..299c9ffb 100644 --- a/orx-jumpflood/src/shaders/glsl/encode-subpixel.frag +++ b/orx-jumpflood/src/shaders/glsl/encode-subpixel.frag @@ -42,31 +42,31 @@ void main() { if (mask == 1) { offset.x = 1.0 - (threshold-t10) / zd(t00-t10); offset.y = 1.0 - ((threshold-t01) / zd(t00-t01)); - offset /= 2; + offset /= 2.0; } if (mask == 2) { offset.x = ((threshold-t00) / zd(t10-t00)); offset.y = 1.0-(threshold-t11) / zd(t10-t11); - offset /= 2; + offset /= 2.0; } if (mask == 3) { // OK float dy0 = 1.0 - (threshold - t01) / zd(t00 - t01); float dy1 = 1.0 - (threshold - t11) / zd(t10 - t11); offset.y = dy0 + dy1; offset.x = 1.0; - offset /= 2; + offset /= 2.0; } if (mask == 4) { // OK offset.x = 1.0 - (threshold-t11) / zd(t01-t11); offset.y = (threshold-t00) / zd(t01-t00); - offset /= 2; + offset /= 2.0; } if (mask == 5) { // OK float dx0 = 1.0- (threshold - t10) / zd(t00 - t10); float dx1 = 1.0-(threshold - t11) / zd(t01 - t11); offset.x = dx0 + dx1; offset.y = 1.0; - offset /= 2; + offset /= 2.0; } if (mask == 6 || mask == 9) { offset = vec2(0.5); @@ -74,41 +74,41 @@ void main() { if (mask == 7) { // OK offset.x = 1.0 - (threshold-t11) / zd(t01-t11); offset.y = 1.0 - (threshold-t11) / zd(t10-t11); - offset /= 2; + offset /= 2.0; } if (mask == 8) { // OK offset.x = (threshold-t01) / zd(t11-t01); offset.y = (threshold-t10) / zd(t11-t10); - offset /= 2; + offset /= 2.0; } if (mask == 10) { // OK float dx0 = (threshold - t00) / zd(t10 - t00); float dx1 = (threshold - t01) / zd(t11 - t01); offset.x = (dx0 + dx1); offset.y = 1.0; - offset /= 2; + offset /= 2.0; } if (mask == 11) { // OK offset.x = (threshold-t01) / zd(t11-t01); offset.y = (threshold-t01) / zd(t00-t01); - offset /= 2; + offset /= 2.0; } if (mask == 12) { // OK float dy0 = (threshold - t00) / zd(t01 - t00); float dy1 = (threshold - t10) / zd(t11 - t10); offset.y = dy0 + dy1; offset.x = 1.0; - offset /= 2; + offset /= 2.0; } if (mask == 13) { // OK offset.x = 1.0 - (threshold-t10) / zd(t00-t10); offset.y = (threshold-t10) / zd(t11-t10); - offset /= 2; + offset /= 2.0; } if (mask == 14) { // OK offset.x = (threshold-t00) / zd(t10-t00); offset.y = (threshold-t00) / zd(t01-t00); - offset /= 2; + offset /= 2.0; } float contour = (mask != 0 && mask != 15)?1.0:0.0; diff --git a/orx-jumpflood/src/shaders/glsl/pixel-direction.frag b/orx-jumpflood/src/shaders/glsl/pixel-direction.frag index 428fd7f5..f38b592b 100644 --- a/orx-jumpflood/src/shaders/glsl/pixel-direction.frag +++ b/orx-jumpflood/src/shaders/glsl/pixel-direction.frag @@ -51,9 +51,9 @@ void main() { } #else if (!normalizedDistance) { - o_color = vec4( length(pixelDistance * distanceScale).xx, outputData, 1.0); + o_color = vec4( vec2(length(pixelDistance * distanceScale)), outputData, 1.0); } else if (!unitDirection) { - o_color = vec4( length(pixelDistance / originalSize).xx, outputData, 1.0); + o_color = vec4( vec2(length(pixelDistance / originalSize)), outputData, 1.0); } #endif } \ No newline at end of file diff --git a/orx-jumpflood/src/shaders/glsl/straight-skeleton.frag b/orx-jumpflood/src/shaders/glsl/straight-skeleton.frag index e0aaf907..3dc16bc2 100644 --- a/orx-jumpflood/src/shaders/glsl/straight-skeleton.frag +++ b/orx-jumpflood/src/shaders/glsl/straight-skeleton.frag @@ -39,7 +39,7 @@ void main() { fc += backgroundColor * backgroundColor.a; } - if ((d0 < angleTreshold || d1 < angleTreshold || d2 < angleTreshold || d3 < angleTreshold) && ct.z > 0.0 && length(ct.xy) > 4) { + if ((d0 < angleTreshold || d1 < angleTreshold || d2 < angleTreshold || d3 < angleTreshold) && ct.z > 0.0 && length(ct.xy) > 4.0) { fc = fc * (1.0 - skeletonColor.a) + (skeletonColor * skeletonColor.a); } o_color = fc; diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/PBRMaterial.kt b/orx-jvm/orx-dnk3/src/main/kotlin/PBRMaterial.kt index 6df39305..c038e3ac 100644 --- a/orx-jvm/orx-dnk3/src/main/kotlin/PBRMaterial.kt +++ b/orx-jvm/orx-dnk3/src/main/kotlin/PBRMaterial.kt @@ -41,7 +41,7 @@ private fun PointLight.fs(index: Int, hasNormalAttribute: Boolean): String = """ | vec3 L = normalize(Lr); | | float side = ${if (hasNormalAttribute) "dot(L, N)" else "3.1415"}; -| f_diffuse += attenuation * max(0, side / 3.1415) * p_lightColor$index.rgb * m_color.rgb; +| f_diffuse += attenuation * max(0.0, side / 3.1415) * p_lightColor$index.rgb * m_color.rgb; | f_specular += attenuation * ggx(N, V, L, m_roughness, m_f0) * p_lightColor$index.rgb * m_color.rgb; } """.trimMargin() @@ -71,7 +71,7 @@ private fun DirectionalLight.fs(index: Int, hasNormalAttribute: Boolean) = """ private fun HemisphereLight.fs(index: Int, hasNormalAttribute: Boolean): String = """ |{ -| float f = ${if (hasNormalAttribute) "dot(N, p_lightDirection$index) * 0.5 + 0.5" else "1"}; +| float f = ${if (hasNormalAttribute) "dot(N, p_lightDirection$index) * 0.5 + 0.5" else "1.0"}; | vec3 irr = ${irradianceMap?.let { "texture(p_lightIrradianceMap$index, N).rgb" } ?: "vec3(1.0)"}; | f_diffuse += mix(p_lightDownColor$index.rgb, p_lightUpColor$index.rgb, f) * irr * ((1.0 - m_metalness) * m_color.rgb) * m_ambientOcclusion; |} @@ -460,7 +460,7 @@ class PBRMaterial : Material { vec3 Vr = ep - v_worldPosition; vec3 V = normalize(Vr); - float NoV = ${if (primitiveContext.hasNormalAttribute) "abs(dot(N, V)) + 1e-5" else "1"}; + float NoV = ${if (primitiveContext.hasNormalAttribute) "abs(dot(N, V)) + 1e-5" else "1.0"}; ${if (environmentMap && materialContext.meshCubemaps.isNotEmpty() && primitiveContext.hasNormalAttribute) """ { diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/SceneRenderer.kt b/orx-jvm/orx-dnk3/src/main/kotlin/SceneRenderer.kt index d5626e34..c7082069 100644 --- a/orx-jvm/orx-dnk3/src/main/kotlin/SceneRenderer.kt +++ b/orx-jvm/orx-dnk3/src/main/kotlin/SceneRenderer.kt @@ -84,7 +84,7 @@ class SceneRenderer { } val target = shadowLightTargets.getOrPut(shadowLight) { val mapSize = (shadowLight.shadows as Shadows.MappedShadows).mapSize - pass.createPassTarget(mapSize, mapSize, DepthFormat.DEPTH16) + pass.createPassTarget(mapSize, mapSize, DepthFormat.DEPTH_STENCIL) } target.clearDepth(depth = 1.0) diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/ShaderUtilities.kt b/orx-jvm/orx-dnk3/src/main/kotlin/ShaderUtilities.kt index b81f4744..80ed275b 100644 --- a/orx-jvm/orx-dnk3/src/main/kotlin/ShaderUtilities.kt +++ b/orx-jvm/orx-dnk3/src/main/kotlin/ShaderUtilities.kt @@ -93,7 +93,7 @@ val shaderVSM = """ |// -- shaderVSM |float linstep(float min, float max, float v) |{ -| return clamp((v - min) / (max - min), 0, 1); +| return clamp((v - min) / (max - min), 0.0, 1.0); |} |// https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch08.html |float chebyshevUpperBound(vec2 moments, float t, float minVariance) { @@ -224,7 +224,7 @@ float ggx(vec3 N, vec3 V, vec3 L, float roughness, float F0) D = alphaSqr/(pi * denom * denom); // F - float dotLH5 = pow(1.0f-dotLH,5); + float dotLH5 = pow(1.0f-dotLH,5.0); F = F0 + (1.0-F0)*(dotLH5); // V diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/Shadows.kt b/orx-jvm/orx-dnk3/src/main/kotlin/Shadows.kt index 9c2178e8..35fedf98 100644 --- a/orx-jvm/orx-dnk3/src/main/kotlin/Shadows.kt +++ b/orx-jvm/orx-dnk3/src/main/kotlin/Shadows.kt @@ -27,7 +27,7 @@ fun Shadows.VSM.fs(index: Int) : String = """ |{ | vec4 smc = (p_lightTransform$index * vec4(v_worldPosition,1.0)); | vec3 lightProj = (smc.xyz/smc.w) * 0.5 + 0.5; -| if (lightProj.x > 0.0 && lightProj.x < 1.0 && lightProj.y > 0 && lightProj.y < 1) { +| if (lightProj.x > 0.0 && lightProj.x < 1.0 && lightProj.y > 0.0 && lightProj.y < 1.0) { | vec2 moments = texture(p_lightShadowMap$index, lightProj.xy).xy; | attenuation *= (chebyshevUpperBound(moments, length(Lr), 50.0)); | } @@ -38,9 +38,9 @@ fun Shadows.Simple.fs(index: Int): String = """ |{ | vec4 smc = (p_lightTransform$index * vec4(v_worldPosition,1.0)); | vec3 lightProj = (smc.xyz/smc.w) * 0.5 + 0.5; -| if (lightProj.x > 0.0 && lightProj.x < 1.0 && lightProj.y > 0 && lightProj.y < 1) { +| if (lightProj.x > 0.0 && lightProj.x < 1.0 && lightProj.y > 0.0 && lightProj.y < 1.0) { | vec3 smz = texture(p_lightShadowMap$index, lightProj.xy).rgb; -| vec2 step = 1.0 / textureSize(p_lightShadowMap$index,0); +| vec2 step = 1.0 / vec2(textureSize(p_lightShadowMap$index,0)); | float result = 0.0; | float compToZ = (lightProj.z- 0.0020 * tan(acos(NoL))) - 0.0003; | float currentDepth = lightProj.z; @@ -69,19 +69,19 @@ fun Shadows.PCF.fs(index: Int): String = """ | fTaps_Poisson[11] = vec2(-.792,-.598); | vec4 smc = (p_lightTransform$index * vec4(v_worldPosition,1.0)); | vec3 lightProj = (smc.xyz/smc.w) * 0.5 + 0.5; -| if (lightProj.x > 0.0 && lightProj.x < 1.0 && lightProj.y > 0 && lightProj.y < 1) { +| if (lightProj.x > 0.0 && lightProj.x < 1.0 && lightProj.y > 0.0 && lightProj.y < 1.0) { | vec3 smz = texture(p_lightShadowMap$index, lightProj.xy).rgb; -| vec2 stepSize = 1.0 / textureSize(p_lightShadowMap$index,0); +| vec2 stepSize = 1.0 / vec2(textureSize(p_lightShadowMap$index,0)); | float result = 0.0; | float compToZ = (lightProj.z- 0.0020 * tan(acos(NoL))) - 0.0003; | float noise = hash22(lightProj.xy*10.0).x; | float r = noise * 3.1415926535 * 2.0; | mat2 rot = mat2( vec2(cos(r), -sin(r)), vec2(sin(r),cos(r))); | for (int i = 0; i < 12; ++i) { -| float depth = texture(p_lightShadowMap$index, lightProj.xy + rot*fTaps_Poisson[i]*i*lrl*stepSize ).r; +| float depth = texture(p_lightShadowMap$index, lightProj.xy + rot*fTaps_Poisson[i]*float(i)*lrl*stepSize ).r; | result += step(compToZ, depth); | } -| result /= 12; +| result /= 12.0; | float currentDepth = lightProj.z; | float closestDepth = smz.x; | float shadow = result;// (currentDepth - 0.0020 * tan(acos(NoL))) - 0.0003 >= closestDepth ? 0.0 : 1.0; diff --git a/orx-jvm/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt b/orx-jvm/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt index eed4a3a9..c2d699c9 100644 --- a/orx-jvm/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt +++ b/orx-jvm/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt @@ -97,7 +97,7 @@ fun GltfFile.buildSceneNodes(): GltfSceneData { val cb = loadImage(MPPBuffer(localBuffer)) cb.generateMipmaps() cb.filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) - cb.anisotropy = 100.0 + cb.anisotropy = 10.0 localBuffer.limit(localBuffer.capacity()) cb } ?: error("no uri and no bufferview") diff --git a/orx-jvm/orx-dnk3/src/main/resources/shaders/screenspace-reflections.frag b/orx-jvm/orx-dnk3/src/main/resources/shaders/screenspace-reflections.frag index 0259fc8d..98fbc423 100644 --- a/orx-jvm/orx-dnk3/src/main/resources/shaders/screenspace-reflections.frag +++ b/orx-jvm/orx-dnk3/src/main/resources/shaders/screenspace-reflections.frag @@ -295,7 +295,7 @@ void main() { float angle = abs(dot(reflected, viewNormal)); - float frontalFade = clamp(-reflected.z,0, 1); + float frontalFade = clamp(-reflected.z,0.0, 1.0); if ( true ) { bool hit = traceScreenSpaceRay1( viewPos, diff --git a/orx-jvm/orx-dnk3/src/main/resources/shaders/segment-contours.frag b/orx-jvm/orx-dnk3/src/main/resources/shaders/segment-contours.frag index 91bd0806..f6b9c525 100644 --- a/orx-jvm/orx-dnk3/src/main/resources/shaders/segment-contours.frag +++ b/orx-jvm/orx-dnk3/src/main/resources/shaders/segment-contours.frag @@ -1,12 +1,10 @@ -#version 330 - -uniform usampler2D tex0; +uniform highp usampler2D tex0; in vec2 v_texCoord0; out vec4 o_output; void main() { ivec2 ts = textureSize(tex0, 0); - ivec2 pixel = ivec2(v_texCoord0 * ts); + ivec2 pixel = ivec2(v_texCoord0 * vec2(ts)); ivec2 c = pixel; ivec2 n = c + ivec2(0, -1); diff --git a/orx-jvm/orx-olive/images/DemoOlive01Kt.png b/orx-jvm/orx-olive/images/DemoOlive01Kt.png deleted file mode 100644 index e4a00494b098ceface6e330af3f8b74b32347e9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33331 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 VxctLhO$G)A22WQ%mvv4FO#mOeb@%`P diff --git a/orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill01.kt b/orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill01.kt index f25208ed..ea9d8bc0 100644 --- a/orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill01.kt +++ b/orx-jvm/orx-poisson-fill/src/demo/kotlin/DemoPoissonFill01.kt @@ -8,11 +8,9 @@ import org.openrndr.draw.ColorType import org.openrndr.draw.colorBuffer import org.openrndr.draw.isolatedWithTarget import org.openrndr.draw.renderTarget -import org.openrndr.extensions.SingleScreenshot import org.openrndr.extra.noise.Random import org.openrndr.math.Polar import org.openrndr.math.clamp -import org.openrndr.math.mix import org.openrndr.poissonfill.PoissonFill import org.openrndr.shape.Rectangle import kotlin.math.sin @@ -25,7 +23,7 @@ fun main() { val dry = renderTarget(width, height) { colorBuffer(type = ColorType.FLOAT32) } - val wet = colorBuffer(width, height) + val wet = colorBuffer(width, height, type = ColorType.FLOAT32) val fx = PoissonFill() diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/downscale.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/downscale.frag index ec074939..90260d11 100644 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/downscale.frag +++ b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/downscale.frag @@ -1,7 +1,4 @@ // from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/downscale.frag - -#version 330 - in vec2 v_texCoord0; uniform vec2 targetSize; @@ -43,7 +40,8 @@ void main(){ continue; //accum = vec4(1.0, 0.0, 0.0, 1.0); } - accum += h1[dx+2] * h1[dy+2] * texelFetch(tex0, newPix,0); + accum += h1[dx+2] * h1[dy+2] * texelFetch(tex0, newPix,0 + ); } } o_output = accum; diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-boundary.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-boundary.frag index faa8a563..684db8b6 100644 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-boundary.frag +++ b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-boundary.frag @@ -1,7 +1,5 @@ // from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/fill-boundary.frag -#version 330 - in vec2 v_texCoord0; uniform sampler2D tex0; diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-combine.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-combine.frag index ca5069f6..106b5683 100644 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-combine.frag +++ b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/fill-combine.frag @@ -1,7 +1,5 @@ // from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/fill-combine.frag -#version 330 - in vec2 v_texCoord0; uniform sampler2D tex0; // result of pyramid convolution diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/filter.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/filter.frag index 203d3a8a..b6fea945 100644 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/filter.frag +++ b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/filter.frag @@ -1,7 +1,5 @@ // from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/filter.frag -#version 330 - //layout(binding = 0) uniform sampler2D screenTexture; ///< Level to filter. uniform sampler2D tex0; @@ -24,7 +22,7 @@ void main(){ vec4 accum = vec4(0.0); ivec2 size = textureSize(tex0, 0).xy; - ivec2 coords = ivec2(v_texCoord0 * size); + ivec2 coords = ivec2(v_texCoord0 * vec2(size)); for(int dy = -1; dy <=1; dy++){ for(int dx = -1; dx <=1; dx++){ diff --git a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/upscale.frag b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/upscale.frag index 392bdbad..8dfaf990 100644 --- a/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/upscale.frag +++ b/orx-jvm/orx-poisson-fill/src/main/resources/shaders/gl3/poisson/upscale.frag @@ -1,7 +1,5 @@ // from https://github.com/kosua20/Rendu/blob/master/resources/common/shaders/screens/convolution-pyramid/upscale.frag -#version 330 - in vec2 v_texCoord0; uniform sampler2D tex0; ///< Current h1 filtered level. @@ -27,7 +25,7 @@ bool isOutside(ivec2 pos, ivec2 size){ void main(){ vec4 accum = vec4(0.0); ivec2 size = textureSize(tex0, 0).xy; - ivec2 coords = ivec2(v_texCoord0 * size); + ivec2 coords = ivec2(v_texCoord0 * vec2(size)); for(int dy = -1; dy <=1; dy++){ for(int dx = -1; dx <=1; dx++){