2017-02-14 18 views
0

У меня есть следующие фрагменты и вершинные шейдеры.Линейная глубина к мировому положению

Код HLSL ` // Vertex shader // ---------------------------------- -------------------------------------------------

void mainVP( 
    float4 position  : POSITION, 
    out float4 outPos : POSITION, 
    out float2 outDepth : TEXCOORD0, 
    uniform float4x4 worldViewProj, 
    uniform float4 texelOffsets, 
    uniform float4 depthRange) //Passed as float4(minDepth, maxDepth,depthRange,1/depthRange) 
{ 
    outPos = mul(worldViewProj, position); 
    outPos.xy += texelOffsets.zw * outPos.w; 
    outDepth.x = (outPos.z - depthRange.x)*depthRange.w;//value [0..1] 
    outDepth.y = outPos.w; 
} 

// Fragment shader 
void mainFP(float2 depth: TEXCOORD0, out float4 result : COLOR) { 
    float finalDepth = depth.x; 
    result = float4(finalDepth, finalDepth, finalDepth, 1); 
} 

`

Этот шейдер производит карту глубины.

Эта карта глубины затем должна использоваться для восстановления позиций мира для значений глубины. Я искал другие сообщения, но ни один из них, похоже, не хранит глубину, используя ту же формулу, которую я использую. Единственным подобным сообщением является следующее: Reconstructing world position from linear depth

Поэтому мне трудно восстановить точку, используя координаты x и y из карты глубины и соответствующей глубины.

Мне нужна помощь в построении шейдера, чтобы получить представление о мировоззрении для глубины в определенных координатах текстуры.

ответ

0

Не похоже, что вы нормализуете свою глубину. Попробуйте это вместо этого. В вашем VS, сделайте следующее:

outDepth.xy = outPos.zw;

И в вашем PS оказать глубину, вы можете сделать:

float finalDepth = depth.x/depth.y;

Вот функция, чтобы затем извлечь вид-пространственное положение определенный пиксель от вашей текстуры глубины. Я предполагаю, что вы выполняете выравнивание по вертикали и выполняете выделение позиции в пиксельном шейдере.

// Function for converting depth to view-space position 
// in deferred pixel shader pass. vTexCoord is a texture 
// coordinate for a full-screen quad, such that x=0 is the 
// left of the screen, and y=0 is the top of the screen. 
float3 VSPositionFromDepth(float2 vTexCoord) 
{ 
    // Get the depth value for this pixel 
    float z = tex2D(DepthSampler, vTexCoord); 
    // Get x/w and y/w from the viewport position 
    float x = vTexCoord.x * 2 - 1; 
    float y = (1 - vTexCoord.y) * 2 - 1; 
    float4 vProjectedPos = float4(x, y, z, 1.0f); 
    // Transform by the inverse projection matrix 
    float4 vPositionVS = mul(vProjectedPos, g_matInvProjection); 
    // Divide by w to get the view-space position 
    return vPositionVS.xyz/vPositionVS.w; 
} 

Для более продвинутого подхода, который уменьшает количество вычислений, участвующих, но включает в себя, используя view frustum и особый способ визуализации экрана выровнена четверного см here.

+0

Похоже, ваше решение не для линейной глубины. У меня есть шейдер, работающий так, как вы говорите, но мне нужно иметь еще один шейдер, работающий с линейной глубиной. – nickygs