Получение мирового положения из проекта inverseviewproject дает неточные результаты

#matrix #hlsl

#матрица #hlsl

Вопрос:

Я пытаюсь реализовать некоторые объемные эффекты внутри игры triple A в качестве модификации. Я получаю направление луча для раймонда, используя следующую технику:

 uv.y = 1-uv.y; float2 p = uv * 2 - 1;   float4 scc = float4(p,0.0,1.0); float4 wc = mul(scc, inverseView); wc /= wc.w; float3 rd = normalize(wc.xyz - ro);  

где inverseView-матрица проекций worldinverseviewproject.

Проблема в том, что чем дальше камера удаляется от источника света, тем больше возникает заикание. Это похоже на неточность в плавании.

Я также попробовал этот метод:

 float4 DepthToViewPos(float depth, float2 texCoord){  float x = texCoord.x * 2 - 1;  float y = texCoord.y * 2 - 1;   float2 screenSpaceRay = float2( x / mProjection[0].x, y / mProjection[1].y);  screenSpaceRay *= depth;  float4 pos = float4(screenSpaceRay, depth, 1.0);    return pos; }  float3 DepthToWorldPos(float depth, float2 texCoord){  float4 pos = DepthToViewPos(depth, texCoord);  pos = mul(pos, viewInverse);    return pos.xyz; }  float3 wPos = DepthToWorldPos(depth, uv);  float3 raydir = normalize(cameraPos - wPos.xyz);  

где mProjection — матрица проекции, а viewInverse-матрица обратного просмотра.

Однако полученное изображение странно растягивается, и направления меняются, когда я вращаюсь по осям.

Как художник, а не программист, я заблудился, не мог бы кто-нибудь, пожалуйста, провести меня через это? Спасибо!

Комментарии:

1. Своего рода дикое предположение, а что, если ты это сделаешь float3 rayOrigin = mul(float4(p,0.0,1.0), inverseView).xyz; float3 rayDir = normalize(mul(float4(p,1.0,1.0), inverseView).xyz - rayOrigin); ?

2. Спасибо вам за ваш ответ, к сожалению, похоже, что это не так.