如何从HLSL中的任意位置获取纹理坐标

时间:2014-11-27 12:01:48

标签: c++ directx hlsl texture-mapping

enter image description here

我正在使用带有HLSL着色器的DirectX 11进行C ++项目。

我有一个贴在某个几何体上的纹理。 几何体的每个顶点都有一个位置和一个纹理坐标。

在像素着色器中,我现在可以轻松获得这一个像素的纹理坐标。但是如何从相邻像素中采样颜色呢?

例如,对于位置为0.2 / 0的像素,我得到纹理坐标0.5 / 0,即蓝色。 但是我如何得到纹理坐标,比如说0.8 / 0?

修改

我实际实现的是使用光线投射的体积渲染器。 要渲染的体积是一组2D切片,它们是平行和对齐的,但不一定是等距的。 对于音量我使用DirectX的Texture3D类,以便轻松地在z方向进行插值。

现在,我将光线投射到体积中,并在该光线上以等距步长采样3D纹理值。 现在我的问题开始了。我不能简单地在当前光线位置对Texture3D进行采样,因为切片不一定是等距的。 所以我必须以某种方式“查找”3D空间中该位置的纹理坐标,然后使用此纹理坐标对纹理进行采样。

我已经知道如何实现这个,这将是一个相同大小的附加Texture3D,其中位置xyz处的纹素的颜色可以被解释为位置xyz处的纹理坐标。

这可以解决我的问题,但我认为这可能是矫枉过正的,可能有更简单的方法来完成同样的事情。

编辑2:

以下是我试图解决的抽样问题的另一个例子。

enter image description here

问题的根源是我的Texture3D在z方向上失真。

在一个像素单元实例中,我希望获得卷中任意给定位置xyz的纹理坐标,而不仅仅是正在渲染的当前片段。

编辑3:

感谢所有好评和建议。

z序列中切片之间的距离可以是完全随机的,因此它们不能通过函数在数学上描述。 所以我基本上有一个非常简单的类,例如

struct Vertex
{
  float4 Position; // position in space
  float4 TexCoord; // position in dataset
}

我将这些对象传递给顶点着色器的缓冲区。 在那里,值只是传递给像素着色器。 我的插值设置为D3D11_FILTER_MIN_MAG_MIP_LINEAR所以我得到了一个很好的插值我的数据和相应的纹理坐标。 我的像素着色器的签名如下所示:

float4 PShader( float4 position : SV_POSITION
              , float4 texCoord : TEXCOORD
              ) : SV_TARGET
{
  ...
}

因此,对于要在屏幕上呈现的每个片段,我获得空间中的位置(position)和(插值的)数据集中的相应位置(texCoord)。到目前为止一切都很好。

现在,从这个PShader实例,我不仅要访问texCoord的{​​{1}},还要访问其他position的{​​{1}}。

我想进行光线投射,因此对于每个屏幕空间片段,我想投射光线并以不连续的步骤对体积数据集进行采样。

enter image description here

黑色平面象征着屏幕。其他平面是我的数据集,其中切片对齐并平行,但不是等距的。 绿线是我从屏幕投射到数据集的光线。 红色球体是我想要对数据集进行采样的位置。

DirectX知道如何正确地插入内容,就像每个屏幕空间片段一样。

我以为我可以轻松访问此插值函数并查询插值texCoord的位置xyz。但是因为看起来DirectX没有这样做的机制。

因此,唯一的解决方案可能是使用1D纹理进行z查找,并在着色器中手动插值。 然后使用此信息查找此位置的像素值。

0 个答案:

没有答案