gpt4 book ai didi

directx - HLSL 中的渲染深度

转载 作者:行者123 更新时间:2023-12-02 11:03:38 28 4
gpt4 key购买 nike

大家好这应该是一项简单的任务,但由于某种原因我没有解决......

我只想使用着色器获得场景中深度的可视化:

float4x4 matViewProjection;
float4x4 matWorld;
float4 eyePos;

struct VS_OUTPUT
{
float4 position : POSITION0;
float depth : TEXCOORD0;
};

VS_OUTPUT vs_main( VS_INPUT input )
{
VS_OUTPUT output;
output.position = mul( input.position, matViewProjection );

float3 posWorld = mul(input.position, matWorld);
output.depth = distance(posWorld, eyePos);
return( output );
}

为了获得深度值(或者我是这么认为的),我计算了世界空间中的位置与 View 位置之间的距离。

以及对应的像素着色器

float4 ps_main(VS_OUTPUT input) : COLOR0
{
float depth = input.depth;
return float4(depth, depth, depth, 1.0f);
}

结果只是白色

所以我开始反复试验,将一个值乘以深度:

float depth = input.depth * 0.005f;

根据到物体的距离给出令人满意的结果。因此,如果我靠近该物体,我将不得不再次调整该值。

所以有一些非常错误的事情......

感谢您的阅读!

最佳答案

你的问题是你没有在任何时候标准化深度值。它可以是 ZNear 到 ZFar 范围内的任何位置。

对您的垂直着色器尝试以下操作:

VS_OUTPUT vs_main( VS_INPUT input )
{
VS_OUTPUT output;
output.position = mul( input.position, matViewProjection );
output.depth = output.position.z / output.position.w;
return( output );
}

除以 w 后,任何有效的 Z 值都将在 0 到 1 的范围内。任何不在该范围内的 Z 值都位于截锥体之外(即在近剪裁平面之前或在远剪裁平面之后)因此无论如何都不会到达像素着色器。

关于directx - HLSL 中的渲染深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3946902/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com