es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener la posición mundial a partir de InverseViewProjection proporciona resultados inexactos.

Estoy tratando de implementar efectos volumétricos dentro de un juego AAA como una modificación.
Estoy obteniendo una dirección de rayo para el raymarching utilizando la siguiente técnica:

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

donde inverseView es la matriz WorldInverseViewProjection.

El problema es que cuanto más se mueve la cámara desde el origen del mundo, más problemas de tartamudeo ocurren. Se siente como una imprecisión de los números flotantes.

También probé este método:

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

donde mProjection es la matriz de Proyección y viewInverse es la matriz InverseView.

Sin embargo, la imagen resultante se estira de manera extraña y las direcciones se invierten cuando roto sobre los ejes.

Como artista en lugar de programador, estoy perdido. ¿Podría alguien, por favor, guiarme a través de esto? ¡Gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás experimentando con el primer método se debe a la imprecisión de los números de punto flotante, lo cual puede causar cálculos incorrectos a medida que la cámara se aleja del origen del mundo. Una solución podría ser utilizar precisión doble (double) en lugar de precisión simple (float) para aumentar la precisión y reducir los errores de imprecisión. Otra solución podría ser utilizar una técnica llamada “doble buffer de profundidad”, donde se almacenan los valores de profundidad en precisión doble, lo cual puede mejorar la exactitud.

    En cuanto al segundo método, parece que el problema de estiramiento y volteo se debe a la matriz viewInverse, la cual se supone que es la inversa de la matriz de vista pero podría haber sido calculada incorrectamente. Asegúrate de estar utilizando las matrices correctas y de que estén calculadas correctamente.

    En general, se recomienda trabajar con un programador o buscar más orientación en la documentación del motor de juegos para asegurarse de que las modificaciones se implementen correctamente y de manera eficiente.

Comments are closed.