gpt4 book ai didi

three.js - 内部映射着色器自阴影

转载 作者:行者123 更新时间:2023-12-02 16:54:48 25 4
gpt4 key购买 nike

我正在修改 Joost van Dongen 的 Interior mapping shader我正在尝试实现 self 阴影。我仍然不太清楚阴影转换光矢量需要位于什么坐标。您可以看到一些工作演示 at here我将灯光位置与相机位置有一定的偏移,只是为了看看发生了什么,但显然它看起来也不正确。着色器代码如下。在片段着色器中查找 SHADOWS DEV。有问题的向量是: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;

}

最佳答案

根据我对您要实现的内容的非常有限的理解,您似乎需要获取眼睛矢量与其所击中的内部平面之间的交点位置,然后将其追溯到光线。

要追溯到光线,您首先必须检查与眼睛矢量相交的内部平面从光线的角度来看是否是背向的,这会使其处于阴影中。如果它是朝前的,那么您必须从房间内向灯光转换光线,并检查与任何其他内部平面的相交。

关于three.js - 内部映射着色器自阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22472455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com