内部映射着色器自我阴影

我正在修改Joost van Dongen的内部映射着色器 ,我试图实现自我阴影。 我仍然无法弄清楚阴影投射光vector所需要的坐标。您可以在这里看到有些工作演示,我已经将光位置与相机位置的偏移连接起来,以查看发生了什么,但是显然它没有看起来也不错。 着色器代码如下。 在片段着色器中查找SHADOWS DEV。 有问题的vector是: shad_Eshad_I

顶点着色器:

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 matrix mat4 modelViewMatrixInverse = InverseMatrix( modelViewMatrix ); // surface position in object space oP = position; // position of the eye in object space oE = modelViewMatrixInverse[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 = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); } 

片段着色器:

 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; } 

基于我对你想要实现的东西的理解非常有限,看起来你需要把眼睛向量和它所碰到的内部平面的相交位置,然后追踪到光线。

要追溯到光线,首先必须检查与眼睛vector相交的内部平面是否背离光线的视angular,这会使其处于阴影中。 如果是朝前,那么你必须从房间内光线投射到光线,并检查与任何其他内部飞机的交叉点。

Interesting Posts