Mapping intérieur shader auto ombrage

Je bricole avec le shader intérieur de Joost van Dongen et j’essaie d’implémenter l’auto-observation. Pourtant, je ne pouvais pas tout à fait comprendre quelles coordonnées devaient être les vecteurs de lumière. Vous pouvez voir une démo qui marche un peu ici . J’ai attaché la position de la lumière avec un décalage à la position de la caméra pour voir n’a pas l’air non plus. Le code Shader est ci-dessous. Recherchez SHADOWS DEV dans le fragment shader. Les vecteurs en question sont: shad_E et shad_I .

vertex shader:

varying vec3 oP; // surface position in object space varying vec3 oE; // position of the eye in object space varying vec3 oI; // incident ray direction in object space varying vec3 shad_E; // shadow light position varying vec3 shad_I; // shadow direction uniform vec3 lightPosition; void main() { // inverse veiw masortingx mat4 modelViewMasortingxInverse = InverseMasortingx( modelViewMasortingx ); // surface position in object space oP = position; // position of the eye in object space oE = modelViewMasortingxInverse[3].xyz; // incident ray direction in object space oI = oP - oE; // link the light position to camera for testing // need to find a way for world space directional light to work shad_E = oE - lightPosition; // light vector shad_I = oP - shad_E; gl_Position = projectionMasortingx * modelViewMasortingx * vec4( position, 1.0 ); } 

fragment shader:

 varying vec3 oP; // surface position in object space varying vec3 oE; // position of the eye in object space varying vec3 oI; // incident ray direction in object space varying vec3 shad_E; // shadow light position varying vec3 shad_I; // shadow direction uniform vec3 wallFreq; uniform float wallsBias; uniform vec3 wallCeilingColor; uniform vec3 wallFloorColor; uniform vec3 wallXYColor; uniform vec3 wallZYColor; float checker(vec2 uv, float checkSize) { float fmodResult = mod( floor(checkSize * uv.x) + floor(checkSize * uv.y), 2.0); if (fmodResult < 1.0) { return 1.0; } else { return 0.85; } } void main() { // INTERIOR MAPPING by Joost van Dongen // http://interiormapping.oogst3d.net/ // email: joost@ronimo-games.com // Twitter: @JoostDevBlog vec3 wallFrequencies = wallFreq / 2.0 - wallsBias; //calculate wall locations vec3 walls = ( floor( oP * wallFrequencies) + step( vec3( 0.0 ), oI )) / wallFrequencies; //how much of the ray is needed to get from the oE to each of the walls vec3 rayFractions = ( walls - oE) / oI; //texture-coordinates of intersections vec2 intersectionXY = (oE + rayFractions.z * oI).xy; vec2 intersectionXZ = (oE + rayFractions.y * oI).xz; vec2 intersectionZY = (oE + rayFractions.x * oI).zy; //use the intersection as the texture coordinates for the ceiling vec3 ceilingColour = wallCeilingColor * checker( intersectionXZ, 2.0 ); vec3 floorColour = wallFloorColor * checker( intersectionXZ, 2.0 ); vec3 verticalColour = mix(floorColour, ceilingColour, step(0.0, oI.y)); vec3 wallXYColour = wallXYColor * checker( intersectionXY, 2.0 ); vec3 wallZYColour = wallZYColor * checker( intersectionZY, 2.0 ); // SHADOWS DEV // SHADOWS DEV // SHADOWS DEV // SHADOWS DEV // vec3 shad_P = oP; // just surface position in object space vec3 shad_walls = ( floor( shad_P * wallFrequencies) + step( vec3( 0.0 ), shad_I )) / wallFrequencies; vec3 shad_rayFr = ( shad_walls - shad_E ) / shad_I; // Cast shadow from ceiling planes (intersectionXZ) wallZYColour *= mix( 0.3, 1.0, step( shad_rayFr.x, shad_rayFr.y )); verticalColour *= mix( 0.3, 1.0, step( rayFractions.y, shad_rayFr.y )); wallXYColour *= mix( 0.3, 1.0, step( shad_rayFr.z, shad_rayFr.y )); // SHADOWS DEV // SHADOWS DEV // SHADOWS DEV // SHADOWS DEV // // intersect walls float xVSz = step(rayFractions.x, rayFractions.z); vec3 interiorColour = mix(wallXYColour, wallZYColour, xVSz); float rayFraction_xVSz = mix(rayFractions.z, rayFractions.x, xVSz); float xzVSy = step(rayFraction_xVSz, rayFractions.y); interiorColour = mix(verticalColour, interiorColour, xzVSy); gl_FragColor.xyz = interiorColour; } 

Compte tenu de ma compréhension très limitée de ce que vous essayez d’appliquer, il semblerait que vous deviez prendre l’emplacement de l’intersection entre le vecteur de l’œil et le plan intérieur qu’il frappe, puis le retracer à la lumière.

Pour remonter à la lumière, vous devez d’abord vérifier si le plan intérieur recoupé par le vecteur de l’œil est tourné vers l’arrière du sharepoint vue de la lumière, ce qui le rendrait ombre. Si elle fait face à l’avant, vous devez lancer des rayons de l’intérieur de la pièce vers la lumière et vérifier s’il y a une intersection avec l’un des autres plans intérieurs.