glsl与frag着色器和玩家移动的奇怪行为



im在sfml中创建了一个2d自上而下的游戏,我希望玩家只能看到45度的中心凹中的东西,目前我的碎片着色器如下

uniform sampler2D texture;
uniform vec2 pos;
uniform vec2 screenSize;
uniform float in_angle;
void main()
{
vec2 fc = gl_FragCoord.xy/screenSize;
vec2 ndcCoords = vec2(0.0);
float fov = radians(45);
ndcCoords = (pos + (screenSize/2))/screenSize;
ndcCoords.y = abs(ndcCoords.y - 1.0);
float angle = radians(-angle+90+45);
float coT;
float siT;
vec2 adj = vec2(0.0);
coT = cos(angle);
siT = sin(angle);
adj.x = coT * ndcCoords.x - siT * ndcCoords.y;
adj.y = siT * ndcCoords.x + coT * ndcCoords.y;
vec2 diff = normalize(ndcCoords - fc);
float dist = acos(dot(diff, normalize(adj)));
vec3 color = vec3(0.0f);
if(dist < fov/2)
{
color = vec3(1.0);
}
gl_FragColor = vec4(color, 1.0) * texture2D(texture, gl_TexCoord[0].xy);
}

这是在调整playerPos vec2并旋转它,这样我就可以确定玩家的fov中有什么碎片,然而,当我向下移动而不从玩家正上方移动鼠标时,fov会向左/向右移动而玩家根本不旋转,我已经尝试了我能想到的所有解决方案,但我似乎无法阻止它,也无法在网上找到解决方案。如有任何建议,将不胜感激

出现了一个解决方案,与其试图旋转对象以获得其vector2标准化的方向,一个更简单的方法是计算碎片和播放器位置之间的角度,然后通过减去以弧度表示的播放器旋转来创建差,如下所示。然后可以对坐标空间进行调整,并与玩家的进行比较

void main()
{
float fov = radians(45);
float pi = radians(180);
vec3 color = vec3(0.2);
vec2 st = gl_FragCoord.xy/screenSize.xy;
pos = (pos + (screenSize/2)) / screenSize;
float angleToObj = atan2(st.y - pos.y, st.x - pos.x);
float angleDiff = angleToObj - radians(-angle);
if(angleDiff > pi)
angleDiff -= 2.0f * pi;
if(angleDiff < -pi)
angleDiff += 2.0f * pi;
if(abs(angleDiff) < fov/2)
color = vec3(1.0f);   
gl_FragColor = vec4(color, 1.0) * texture2D(texture, gl_TexCoord[0].xy);
}

最新更新