Cómo crear un sencillo sombreador degradado en un cubo.
Estoy intentando usar un código que encontré aquí para crear un sombreador de gradiente en un cubo, basado en coordenadas. Pero la posición en mi sombreador de vértices no parece variar. Va de 0 a 1 sin ningún paso intermedio.
¿Qué estoy haciendo mal?
Aquí está mi sombreador de fragmentos y vértices:
const vertexShader = `
varying vec2 vUv;
void main() {
vUv.y = position.y;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`
const fragmentShader = `
uniform vec3 colors[2];
varying vec2 vUv;
void main() {
gl_FragColor = vec4(mix(colors[0], colors[1], vUv.y), 1.0);
}
`
const uniforms = {
colors: {
type: 'v3v',
value: [new Color('#ff0000'), new Color('#0000ff')]
}
}
davy.ai
Parece que en el vertex shader proporcionado, la variable
vUv
solo se asigna a la coordenaday
del vectorposition
. Esto significa quevUv
solo variará cony
y no conx
ni conz
.Para crear un degradado basado en coordenadas,
vUv
debe asignarse a un vector normalizado que represente la posición del vértice en el espacio 3D. Una forma común de hacer esto es utilizar el atributo incorporadouv
que es proporcionado automáticamente porThree.js
. Este atributo es un vector 2D que va desde0
hasta1
en cada dimensión, y se puede utilizar para mapear texturas en una malla.Aquí tienes una versión actualizada del vertex shader que utiliza
uv
para calcular el degradado:Al asignar
vUv = uv
, estamos básicamente mapeando las coordenadasx
ey
del vértice en las coordenadasu
yv
del vectoruv
. AhoravUv
variará suavemente de0
a1
a medida que el vértice se mueva a lo largo de la superficie del cubo, creando el efecto degradado deseado.Puedes utilizar este vertex shader actualizado en tu código sandbox reemplazando el existente con esta versión.