tutorial triangle shadertoy shaders descargar opengl glsl shader
descargar el proyecto completo

shadertoy - opengl triangle



¿Por qué funciona este Phong Shader? (1)

La razón por la que esto funciona es casualidad, pero es interesante ver por qué todavía funciona.

Phong sombreado es tres técnicas en una

Con phong shading, tenemos tres términos: specular , diffuse y ambient ; estos tres términos representan las tres técnicas utilizadas en phong shading.

Ninguno de estos términos requiere estrictamente un espacio vectorial; puede hacer que el sombreado phong funcione en espacios mundiales, locales o de cámara, siempre que sea constante. El espacio visual se usa generalmente para iluminar, ya que es más fácil trabajar con él y las conversiones son simples.

Pero, ¿y si estás en el origen? Ahora estás multiplicando por cero; es fácil ver que no hay diferencia entre ninguno de los espacios vectoriales en el origen. Por coincidencia, en el origen, no importa en qué espacio de vectores se encuentre; Funcionará

vec3 h = normalize(lightDirCameraCoords - vertexPosLocalCoords);

Tenga en cuenta que básicamente está restando 0; esta es la única vez que se usa local, y se usa en el mismo lugar donde puede causar el menor daño posible. Como el objeto está en el origen, todos sus vértices también deben estar en el origen o muy cerca de él. En origen, la aproximación es exacta; todos los espacios de vectores convergen. Muy cerca de origen, es muy cercano a lo exacto; incluso si usamos reales exactos, sería una divergencia muy pequeña, pero no usamos reales exactos, utilizamos flotadores, lo que agrava el problema.

Básicamente, tienes suerte; esto no funcionaría si el objeto no estuviera en el origen. ¡Intenta moverlo y ver!

Además, no estás usando el sombreado de Phong ; está utilizando el sombreado Blinn-Phong (ese es el nombre para el reemplazo de reflect () con un medio vector, solo como referencia).

Recientemente escribí un sombreador Phong en GLSL como parte de una tarea escolar. Empecé con tutoriales, luego jugué con el código hasta que lo puse en funcionamiento. Funciona perfectamente bien hasta donde yo sé, pero hay una línea en particular que escribí donde no entiendo por qué funciona.

El sombreador de vértices:

#version 330 layout (location = 0) in vec3 Position; // Vertex position layout (location = 1) in vec3 Normal; // Vertex normal out vec3 Norm; out vec3 Pos; out vec3 LightDir; uniform mat3 NormalMatrix; // ModelView matrix without the translation component, and inverted uniform mat4 MVP; // ModelViewProjection Matrix uniform mat4 ModelView; // ModelView matrix uniform vec3 light_pos; // Position of the light void main() { Norm = normalize(NormalMatrix * Normal); Pos = Position; LightDir = NormalMatrix * (light_pos - Position); gl_Position = MVP * vec4(Position, 1.0); }

El sombreador de fragmentos:

#version 330 in vec3 Norm; in vec3 Pos; in vec3 LightDir; layout (location = 0) out vec4 FragColor; uniform mat3 NormalMatrix; uniform mat4 ModelView; void main() { vec3 normalDirCameraCoords = normalize(Norm); vec3 vertexPosLocalCoords = normalize(Pos); vec3 lightDirCameraCoords = normalize(LightDir); float dist = max(length(LightDir), 1.0); float intensity = max(dot(normalDirCameraCoords, lightDirCameraCoords), 0.0) / pow(dist, 1.001); vec3 h = normalize(lightDirCameraCoords - vertexPosLocalCoords); float intSpec = max(dot(h, normalDirCameraCoords), 0.0); vec4 spec = vec4(0.9, 0.9, 0.9, 1.0) * (pow(intSpec, 100) / pow(dist, 1.2)); FragColor = max((intensity * vec4(0.7, 0.7, 0.7, 1.0)) + spec, vec4(0.07, 0.07, 0.07, 1.0)); }

Así que estoy haciendo el método donde se calcula el medio vector entre el vector de luz y el vector de la cámara, luego se salpica con el normal. Eso está bien. Sin embargo, hago dos cosas que son extrañas.

  1. Normalmente, todo se hace en coordenadas oculares. Sin embargo, la Posición, que paso del sombreador de vértices al sombreador de fragmentos, está en coordenadas locales.

  2. Esta es la parte que me desconcierta. En la línea vec3 h = normalize(lightDirCameraCoords - vertexPosLocalCoords); Estoy restando el vector de luz en las coordenadas de la cámara con la posición del vértice en las coordenadas locales . Esto parece completamente incorrecto.

En resumen, entiendo lo que se supone que debe hacer este código y cómo funciona el método de medio vector de phong shading.

Pero, ¿por qué funciona este código?

EDITAR: El código de inicio que se nos proporcionó es de código abierto, por lo que puede descargar el proyecto completo y mirarlo directamente si lo desea. El proyecto es para VS 2012 en Windows (deberá configurar GLEW, GLM y freeGLUT), y debería funcionar en GCC sin cambios de código (tal vez un cambio o dos en las rutas de la biblioteca de archivos).

Tenga en cuenta que en los archivos fuente, "light_pos" se llama "gem_pos", ya que nuestra fuente de luz es la pequeña joya que se mueve con WSADXC. Presione M para obtener Phong con múltiples luces.