【发布时间】:2014-03-17 03:01:19
【问题描述】:
我想知道如何对传递给着色器文件的数据进行实际采样。我使用了两种方法,两者都一样吗?是否有任何在线资源可供我实际阅读此类内容?
在 5.0 编译,但版本号并不重要。
我有两种方法来传递数据。
第一个;
for( UINT row = 0; row < textureDesc.Height; row++ )
{
UINT rowStart = row * mappedResource.RowPitch;
for( UINT col = 0; col < textureDesc.Width; col++ )
{
//width * number of channels (r,g,b,a)
UINT colStart = col * 4;
pTexels[rowStart + colStart + 0] = 10.0f; // Red
pTexels[rowStart + colStart + 1] = 10.0f; // Green
pTexels[rowStart + colStart + 2] = 255.0f; // Blue
pTexels[rowStart + colStart + 3] = 255.0f; // Alpha
}
}
第二个;
float elements[416][416];
int elementsCount = 416*416;
for( int i = 0; i < 416; i++ )
{
for( int k = 0; k < 416; k++ )
{
elements[i][k] = 0;
}
}
memcpy(mappedResource.pData, elements, sizeof(float) * elementsCount);
【问题讨论】:
-
贴图好像是手动创建的,如果要简化流程,为什么不把它和文件一样用DirectX加载呢?
-
@Dino (1) 着色器中的采样并不关心您将数据复制到纹理中的准确程度。因此,如果您以不同的方式复制相同的数据,对于 HLSL 来说都是一样的。 (2) 不太清楚您要阅读的内容。您只需要样本纹理吗?然后使用
Texture.Sample(Sampler, texcoord)。您需要采样教程吗? google 上有很多内容。请准确回答您的问题以获得有意义的答案。 -
zdd 我需要手动创建,每帧都会更新。 @Drop我可以简单地对其进行采样,它会知道它包含一个浮点数?即使这些浮点数是使用 memcpy 设置的?我的问题实际上是如何访问着色器文件中的数据。所以要获得 element[x][y] 它将是 float val = Texture.Sample(Texture, texcoord)?我只是不确定 GPU 将如何解释纹理中的数据或预期的数据,所以我不确定如何在着色器文件中读取它。
-
采样在很多方面都不同于数组访问。如果您查看了上面的链接,您会看到 Texture.Sample(Texture, texcoord) 将根据创建纹理时使用的 DXGI_FORMAT 返回类型值。将纹理用作数组时存在一些问题。如果您需要在 HLSL 方面有点像 C 数组,请使用
StructuredBuffers(需要 SM 5.0,仅限 SM 4.0)。 -
@Drop 我在阅读链接之前回复了它,我已经阅读了我传递给我只是忘记回复的纹理的数据。 StructuredBuffers 是否比用作数组的采样纹理更有效? - 作为旁注感谢所有的帮助。
标签: directx shader hlsl directx-11