From b8e9aa7ccf1a97440b042ddd79442cba2a293dd9 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Mon, 13 Feb 2012 06:48:31 +0000 Subject: [PATCH] Added shader examples to OpenGL Android --- .../Shaders/EdgeDetect/AndroidManifest.xml | 17 ++++++++ .../OpenGL/Shaders/EdgeDetect/EdgeDetect.pde | 34 ++++++++++++++++ .../OpenGL/Shaders/EdgeDetect/data/edges.glsl | 40 +++++++++++++++++++ .../Shaders/EdgeDetect/sketch.properties | 1 + .../Shaders/ToonShading/AndroidManifest.xml | 17 ++++++++ .../Shaders/ToonShading/ToonShading.pde | 39 ++++++++++++++++++ .../Shaders/ToonShading/data/ToonFrag.glsl | 22 ++++++++++ .../Shaders/ToonShading/data/ToonVert.glsl | 29 ++++++++++++++ 8 files changed, 199 insertions(+) create mode 100644 android/examples/OpenGL/Shaders/EdgeDetect/AndroidManifest.xml create mode 100644 android/examples/OpenGL/Shaders/EdgeDetect/EdgeDetect.pde create mode 100644 android/examples/OpenGL/Shaders/EdgeDetect/data/edges.glsl create mode 100644 android/examples/OpenGL/Shaders/EdgeDetect/sketch.properties create mode 100644 android/examples/OpenGL/Shaders/ToonShading/AndroidManifest.xml create mode 100644 android/examples/OpenGL/Shaders/ToonShading/ToonShading.pde create mode 100644 android/examples/OpenGL/Shaders/ToonShading/data/ToonFrag.glsl create mode 100644 android/examples/OpenGL/Shaders/ToonShading/data/ToonVert.glsl diff --git a/android/examples/OpenGL/Shaders/EdgeDetect/AndroidManifest.xml b/android/examples/OpenGL/Shaders/EdgeDetect/AndroidManifest.xml new file mode 100644 index 000000000..1d22da801 --- /dev/null +++ b/android/examples/OpenGL/Shaders/EdgeDetect/AndroidManifest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + diff --git a/android/examples/OpenGL/Shaders/EdgeDetect/EdgeDetect.pde b/android/examples/OpenGL/Shaders/EdgeDetect/EdgeDetect.pde new file mode 100644 index 000000000..7a7a86b39 --- /dev/null +++ b/android/examples/OpenGL/Shaders/EdgeDetect/EdgeDetect.pde @@ -0,0 +1,34 @@ +// This example shows how to change the default fragment shader used +// in P3D to render textures, by a custom one that applies a simple +// edge detection filter. +// +// Press any key to switch between the custom and the default shader. + +PImage img; +PShader shader; +PGraphicsAndroid3D pg; +boolean usingShader; + +void setup() { + size(400, 400, P3D); + img = loadImage("berlin-1.jpg"); + + pg = (PGraphicsAndroid3D)g; + shader = pg.loadShader("edges.glsl", FILL_SHADER_TEX); + pg.setShader(shader, FILL_SHADER_TEX); + usingShader = true; +} + +void draw() { + image(img, 0, 0, width, height); +} + +void mousePressed() { + if (usingShader) { + pg.resetShader(FILL_SHADER_TEX); + usingShader = false; + } else { + pg.setShader(shader, FILL_SHADER_TEX); + usingShader = true; + } +} diff --git a/android/examples/OpenGL/Shaders/EdgeDetect/data/edges.glsl b/android/examples/OpenGL/Shaders/EdgeDetect/data/edges.glsl new file mode 100644 index 000000000..a16a87b5e --- /dev/null +++ b/android/examples/OpenGL/Shaders/EdgeDetect/data/edges.glsl @@ -0,0 +1,40 @@ +// Edge detection shader + +precision mediump float; + +uniform sampler2D textureSampler; + +// The inverse of the texture dimensions along X and Y +uniform vec2 texcoordOffset; + +varying vec4 vertColor; +varying vec4 vertTexcoord; + +void main() { + vec4 sum = vec4(0); + + float kernel[9]; + kernel[0] = -1.0; kernel[1] = -1.0; kernel[2] = -1.0; + kernel[3] = -1.0; kernel[4] = +8.0; kernel[5] = -1.0; + kernel[6] = -1.0; kernel[7] = -1.0; kernel[8] = -1.0; + + vec2 offset[9]; + offset[0] = vec2(-texcoordOffset.s, -texcoordOffset.t); + offset[1] = vec2( 0.0, -texcoordOffset.t); + offset[2] = vec2(+texcoordOffset.s, -texcoordOffset.t); + + offset[3] = vec2(-texcoordOffset.s, 0.0); + offset[4] = vec2( 0.0, 0.0); + offset[5] = vec2(+texcoordOffset.s, 0.0); + + offset[6] = vec2(-texcoordOffset.s, +texcoordOffset.t); + offset[7] = vec2( 0.0, +texcoordOffset.t); + offset[8] = vec2(+texcoordOffset.s, +texcoordOffset.t); + + for (int i = 0; i < 9; i++) { + vec4 tmp = texture2D(textureSampler, vertTexcoord.st + offset[i]); + sum += tmp * kernel[i]; + } + + gl_FragColor = vec4(sum.rgb, 1.0); +} \ No newline at end of file diff --git a/android/examples/OpenGL/Shaders/EdgeDetect/sketch.properties b/android/examples/OpenGL/Shaders/EdgeDetect/sketch.properties new file mode 100644 index 000000000..2e0e580dd --- /dev/null +++ b/android/examples/OpenGL/Shaders/EdgeDetect/sketch.properties @@ -0,0 +1 @@ +mode=Android diff --git a/android/examples/OpenGL/Shaders/ToonShading/AndroidManifest.xml b/android/examples/OpenGL/Shaders/ToonShading/AndroidManifest.xml new file mode 100644 index 000000000..1d22da801 --- /dev/null +++ b/android/examples/OpenGL/Shaders/ToonShading/AndroidManifest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + diff --git a/android/examples/OpenGL/Shaders/ToonShading/ToonShading.pde b/android/examples/OpenGL/Shaders/ToonShading/ToonShading.pde new file mode 100644 index 000000000..df6412434 --- /dev/null +++ b/android/examples/OpenGL/Shaders/ToonShading/ToonShading.pde @@ -0,0 +1,39 @@ +// Example showing the use of a custom lighting shader in order +// to apply a toon effect on the scene. + +PShader shader; +PGraphicsAndroid3D pg; +boolean usingShader; + +public void setup() { + size(400, 400, P3D); + noStroke(); + fill(204); + + pg = (PGraphicsAndroid3D)g; + shader = pg.loadShader("ToonVert.glsl", "ToonFrag.glsl", FILL_SHADER_LIT); + pg.setShader(shader, FILL_SHADER_LIT); + usingShader = true; +} + +void draw() { + noStroke(); + background(0); + float dirY = (mouseY / float(height) - 0.5) * 2; + float dirX = (mouseX / float(width) - 0.5) * 2; + directionalLight(204, 204, 204, -dirX, -dirY, -1); + translate(width/2, height/2); + sphere(80); +} + +void keyPressed() { + if (usingShader) { + pg.resetShader(FILL_SHADER_LIT); + usingShader = false; + } + else { + pg.setShader(shader, FILL_SHADER_LIT); + usingShader = true; + } +} + diff --git a/android/examples/OpenGL/Shaders/ToonShading/data/ToonFrag.glsl b/android/examples/OpenGL/Shaders/ToonShading/data/ToonFrag.glsl new file mode 100644 index 000000000..5789f9357 --- /dev/null +++ b/android/examples/OpenGL/Shaders/ToonShading/data/ToonFrag.glsl @@ -0,0 +1,22 @@ +precision mediump float; + +varying vec3 vertNormal; +varying vec3 vertLightDir; + +void main() { + float intensity; + vec4 color; + intensity = max(0.0, dot(vertLightDir, vertNormal)); + + if (intensity > 0.95) { + color = vec4(1.0, 0.5, 0.5, 1.0); + } else if (intensity > 0.5) { + color = vec4(0.6, 0.3, 0.3, 1.0); + } else if (intensity > 0.25) { + color = vec4(0.4, 0.2, 0.2, 1.0); + } else { + color = vec4(0.2, 0.1, 0.1, 1.0); + } + + gl_FragColor = color; +} \ No newline at end of file diff --git a/android/examples/OpenGL/Shaders/ToonShading/data/ToonVert.glsl b/android/examples/OpenGL/Shaders/ToonShading/data/ToonVert.glsl new file mode 100644 index 000000000..f314485aa --- /dev/null +++ b/android/examples/OpenGL/Shaders/ToonShading/data/ToonVert.glsl @@ -0,0 +1,29 @@ +// Toon shader using per-pixel lighting. Based on the glsl +// tutorial from lighthouse 3D: +// http://www.lighthouse3d.com/tutorials/glsl-tutorial/toon-shader-version-ii/ + +uniform mat4 modelviewMatrix; +uniform mat4 projmodelviewMatrix; +uniform mat3 normalMatrix; + +uniform vec3 lightNormal[8]; + +attribute vec4 inVertex; +attribute vec3 inNormal; + +varying vec3 vertNormal; +varying vec3 vertLightDir; + +void main() { + // Vertex in clip coordinates + gl_Position = projmodelviewMatrix * inVertex; + + // Normal vector in eye coordinates is passed + // to the fragment shader + vertNormal = normalize(normalMatrix * inNormal); + + // Assuming that there is only one directional light. + // Its normal vector is passed to the fragment shader + // in order to perform per-pixel lighting calculation. + vertLightDir = -lightNormal[0]; +} \ No newline at end of file