TA159

Notas, resueltos y trabajos practicos de la materia Sistemas Gráficos
Index Commits Files Refs Submodules README LICENSE
commit aa3245be295837fd370cd6f96f9e519f21c15f21
parent 24e77e8cbefcf7df71812555f71a9b0684948fd3
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Fri, 12 Jul 2024 18:19:30 -0300

add previously deleted file `tp/src/shaders.js`

Diffstat:
Atp/src/shaders.js | 109+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 109 insertions(+), 0 deletions(-)
diff --git a/tp/src/shaders.js b/tp/src/shaders.js
@@ -0,0 +1,109 @@
+export const vertexShader = `
+    precision highp float;
+
+    // Atributos de los vértices
+    attribute vec3 position; // Posición del vértice
+    attribute vec3 normal;   // Normal del vértice
+    attribute vec2 uv;       // Coordenadas de textura
+
+    // Uniforms
+    uniform mat4 modelMatrix;       // Matriz de transformación del objeto
+    uniform mat4 viewMatrix;        // Matriz de transformación de la cámara
+    uniform mat4 projectionMatrix;  // Matriz de proyección de la cámara
+    uniform mat4 worldNormalMatrix; // Matriz de normales
+
+    // Varying
+    varying vec2  vUv;       // Coordenadas de textura que se pasan al fragment shader
+    varying vec3  vNormal;   // Normal del vértice que se pasa al fragment shader
+    varying vec3  vWorldPos; // Posición del vértice en el espacio  de mundo
+
+    void main() {
+        // Lee la posición del vértice desde los atributos
+        vec3 pos = position;
+
+        // Se calcula la posición final del vértice
+        // Se aplica la transformación del objeto, la de la cámara y la de proyección
+        gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(pos, 1.0);
+
+        // Se pasan las coordenadas de textura al fragment shader
+        vUv = uv;
+        vNormal = normalize(vec3(worldNormalMatrix * vec4(normal, 0.0)));
+        vWorldPos = (modelMatrix * vec4(pos, 1.0)).xyz;
+    }
+`;
+
+export const fragmentShader = `
+    precision mediump float;
+    varying vec2 vUv;
+    varying vec3 vNormal;
+    varying vec3 vWorldPos;
+
+    uniform float scale;
+    uniform float terrainAmplitude;
+    uniform float terrainAmplitudeBottom;
+    uniform float dirtStepWidth;
+    uniform float rockStepWidth;
+
+    uniform sampler2D dirtSampler;
+    uniform sampler2D rockSampler;
+    uniform sampler2D grassSampler;
+
+    float normalize(float inputValue, float minValue, float maxValue) {
+        return (inputValue - minValue) / (maxValue - minValue);
+    }
+
+    void main(void) {
+        vec2 uv = vUv*8.0;
+        vec2 uv2 = vUv*scale;
+
+        float heightFactor = vWorldPos.y - terrainAmplitudeBottom;
+        float heightFactorNormalized = normalize(heightFactor, 0.0, terrainAmplitude);
+
+        vec3 grass = texture2D(grassSampler, uv).xyz;
+        vec3 dirt  = texture2D(dirtSampler, uv*4.0).xyz;
+        vec3 rock  = texture2D(rockSampler, uv).xyz;
+
+        // muestreo de pasto a diferentes escalas, luego se combina con \`mix()\`
+        vec3 grass1 = texture2D(grassSampler, uv2*1.00).xyz;
+        vec3 grass2 = texture2D(grassSampler, uv2*3.13).xyz;
+        vec3 grass3 = texture2D(grassSampler, uv2*2.37).xyz;
+        vec3 colorGrass = mix(mix(grass1,grass2,0.5),grass3,0.3);
+
+        // lo mismo para la textura de tierra
+        vec3 dirt1 = texture2D(dirtSampler, uv2*3.77).xyz;
+        vec3 dirt2 = texture2D(dirtSampler, uv2*1.58).xyz;
+        vec3 dirt3 = texture2D(dirtSampler, uv2*1.00).xyz;
+        vec3 colorDirt = mix(mix(dirt1, dirt2, 0.5), dirt3, 0.3);
+
+        // lo mismo para la textura de roca
+        vec3 rock1 = texture2D(rockSampler,uv2*0.40).xyz;
+        vec3 rock2 = texture2D(rockSampler,uv2*2.38).xyz;
+        vec3 rock3 = texture2D(rockSampler,uv2*3.08).xyz;
+        vec3 colorRock = mix(mix(rock1, rock2, 0.5), rock3,0.5);
+
+        float u = heightFactorNormalized;
+
+        // float pi = 3.141592654;
+        // float grassFactor = sin(pi*u);
+        // float dirtFactor  = abs(sin(2.0*pi));
+        // float rockFactor  = clamp(cos(2.0*pi*u), 0.0, 1.0);
+
+        float width2 = rockStepWidth;
+        float rockFactor = 2.00 - smoothstep(0.0, width2, u)
+                                - smoothstep(1.0, 1.00 - width2, u);
+
+        float width = dirtStepWidth;
+        float s1 = smoothstep(0.00, width, u);
+        float s2 = smoothstep(width, width*2.0, u);
+        float s3 = smoothstep(0.50, 0.50 + width, u);
+        float s4 = smoothstep(0.50 + width, 0.50 + width*2.0, u);
+        float dirtFactor = (s1 - s2) + (s3 - s4);
+
+        float grassFactor = smoothstep(0.0, 0.35, u) - smoothstep(0.35, 1.00, u);
+
+        vec3 colorDirtGrass = mix(colorDirt, colorGrass, grassFactor);
+        vec3 colorDirtGrassDirt = mix(colorDirtGrass, colorDirt, dirtFactor);
+        vec3 color = mix(colorDirtGrassDirt, colorRock, rockFactor);
+
+        gl_FragColor = vec4(color, 1.0);
+    }`;