gpt4 book ai didi

xna - 在 XNA 上从后台缓冲区 (HLSL) 中获取顶点

转载 作者:行者123 更新时间:2023-12-02 02:36:00 24 4
gpt4 key购买 nike

您好,抱歉标题晦涩难懂:}我会尽力解释。

首先,我是 HLSL 的新手,但我了解来自童话世界的管道和东西。我想做的是使用 gpu 进行一般计算 (GPGPU)。

我不知道的是:我如何将顶点(已使用顶点着色器转换)读回我的 xna 应用程序?我读了一些关于使用 gpu 的纹理内存的东西,但我找不到任何可靠的东西......

提前感谢您提供任何信息/提示! :-)

*不确定是否可能因为光栅化器和像素着色器(如果有的话),我的意思是,最终一切都与像素有关,对吧?

最佳答案

据我所知,这通常是不可能的。

你到底想做什么?可能还有另一种解决方案

编辑::考虑到评论。如果您只想在 GPU 上进行一般矢量计算,请尝试在像素着色器而不是顶点着色器中进行计算。

例如,假设你想交叉两个向量,首先我们需要将数据写入纹理

//Data must be in the 0-1 range before writing into the texture, so you'll need to scale everything appropriately
Vector4 a = new Vector4(1, 0, 1, 1);
Vector4 b = new Vector4(0, 1, 0, 0);

Texture2D dataTexture = new Texture2D(device, 2, 1);
dataTexture.SetData<Vector4>(new Vector4[] { a, b });

现在我们已经有了一个包含数据的 2*1 纹理,只需使用 spritebatch 和效果渲染纹理:

Effect gpgpu;
gpgpu.Begin();
gpgpu.CurrentTechnique = gpgpu.Techniques["DotProduct"];
gpgpu.CurrentTechnique.Begin();
spriteBatch.Begin();
gpgpu.CurrentTechnique.Passes[0].Begin();
spriteBatch.Draw(dataTexture, new Rectangle(0,0,2,1), Color.White);
spriteBatch.end();
gpgpu.CurrentTechnique.Passes[0].End();
gpgpu.CurrentTechnique.End();

我们现在需要的是我在上面展示的 gpgpu 效果。这只是一个标准的后处理着色器,看起来像这样:

sampler2D DataSampler = sampler_state
{
MinFilter = Point;
MagFilter = Point;
MipFilter = Point;
AddressU = Clamp;
AddressV = Clamp;
};

float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 A = tex2D(s, texCoord);
float4 B = tex2D(s, texCoord + float2(0.5, 0); //0.5 is the size of 1 pixel, 1 / textureWidth
float d = dot(a, b)
return float4(d, 0, 0, 0);
}

technique DotProduct
{
pass Pass1
{
PixelShader = compile ps_3_0 PixelShaderFunction();
}
}

这会将 A 和 B 的点积写入第一个像素,将 B 和 B 的点积写入第二个像素。然后你可以把这些答案读回来(无用的忽略)

Vector4[] v = new Vector4[2];
dataTexture.GetData(v);
float dotOfAandB = v[0];
float dotOfBandB = v[1];

多多!尝试在更大范围内执行此操作会遇到很多小问题,请在此处发表评论,我会尽力帮助您解决遇到的任何问题 :)

关于xna - 在 XNA 上从后台缓冲区 (HLSL) 中获取顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1738083/

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