{"id":3757,"date":"2025-11-24T10:42:54","date_gmt":"2025-11-24T09:42:54","guid":{"rendered":"https:\/\/blogs.uned.es\/hablandodefisicauned\/?p=3757"},"modified":"2026-05-18T11:07:07","modified_gmt":"2026-05-18T09:07:07","slug":"la-fisica-de-la-luz-digital","status":"publish","type":"post","link":"https:\/\/blogs.uned.es\/hablandodefisicauned\/2025\/11\/24\/la-fisica-de-la-luz-digital\/","title":{"rendered":"La f\u00edsica de la luz digital"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Autor: <a href=\"http:\/\/linkedin.com\/in\/josemorval\/\">Jos\u00e9 Manuel Moreno Valderrama<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Desde hace a\u00f1os, damos por supuesta la calidad visual de las producciones generadas por ordenador, ya sean pel\u00edculas o videojuegos. Las sombras que proyectan los objetos, los reflejos en espejos o la sutil transferencia de color entre superficies cercanas, que vemos en cualquier fotograma de estas obras, podr\u00edan parecer a primer vista algo hecho a mano por artistas, como si un pintor hubiera pintado esos detalles. Nada m\u00e1s lejos de la realidad: la mayor\u00eda de estos efectos se generan a partir de ecuaciones complejas que describen c\u00f3mo interact\u00faa la luz con los distintos materiales. Es decir, cada fotograma es una simulaci\u00f3n del comportamiento de la luz en el mundo real. Basta imaginar c\u00f3mo la luz rebota en una mesa, toca la pared y luego se refleja en un espejo para intuir la enorme cantidad de matem\u00e1ticas y f\u00edsica que intervienen en la escena.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El t\u00e9rmino t\u00e9cnico para lo descrito anteriormente es <strong>iluminaci\u00f3n global<\/strong>. Su objetivo \u00faltimo es determinar el color que percibimos al mirar una escena bajo ciertas condiciones de iluminaci\u00f3n. Resolverlo de manera exacta ser\u00eda <em>imposible<\/em>, porque la luz rebota millones de veces entre superficies y cada interacci\u00f3n influye en el resultado final. Por eso se utilizan m\u00e9todos aproximados que buscan reproducir este comportamiento de la forma m\u00e1s fiel posible a la realidad f\u00edsica.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/final_fantasy-1024x576.png\" alt=\"\" class=\"wp-image-3895\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/final_fantasy-1024x576.png 1024w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/final_fantasy-300x169.png 300w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/final_fantasy-768x432.png 768w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/final_fantasy.png 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Final Fantasy: The Spirits Within. Square Pictures, 2001.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Por si esto no fuera lo suficientemente dif\u00edcil, muchas veces se necesita que estos c\u00e1lculos se hagan muy r\u00e1pido. Esto es lo que sucede en aplicaciones interactivas como los videojuegos, en los que cada frame debe <em>servirse<\/em> al usuario en alrededor de <strong>16 milisegundos<\/strong> (60 frames cada segundo), lo que lleva en la mayor\u00eda de ocasiones a realizar aproximaciones menos realistas desde el punto de vista f\u00edsico, pero igualmente convincentes visualmente.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/death_stranding-1024x576.png\" alt=\"\" class=\"wp-image-3893\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/death_stranding-1024x576.png 1024w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/death_stranding-300x169.png 300w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/death_stranding-768x432.png 768w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/death_stranding.png 1279w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Death Stranding 2: On the Beach (PS5). Kojima Productions, 2025.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Para explorar c\u00f3mo funcionan estos modelos, vamos a considerar una escena sencilla iluminada con una \u00fanica fuente de luz muy lejana, como podr\u00eda ser el Sol. Renderizar esta escena en una pantalla (esto es, producir una imagen a partir de ella) puede hacerse de varias maneras. En este caso optaremos por utilizar <a href=\"https:\/\/en.wikipedia.org\/wiki\/Ray_marching\"><strong>ray marching<\/strong><\/a>, una t\u00e9cnica de renderizado emparentada con el m\u00e1s conocido <a href=\"https:\/\/en.wikipedia.org\/wiki\/Ray_tracing_(graphics)\"><strong>ray tracing<\/strong><\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De forma resumida, su funcionamiento puede entenderse as\u00ed:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Primero, <strong>creamos una c\u00e1mara virtual<\/strong>. Cada p\u00edxel de la imagen que queremos generar tiene una posici\u00f3n en el espacio.<\/li>\n\n\n\n<li>Desde la posici\u00f3n de la c\u00e1mara, <strong>lanzamos un rayo que pasa por cada p\u00edxel<\/strong> y lo dirigimos hacia la escena, avanzando en pasos discretos. Esto puede resultar sorprendente, ya que <strong>trazamos caminos desde el ojo hacia la escena<\/strong>, justo <em>al contrario<\/em> de lo que ocurrir\u00eda en la realidad. Pero de esta manera exploramos \u00fanicamente l<em>os caminos que llegan a nuestros ojos<\/em>.<\/li>\n\n\n\n<li>El avance del rayo podr\u00eda hacerse con pasos de <strong>tama\u00f1o fijo<\/strong>, pero para optimizar los c\u00e1lculos suelen emplearse las llamadas <strong>funciones de distancia con signo<\/strong> (<em>SDF<\/em>s<em>)<\/em>.<\/li>\n\n\n\n<li>Estas funciones al ser evaluadas en un punto del espacio <em>devuelven<\/em> distancias a superficies definidas por ellas. Si tomamos el m\u00ednimo de todas esas distancias, obtenemos la <strong>distancia a la superficie m\u00e1s cercana<\/strong> en el mundo que hemos definido. As\u00ed, podemos avanzar en cada paso exactamente esa distancia sin miedo a <em>chocarnos<\/em> con nada. Si en alg\u00fan momento, la funci\u00f3n devuelve un valor cercano a cero, interpretamos que el rayo ha <strong>tocado una superficie<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Parar aclarar conceptos, en las siguientes im\u00e1genes puede verse un diagrama de una c\u00e1mara virtual<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1024\" height=\"577\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/shader-02_mod.png\" alt=\"\" class=\"wp-image-3897\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/shader-02_mod.png 1024w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/shader-02_mod-300x169.png 300w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/shader-02_mod-768x433.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Diagrama de una c\u00e1mara virtual. Figura propiedad de <a href=\"https:\/\/jasmcole.com\/2019\/10\/03\/signed-distance-fields\/\">https:\/\/jasmcole.com\/2019\/10\/03\/signed-distance-fields\/<\/a>.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">y del viaje de un rayo mediante la t\u00e9cnica de ray marching, en este caso una variante conocida como <strong>sphere tracing<\/strong>. Como hemos comentado antes, la <strong>distancia a la superficie m\u00e1s cercana<\/strong> determina exactamente cu\u00e1nto podemos avanzar en cada paso.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"354\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/keinert_2014.png\" alt=\"\" class=\"wp-image-3899\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/keinert_2014.png 768w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/keinert_2014-300x138.png 300w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><figcaption class=\"wp-element-caption\">Rayo explorando una SDF usando Sphere tracing. Figura tomada de [1]<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Un buen ejemplo de SDF ser\u00eda la de <strong>una esfera centrada en el origen con un radio<br>determinado<\/strong>, que podr\u00eda implementarse en <a href=\"https:\/\/en.wikipedia.org\/wiki\/OpenGL_Shading_Language\">GLSL<\/a> (un lenguaje similar a C, ampliamente utilizado en programaci\u00f3n gr\u00e1fica) de la siguiente manera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float sdSphere( vec3 pos, float rad ) { return length( pos ) - rad; }<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Algo importante que a\u00fan no hemos mencionado sobre las SDFs es <strong>su signo<\/strong>. La funci\u00f3n puede devolver un valor <strong>positivo o negativo<\/strong>, lo que nos indica si el punto est\u00e1 <strong>fuera o dentro<\/strong> de la superficie. Esta informaci\u00f3n puede resultar de gran utilidad seg\u00fan el caso que estemos tratando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, podemos ver dos im\u00e1genes de nuestro ray marcher explorando una escena de prueba. Cuando choca con la superficie nos lo presenta con distintos colores:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La normal de la superficie, en la primera imagen. El canal rojo del color representa la<br>componente $x$ del vector normal, el verde la $y$, y el azul la $z$.<\/li>\n\n\n\n<li>La segunda es un poco m\u00e1s <em>psicod\u00e9lica<\/em>, aunque se usa frecuentemente para obtener<br>informaci\u00f3n de la escena. En este caso, estamos aplicando la <a href=\"https:\/\/en.wikipedia.org\/wiki\/Sawtooth_wave\"><strong>funci\u00f3n de dientes de sierra<\/strong><\/a> a cada direcci\u00f3n del espacio, y el resultado se codifica del mismo modo en los canales del color. Esto nos permite cubrir la escena con una serie de <em>baldosas<\/em> de tama\u00f1o unidad con informaci\u00f3n direccional.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"796\" height=\"446\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/normal.png\" alt=\"\" class=\"wp-image-3903\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/normal.png 796w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/normal-300x168.png 300w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/normal-768x430.png 768w\" sizes=\"(max-width: 796px) 100vw, 796px\" \/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/www.shadertoy.com\/view\/w3lfz7\">https:\/\/www.shadertoy.com\/view\/w3lfz7<\/a><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"798\" height=\"448\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/pos.png\" alt=\"\" class=\"wp-image-3907\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/pos.png 798w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/pos-300x168.png 300w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/pos-768x431.png 768w\" sizes=\"(max-width: 798px) 100vw, 798px\" \/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/www.shadertoy.com\/view\/WXlBRH\">https:\/\/www.shadertoy.com\/view\/WXlBRH<\/a><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Todos los ejemplos que vamos a ir exponiendo en el art\u00edculo han sido desarrollados con<a href=\"https:\/\/www.shadertoy.com\/\"><br>Shadertoy<\/a>, un entorno interactivo donde los shaders (programas escritos en GLSL) se ejecutan en tiempo real en la GPU del sistema. Cada shader define el color de cada p\u00edxel mostrado en pantalla. Al pie de cada figura incluiremos el enlace correspondiente al c\u00f3digo, que puede consultarse, modificarse y ejecutarse libremente en la propia web.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>El modelo Blinn-Phong<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este modelo emp\u00edrico de iluminaci\u00f3n, propuesto por <strong>B\u00f9i T. Phong<\/strong> en su tesis en 1973 [2], y refinado posteriormente por <strong>James F. Blinn<\/strong> en 1977 [3], es considerado uno de los m\u00e1s influyentes en la generaci\u00f3n de im\u00e1genes por ordenador (<em>CGI<\/em>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El modelo establece que la <strong>intensidad total de la luz reflejada<\/strong> en un punto $P$ es la suma de tres componentes,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$I = I_a + I_d + I_s$,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">donde $I_a$ representa la <strong>iluminacion ambiental<\/strong>, $I_d$ es la <strong>componente difusa<\/strong>, asociada a la luz dispersada uniformemente por la superficie, y $I_s$ es la <strong>componente especular<\/strong>, responsable de los reflejos caracter\u00edsticos de materiales brillantes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La iluminaci\u00f3n ambiental es simplemente una constante, que evita la oscuridad absoluta en la escena. La componente difusa $I_d$ se calcula mediante la <strong>ley de Lambert<\/strong> que establece que la intensidad observada depende del coseno del \u00e1ngulo entre l<strong>a direcci\u00f3n de la luz $\\boldsymbol{L}$<\/strong> y <strong>la normal de la superficie $\\boldsymbol{N}$<\/strong>, esto es,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$I_d = k_d\\left(\\boldsymbol{L}\\cdot\\boldsymbol{N}\\right)I_L$,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">donde $k_d$ es el <strong>coeficiente de reflexi\u00f3n difusa <\/strong>del material y $I_L$ la i<strong>ntensidad de la luz incidente<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"669\" height=\"454\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/Blinn-Phong_shading.png\" alt=\"\" class=\"wp-image-3913\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/Blinn-Phong_shading.png 669w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/Blinn-Phong_shading-300x204.png 300w\" sizes=\"(max-width: 669px) 100vw, 669px\" \/><figcaption class=\"wp-element-caption\">Vectores involucrados en el modelo Blinn-Phong. Figura obtenida de <a href=\"https:\/\/es.wikipedia.org\/wiki\/Modelo_de_reflexi%C3%B3n_de_Phong#:~:text=La%20reflexi%C3%B3n%20de%20Phong%20es,especular%20de%20las%20superficies%20brillantes.\">Wikipedia<\/a>.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">El t\u00e9rmino especular $I_s$ viene dado por,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$I_s = k_S\\left(\\boldsymbol{N}\\cdot\\boldsymbol{H}\\right)^{n_s} I_L$,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">donde $k_S$ es el <strong>coeficiente de reflexi\u00f3n especular<\/strong> del material, $n_s$ mide la <strong>concentraci\u00f3n del brillo<\/strong> y $\\boldsymbol{H}$ es el <strong>vector medio normalizado<\/strong> entre la direcci\u00f3n de la luz $\\boldsymbol{L}$ y la direcci\u00f3n del observador respecto a la superficie $\\boldsymbol{V}$,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$\\boldsymbol{H} = \\frac{\\boldsymbol{L} + \\boldsymbol{V}}{\\left\\arrowvert\\left\\arrowvert\\boldsymbol{L} + \\boldsymbol{V}\\right\\arrowvert\\right\\arrowvert}$.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Estas funciones tienen una implementaci\u00f3n bastante directa en GLSL,<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float ambient_term( float ka )\n{\n    return ka;\n}\n\nfloat diffuse_term( vec3 N, vec3 L, float kd )\n{\n    return kd * max( 0.0, dot( N, L ) );\n}\n\nfloat specular_term( vec3 N, vec3 L, vec3 V, float ks, float ns )\n{\n    vec3 H = normalize( L + V );\n    return ks * pow( max( 0.0, dot( N, H ) ), ns );\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Al elegir los colores de los objetos en nuestra escena, podemos crear algo similar a lo que se observa en la siguiente imagen. Las superficies iluminadas por nuestro sol virtual muestran un degradado que nos ayuda a intuir la posici\u00f3n de la luz. Adem\u00e1s, la esfera refleja un brillo adicional que nos sugiere que estamos frente a una superficie reflectante. Este brillo especular depende de la posici\u00f3n del observador, a diferencia del componente difuso, que se mantiene constante desde cualquier \u00e1ngulo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"794\" height=\"444\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/blinn.png\" alt=\"\" class=\"wp-image-3919\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/blinn.png 794w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/blinn-300x168.png 300w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/blinn-768x429.png 768w\" sizes=\"(max-width: 794px) 100vw, 794px\" \/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/www.shadertoy.com\/view\/tXffR7\">https:\/\/www.shadertoy.com\/view\/tXffR7<\/a><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sin embargo, hay un detalle que no se ve del todo correcto: la luz ilumina zonas que deber\u00edan estar ocultas por otros objetos de la escena. En otras palabras, los objetos <strong>no proyectan sombras<\/strong>. Esto es completamente normal, ya que el modelo de Blinn-Phong, que estamos utilizando, solo tiene informaci\u00f3n del punto donde calculamos la luz. Dicho de otro modo, se trata de un modelo de <em>primer orden<\/em>, en cierto sentido.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Afortunadamente, la t\u00e9cnica de renderizado que hemos elegido, el <strong>ray marching<\/strong>, nos permite determinar si un objeto est\u00e1 tras otro o no. Pero tiene un coste: es necesario lanzar un rayo desde cada punto de la superficie hacia la fuente de luz. Si este rayo se encuentra con otro objeto en el camino, la superficie no deber\u00eda recibir iluminaci\u00f3n. Al aplicar esto, obtenemos la siguiente imagen, donde las sombras se proyectan correctamente y la escena se ve mucho m\u00e1s realista.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"795\" height=\"445\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/blinn_shadow.png\" alt=\"\" class=\"wp-image-3923\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/blinn_shadow.png 795w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/blinn_shadow-300x168.png 300w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/blinn_shadow-768x430.png 768w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/www.shadertoy.com\/view\/w3fBz7\">https:\/\/www.shadertoy.com\/view\/w3fBz7<\/a><\/figcaption><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Esto se ejecuta cuando el primer rayo que hemos lanzado ha chocado con alguna superficie.\n\/\/ Tras ello lanzamos otro rayo hacia la luz, es decir, una rayo con \n\/\/ la direcci\u00f3n ldir, esto es, el vector L definido anteriormente.\n\/\/ Los vectores nor y view son, respectivamente, N y V.\n\/\/ Por \u00faltimo, sumamos las tres contribuciones, teniendo en cuenta la sombra.\n\nfloat shadow = trace( ro + rd * hit.x+ 0.01 * nor, ldir ).x &gt; 0.0 ? 0.0 : 1.0;\nfloat Ia = ambient_term( 0.1 );\nfloat Id = diffuse_term( nor, ldir, 1.0 );\nfloat Is = specular_term( nor, ldir, view, 0.5, 100.0 );\n\ncol = ( Id * difcol + Is * specol ) * shadow + Ia * ambcol;        <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>La ecuaci\u00f3n de renderizado<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aunque el modelo de Blinn-Phong es capaz de producir escenas <em>visualmente estimulantes<\/em> falla al intentar captar aspectos de la luz que percibimos cotidianamente. Es por ello, que con el paso del tiempo surgieron modelos con <strong>fundamentos f\u00edsicos<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este contexto, James T. Kajiya en el a\u00f1o 198<em>6 <\/em>present\u00f3 una ecuaci\u00f3n para el transporte de la luz [4]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$L_0(\\boldsymbol{x}, \\omega_0, \\lambda)=\\int_\\Omega f_r\\left(\\boldsymbol{x}, \\omega_i, \\omega_0, \\lambda\\right)L_i\\left(\\boldsymbol{x}, \\omega_i, \\lambda\\right)\\left(\\boldsymbol{n}\\cdot \\omega_i\\right)d\\omega_i$,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">que muestra c\u00f3mo la <strong>radiancia reflejada<\/strong> $L_0$<em> <\/em>de cierta longitud de onda $\\lambda$ que <strong>refleja cierto objeto<\/strong> en una direcci\u00f3n $\\omega_0$ es igual a una cierta suma <em>ponderada <\/em>sobre el hemisferio visible (definido por la normal de la superficie $\\boldsymbol{n}$) de la <strong>radiancia incidente<\/strong> $L_i$ que llega de una cierta direcci\u00f3n $\\omega_i$. Esta ecuaci\u00f3n tiene como ingrediente principal la denominada <strong>funci\u00f3n de distribuci\u00f3n de reflectancia bidireccional<\/strong> $f_r$ o <em>BRDF <\/em>que especifica las propiedades de reflexi\u00f3n del material. Resumiendo: <strong>la luz reflejada por un objeto es la suma de la que le llega, modulada por su BRDF<\/strong>. En lo que sigue, tomaremos la BRDF igual para todas las longitudes de onda.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"268\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/BRDFs-1024x268.png\" alt=\"\" class=\"wp-image-3925\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/BRDFs-1024x268.png 1024w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/BRDFs-300x78.png 300w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/BRDFs-768x201.png 768w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/BRDFs-1536x402.png 1536w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/BRDFs-1320x345.png 1320w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/BRDFs.png 1999w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em>Distintas BRDFs y su efecto en las propiedades \u00f3pticas del material<\/em>. Figura de  <a href=\"https:\/\/google.github.io\/filament\/main\/filament.html\">https:\/\/google.github.io\/filament\/main\/filament.html<\/a><em>.<\/em><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Una de las propiedades fundamentales de esta ecuaci\u00f3n es que, siempre que la BRDF cumpla<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$\\int_\\Omega f_r\\left(\\boldsymbol{x}, \\omega_i, \\omega_0, \\lambda\\right)\\left(\\boldsymbol{n}\\cdot \\omega_i\\right)d\\omega_i\\le 1$,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">tendremos una forma de <strong>conservaci\u00f3n de la energ\u00eda<\/strong>. Esta desigualdad nos indica que parte de la luz incidente es <strong>absorbida<\/strong> por el material y la reflejada no excede la que le llega.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cabe mencionar que, en esta formulaci\u00f3n, estamos dejando fuera fen\u00f3menos como la <strong>refracci\u00f3n de la luz<\/strong> al atravesar medios materiales, as\u00ed como <strong>la emisi\u00f3n propia de los objetos<\/strong>, como la incandescencia o la luminiscencia. La ecuaci\u00f3n de Kajiya se centra en el transporte y la reflexi\u00f3n de la luz incidente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Entre las diversas BRDFs que modelizan el comportamiento de materiales tenemos la <strong>lambertiana<\/strong>, que es una funci\u00f3n constante, definida por<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$f_r\\left(\\boldsymbol{x}, \\omega_i, \\omega_0, \\lambda\\right) = \\frac{\\rho}{\\pi}$,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">v\u00e1lida para una idealizaci\u00f3n de un material que refleja la misma luz en todas las direcciones. El par\u00e1metro $\\rho$ se denomina <strong>albedo difuso<\/strong> y va desde $0$ a $1$. Mide el cociente entre la luz reflejada y la luz incidente para una superficie dada. Introduciendo esta BRDF en la ecuaci\u00f3n de renderizado obtenemos,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$L_0(\\boldsymbol{x}, \\omega_0, \\lambda)=\\int_\\Omega \\frac{\\rho}{\\pi}L_i\\left(\\boldsymbol{x}, \\omega_i, \\lambda\\right)\\left(\\boldsymbol{n}\\cdot \\omega_i\\right)d\\omega_i$.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para la resoluci\u00f3n aproximada de esta ecuaci\u00f3n suele usarse el <strong>m\u00e9todo de Montecarlo<\/strong>, esto es, estimamos la integral evaluando m\u00faltiples direcciones y promediando sus contribuciones,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$L_0(\\boldsymbol{x}, \\omega_0, \\lambda)\\approx\\frac{2\\rho}{N}\\sum_{n=1}^N L_i(\\boldsymbol{x}, \\omega_n, \\lambda)\\left(\\boldsymbol{n}\\cdot\\omega_n\\right)$.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La implementaci\u00f3n de lo esbozado anteriormente, denominado <a href=\"https:\/\/en.wikipedia.org\/wiki\/Path_tracing\">path tracer<\/a>, requiere de algunos cambios en nuestro <em>ray marcher<\/em>. En particular, requiere efectuar <strong>m\u00faltiples rebotes de la luz en la escena<\/strong>. La contribuci\u00f3n a cada punto del espacio es <em>extremedamente <\/em>compleja. Por ejemplo, si tenemos un punto $\\boldsymbol{x}_a$ , la luz puede haber llegado hasta \u00e9l tras reflejarse previamente en otros puntos de la escena como $\\boldsymbol{x}_b$ y $\\boldsymbol{x}_c$ . En ese caso, pueden darse caminos como<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>$\\boldsymbol{x}_a \\rightarrow \\boldsymbol{x}_b \\rightarrow$ <strong>fuente de luz<\/strong><\/li>\n\n\n\n<li>$\\boldsymbol{x}_a \\rightarrow \\boldsymbol{x}_c \\rightarrow$ <strong>fuente de luz<\/strong><\/li>\n\n\n\n<li>$\\boldsymbol{x}_a \\rightarrow\\boldsymbol{x}_c \\rightarrow \\boldsymbol{x}_a \\rightarrow$ <strong>fuente de luz<\/strong><\/li>\n\n\n\n<li>$\\boldsymbol{x}_a \\rightarrow \\boldsymbol{x}_b \\rightarrow \\boldsymbol{x}_a \\rightarrow \\boldsymbol{x}_b \\rightarrow\\boldsymbol{x}_c \\rightarrow\\boldsymbol{x}_a \\rightarrow \\ldots \\rightarrow$ <strong>fuente de luz<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"511\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/caminos-1024x511.png\" alt=\"\" class=\"wp-image-3933\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/caminos-1024x511.png 1024w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/caminos-300x150.png 300w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/caminos-768x383.png 768w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/caminos.png 1077w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em>Caminos que contribuyen al color final del p\u00edxel<\/em>. Figura propiedad de Martin Lambers en <a href=\"https:\/\/marlam.de\/path-tracing\/course\/\">https:\/\/marlam.de\/path-tracing\/course\/<\/a><em>.<\/em><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Todos estos caminos contribuyen a la <strong>radiancia<\/strong> final que observamos en $\\boldsymbol{x}_a$ . Por tanto, para <em>programar<\/em> un path tracer el proceso ser\u00eda:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Para cada p\u00edxel, <strong>generamos un camino (<em>inverso)<\/em> de luz<\/strong>, es decir, el recorrido que har\u00eda un <em>fot\u00f3n<\/em> desde nuestro ojo hasta las <strong>fuentes de luz<\/strong>.<\/li>\n\n\n\n<li>El primer paso es encontrar el <strong>primer impacto<\/strong> (el \u00faltimo realmente) del fot\u00f3n con una superficie de la escena.<\/li>\n\n\n\n<li>Desde ah\u00ed, se calcula <strong>una direcci\u00f3n aleatoria en el hemisferio visible<\/strong> y mandamos al fot\u00f3n en esa direcci\u00f3n hasta el siguiente choque.<\/li>\n\n\n\n<li>En cada impacto, usamos la BRDF para acumular la luz reflejada y <strong>sumar su contribuci\u00f3n a la radiancia<\/strong> final.<\/li>\n\n\n\n<li>Como es <em>poco probable<\/em> que un camino aleatorio llegue directamente a la fuente de luz, se aplican t\u00e9cnicas para <strong>acelerar la convergencia<\/strong>, por ejemplo, comprobar si cada punto est\u00e1 expuesto directamente a <em>alguna<\/em> fuente de luz. De este modo, se separan de forma natural las <strong>contribuciones<\/strong> <strong>directa<\/strong> e <strong>indirecta<\/strong> a la iluminaci\u00f3n global dada por la integral.<\/li>\n\n\n\n<li>Para cada p\u00edxel, calculamos la radiancia de <strong>m\u00faltiples caminos y promediamos<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez implementado y ajustando los par\u00e1metros adecuadamente podemos ver algo as\u00ed. Lo primero que destaca al observar la imagen es que <em>no hay bordes duros<\/em> como nos pasaba en Blinn-Phong. La sombra, que era algo introducido <em>ad-hoc<\/em> en el anterior modelo, surge de una manera mucho m\u00e1s natural. Y, aunque muy s\u00fatil, podemos ver algo de <strong>transferencia de color<\/strong> de la esfera al suelo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"635\" height=\"354\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/dif_1.png\" alt=\"\" class=\"wp-image-3937\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/dif_1.png 635w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/dif_1-300x167.png 300w\" sizes=\"(max-width: 635px) 100vw, 635px\" \/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/www.shadertoy.com\/view\/w3XBWn\">https:\/\/www.shadertoy.com\/view\/w3XBWn<\/a><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">El siguiente fragmento de c\u00f3digo calcula el color final del p\u00edxel.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Para cada p\u00edxel formamos un camino de luz con varios rebotes.\nfor ( i = 0; i &lt; bounces; i++ ) {\n        vec2 res = trace( ro, rd );\n        \n        \/\/ Si nuestro rayo choca con algo, iniciamos el proceso de\n        \/\/ de interacci\u00f3n de la luz con el material\n        if ( res.x &gt; 0.0 ) \n        \n\t\t        \/\/ Actualizamos la posici\u00f3n del rayo y calculamos\n\t\t        \/\/ el vector normal a la superficie.\n            ro += rd * res.x;\n            normal = computeNormal( ro ); \n            \n            \/\/ Calculamos una nueva direcci\u00f3n en la hemiesfera visible. \n\t          \/\/ Hemos omitido la l\u00f3gica de rand_vector() para mejorar\n\t          \/\/ la lectura del c\u00f3digo. B\u00e1sicamente usamos un hash.\n\t          rand = rand_vector() - 0.5;\n            rand *= sign( dot( rand, normal ) );\n            \n            \/\/ Esta direcci\u00f3n aleatoria se convierte en nuestra nueva direcci\u00f3n\n            rd = normalize( rand );\n            \n            \/\/ Distinguimos entre los dos materiales de nuestra escena:\n            \/\/ la esfera y el suelo. Acumulamos la contribuci\u00f3n indirecta de la luz.\n            float albedo = 1.0;\n            if (res.y &lt; 1.1)\n\t\t\t\t\t\t    luminance *= albedo * vec3( 1.0, 0.5, 0.2 );\n\t\t\t\t\t\telse if (res.y &lt; 2.1)\n\t\t\t\t\t\t    luminance *= albedo * vec3( 0.75 );\n            \n            \/\/ Por seguridad, nos movemos un pel\u00edn hacia fuera de la superficie.\n            ro += normal * 0.01;\n            \n            \/\/ Aqui lanzamos un rayo hacia la fuente de luzy acumulamos\n            \/\/ la contribuci\u00f3n directa de la luz.\n            rand = rand_vector();\n            vec2 reachsun = trace( ro, normalize( ldir + 0.2 * ( rand.xyz - 0.5 ) ) );\n            float sunLight = dot( normal, ldir );\n            if (sunLight&gt; 0.0 &amp;&amp; reachsun.y &lt; 0.0 ) {\n                direct += 2.0 * luminance * sunLight;\n            }   \n        }\n        else\n        {\n\t\t        \/\/ Terminamos ajustando el valor de radiancia final\n\t\t        \/\/ para mostrarlo adecuadamente en la pantalla.\n\t\t        col = 0.4 * ( direct + luminance );\n            break;\n        }\n     }\n     \n     \/\/ Este color se acumula para cada frame y\n     \/\/ se promedia por los frames simulados.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si en lugar de un material completamente lambertiano <em>sesgamos <\/em>el camino de salida de la luz, orient\u00e1ndola hacia la <strong>direcci\u00f3n del reflejo especular<\/strong>, obtenemos algo bastante interesante.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"794\" height=\"442\" src=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/ref_1.png\" alt=\"\" class=\"wp-image-3941\" srcset=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/ref_1.png 794w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/ref_1-300x167.png 300w, https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-content\/uploads\/sites\/569\/2025\/11\/ref_1-768x428.png 768w\" sizes=\"(max-width: 794px) 100vw, 794px\" \/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/www.shadertoy.com\/view\/wXXfWn\">https:\/\/www.shadertoy.com\/view\/wXXfWn<\/a><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ese peque\u00f1o cambio en la elecci\u00f3n de las direcciones hace que la mayor\u00eda de los rayos reboten cerca del reflejo perfecto. El resultado es un material que empieza a mostrar <strong>brillos definidos<\/strong>, como si la superficie estuviera <strong>pulida<\/strong> o <strong>recubierta por una capa reflectante<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En t\u00e9rminos m\u00e1s f\u00edsicos, estamos <strong>modificando la distribuci\u00f3n de probabilidad<\/strong> con la que muestreamos la hemiesfera: en lugar de hacerlo de forma uniforme (como en Lambert), favorecemos las direcciones donde el reflejo es m\u00e1s intenso. Esto es lo que hacen modelos como el de <strong>Cook-Torrance<\/strong> [5] o de <strong>microfacetas<\/strong>, que describen la superficie como una serie de <strong>peque\u00f1os espejos<\/strong> con distintas orientaciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En resumen: espero que con esta introducci\u00f3n el lector haya podido apreciar la cantidad de f\u00edsica que interviene en el problema de simular la luz. Pero no s\u00f3lo eso: dentro del marco te\u00f3rico que marca la f\u00edsica, tambi\u00e9n buscamos <em>atajos<\/em>, intentando <strong>equilibrar la precisi\u00f3n de los modelos con la calidad percibida en la obra final<\/strong>. En el fondo, renderizar es encontrar ese punto intermedio entre lo que la f\u00edsica dicta y lo que nuestros ojos aceptan como real.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Autor: <a href=\"http:\/\/linkedin.com\/in\/josemorval\/\">Jos\u00e9 Manuel Moreno Valderrama<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jos\u00e9 Manuel Moreno Valderrama es licenciado en Matem\u00e1ticas y tiene un m\u00e1ster por la Universidad Aut\u00f3noma de Madrid. Tambi\u00e9n es graduado en F\u00edsica por la UNED. Actualmente trabaja en Remedy Entertainment como Senior Technical Artist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Referencias<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[1] <a href=\"https:\/\/kev.town\/raymarching-toolkit\/media\/enhanced_sphere_tracing.pdf\">Kornd\u00f6rfer, B. K. H. S. J., Stamminger, U. G. M., &amp; Keinert, B. (2014). Enhanced sphere tracing. <em>STAG: Smart Tools &amp; Apps for Graphics<\/em>, <em>8<\/em>(4), 1-8.<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[2] <a href=\"https:\/\/apps.dtic.mil\/sti\/tr\/pdf\/ADA008786.pdf\" data-type=\"link\" data-id=\"https:\/\/apps.dtic.mil\/sti\/tr\/pdf\/ADA008786.pdf\">B\u00f9i T. Phong (1973). Illumination for computer-generated images. Thesis.<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[3] <a href=\"https:\/\/dl.acm.org\/doi\/pdf\/10.1145\/965141.563893\">Blinn, J. F. (1977). Models of light reflection for computer synthesized pictures. In Proceedings of the 4th annual conference on Computer graphics and interactive techniques (pp. 192-198).<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[4] <a href=\"https:\/\/www.cse.chalmers.se\/edu\/year\/2011\/course\/TDA361\/2007\/rend_eq.pdf\">Kajiya, J. T. (1986). The rendering equation. In&nbsp;<em>Proceedings of the 13th annual conference on Computer graphics and interactive techniques<\/em>&nbsp;(pp. 143-150).<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[5] <a href=\"https:\/\/dl.acm.org\/doi\/pdf\/10.1145\/357290.357293\">Cook, R. L., &amp; Torrance, K. E. (1982). A reflectance model for computer graphics.&nbsp;<em>ACM Transactions on Graphics (ToG)<\/em>,&nbsp;<em>1<\/em>(1), 7-24.<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Autor: Jos\u00e9 Manuel Moreno Valderrama. Desde hace a\u00f1os, damos por supuesta la calidad visual de las producciones generadas por ordenador, ya sean pel\u00edculas o videojuegos. Las sombras que proyectan los objetos, los reflejos en espejos o la sutil transferencia de <a class=\"more-link\" href=\"https:\/\/blogs.uned.es\/hablandodefisicauned\/2025\/11\/24\/la-fisica-de-la-luz-digital\/\">Seguir leyendo &rarr;<\/a><\/p>\n","protected":false},"author":1,"featured_media":3889,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71],"tags":[141,73,99,139,105,91,145,143],"class_list":["post-3757","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-uned-es","tag-cine","tag-metodos-numericos","tag-optica","tag-programacion","tag-recursos-web","tag-salida-profesional","tag-simulaciones","tag-videojuegos"],"_links":{"self":[{"href":"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-json\/wp\/v2\/posts\/3757","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-json\/wp\/v2\/comments?post=3757"}],"version-history":[{"count":68,"href":"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-json\/wp\/v2\/posts\/3757\/revisions"}],"predecessor-version":[{"id":5013,"href":"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-json\/wp\/v2\/posts\/3757\/revisions\/5013"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-json\/wp\/v2\/media\/3889"}],"wp:attachment":[{"href":"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-json\/wp\/v2\/media?parent=3757"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-json\/wp\/v2\/categories?post=3757"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.uned.es\/hablandodefisicauned\/wp-json\/wp\/v2\/tags?post=3757"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}