如何从我的计算着色器返回一个float3数组?

时间:2016-11-02 15:52:13

标签: c++ visual-studio compute-shader

基本上我正在尝试在我的计算着色器上处理光线跟踪,并且我已经测试它确实工作并正确输出任何单独的float3,我做了一个慢得多的实现,其中单个像素在GPU上呈现并复制回来每次到CPU,非常慢,但它证明了我在GPU射线追踪功能中的数学是合理的,并给出了正确的结果。

但是我输出一个float3数组很困难,因为RWStructuredBuffer让我感到困惑

这是我的RWStructuredBuffer

RWStructuredBuffer<float3> Data: register(u0);

没什么特别的,但有参考

这是我用Dispatch调用的计算着色器上的函数

groupshared uint things;
[numthreads(1, 1, 1)]
void RenderRay(uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex)
{
    float4 empty = { 0, 0, 0, 0 };
    uint offset = 0;
    float3 pixel;
    float invWidth = 1 / float(width.x), invHeight = 1 / float(height.x);
    float fov = 30, aspectratio = width.x / float(height.x);
    float angle = tan(M_PI * 0.5 * fov / 180.);
    GroupMemoryBarrierWithGroupSync();
    for (uint y = 0; y < height.x; ++y) 
    {
        if(y>0)
        offset += height.x;
        for (uint x = 0; x < width.x; ++x)
        {
            float xx = (2 * ((x + 0.5) * invWidth) - 1) * angle * aspectratio;
            float yy = (1 - 2 * ((y + 0.5) * invHeight)) * angle;
            float4 raydirection = { xx, yy, -1, 0 };
            normalize(raydirection);
            pixel = trace(empty, raydirection, 0);

            Data[0][x] = pixel;

        }
    }
    GroupMemoryBarrierWithGroupSync();

设置数据[0] =按像素实现的像素工作,因为我只需要返回一个值,但我无法达到同样的结果,试图一次输出整个图像因为我不能完全弄清楚如何将这些添加到数组中

把它写出来听起来像是一个愚蠢的问题,但尽管如此我还是很困难。

提前致谢!

0 个答案:

没有答案