我正在使用带有HLSL着色器的DirectX 11进行C ++项目。
我有一个贴在某个几何体上的纹理。 几何体的每个顶点都有一个位置和一个纹理坐标。
在像素着色器中,我现在可以轻松获得这一个像素的纹理坐标。但是如何从相邻像素中采样颜色呢?
例如,对于位置为0.2 / 0的像素,我得到纹理坐标0.5 / 0,即蓝色。 但是我如何得到纹理坐标,比如说0.8 / 0?
修改
我实际实现的是使用光线投射的体积渲染器。 要渲染的体积是一组2D切片,它们是平行和对齐的,但不一定是等距的。 对于音量我使用DirectX的Texture3D类,以便轻松地在z方向进行插值。
现在,我将光线投射到体积中,并在该光线上以等距步长采样3D纹理值。 现在我的问题开始了。我不能简单地在当前光线位置对Texture3D进行采样,因为切片不一定是等距的。 所以我必须以某种方式“查找”3D空间中该位置的纹理坐标,然后使用此纹理坐标对纹理进行采样。
我已经知道如何实现这个,这将是一个相同大小的附加Texture3D,其中位置xyz处的纹素的颜色可以被解释为位置xyz处的纹理坐标。
这可以解决我的问题,但我认为这可能是矫枉过正的,可能有更简单的方法来完成同样的事情。
编辑2:
以下是我试图解决的抽样问题的另一个例子。
问题的根源是我的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}}。
我想进行光线投射,因此对于每个屏幕空间片段,我想投射光线并以不连续的步骤对体积数据集进行采样。
黑色平面象征着屏幕。其他平面是我的数据集,其中切片对齐并平行,但不是等距的。 绿线是我从屏幕投射到数据集的光线。 红色球体是我想要对数据集进行采样的位置。
DirectX知道如何正确地插入内容,就像每个屏幕空间片段一样。
我以为我可以轻松访问此插值函数并查询插值texCoord
的位置xyz。但是因为看起来DirectX没有这样做的机制。
因此,唯一的解决方案可能是使用1D纹理进行z查找,并在着色器中手动插值。 然后使用此信息查找此位置的像素值。