#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. Спасибо вам за ваш ответ, к сожалению, похоже, что это не так.