c# - HLSL:返回一个 float4 数组?

标签 c# c++ xna hlsl

我在 HLSL 中有以下功能:

float4[] GetAllTiles(float type) {
    float4 tiles[128];
    int i=0;

    [unroll(32768)] for(int x=0;x<MapWidth;x++) {
        [unroll(32768)] for(int y=0;y<MapHeight;y++) {

            float2 coordinate = float2(x,y);
            float4 entry = tex2D(MapLayoutSampler, coordinate);
            float entryType=GetTileType(entry);
            if(entryType == type) {
                tiles[i++]=entry;
            }

        }
    }

    return tiles;
}

但是,它说它不能定义 float4[] 的返回类型。我该怎么做?

最佳答案

简而言之: 您不能返回在 HLSL 中的函数中定义的 float 组。

HLSL 代码(在 GPU 上)不像 CPU 上的 C 代码。它在许多 GPU 内核上并发执行。

HLSL 代码在每个顶点(在顶点着色器中)或每个像素(在像素着色器中)执行。因此,对于您提供给 GPU 的每个顶点,都会执行此代码。

这个 HLSL 介绍应该让您了解如何在每个像素上执行几行 HLSL 代码,从而从输入生成新图像:

http://www.neatware.com/lbstudio/web/hlsl.html

在您的示例代码中,您正在遍历整个 map ,这可能根本不是您想做的,因为您发布的函数将在输入中给定的每个像素(或顶点)处执行。

通过 HLSL 代码将您的逻辑从 CPU 传输到 GPU 可能非常困难,因为 GPU 目前并非设计用于进行通用计算。您尝试执行的任务必须非常并行,如果您希望它在 GPU 上运行得很快,那么您需要通过绘制图像和读取纹理来表达问题。

阅读我链接的教程以开始使用 HLSL :)

关于c# - HLSL:返回一个 float4 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5674459/

相关文章:

xna - XNA 中的随机纹理

c# - 计算中的符号(变量 &= 255,整数 = 4 & 19)

c# - 设置 Controller 操作超时

c# - 抑制方法的所有警告

c# - 带参数的自定义 Icomparer

c++ - 关于for循环的终止条件

c# - 如何在没有源代码链接的情况下调试 System.StackOverflowException?

c# - asp.net MVC 中的 lambda 表达式

java - C++ 全局变量与 Java 实例变量

c++ - 如何在 googlemock 中创建部分(混合)模拟?