Как передать результаты вычисления шейдера в вершинный шейдер без использования буфера вершин?

Прежде чем углубляться в детали, я хочу обрисовать проблему:

Я использую RWStructuredBuffers для хранения вывода моих вычислительных шейдеров (CS). Поскольку вершинные и пиксельные шейдеры могутДля чтения из RWStructuredBuffers я сопоставляю StructuredBuffer с одним и тем же слотом (u0 / t0) и (u4 / t4):

cbuffer cbWorld : register (b1) 
{
    float4x4 worldViewProj;
    int dummy;
}   

struct VS_IN
{
    float4 pos : POSITION;
    float4 col : COLOR;
};

struct PS_IN
{

    float4 pos : SV_POSITION;
    float4 col : COLOR;
};

RWStructuredBuffer colorOutputTable : register (u0);    // 2D color data
StructuredBuffer output2 :            register (t0);    // same as u0
RWStructuredBuffer counterTable :        register (u1);    // depth data for z values
RWStructuredBuffervertexTable :        register (u4);    // triangle list
StructuredBuffervertexTable2 :         register (t4);    // same as u4

Я использую ShaderRecourceView для предоставления доступа к буферам пиксельных и / или вершинных шейдеров. Эта концепция прекрасно работает для моего пиксельного шейдера, однако вершинный шейдер, похоже, читает только 0 значений (я использую SV_VertexID в качестве индекса для буферов):

PS_IN VS_3DA ( uint vid : SV_VertexID ) 
{           
    PS_IN output = (PS_IN)0; 
    PS_IN input = vertexTable2[vid];
    output.pos = mul(input.pos, worldViewProj); 
    output.col = input.col; 
    return output;
}

Нет сообщений об ошибках или предупреждений от компилятора hlsl, renderloop работает со скоростью 60 кадров в секунду (используя vsync), но экран остается черным. Так как я очищаю экран с помощью Color.White до вызова Draw (..), конвейер рендеринга кажется активным.

Когда я читаю содержимое данных треугольника через UAView из графического процессора в «vertArray» и передать его обратно в буфер вершин, все работает, однако:

Программа:

    let vertices = Buffer.Create(device, BindFlags.VertexBuffer, vertArray)
    context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, Utilities.SizeOf() * 2, 0))

HLSL:

PS_IN VS_3D (VS_IN input )
{
    PS_IN output = (PS_IN)0;    
    output.pos = mul(input.pos, worldViewProj);
    output.col = input.col; 
    return output;
}

Здесь определение 2D - Vertex / Pixelshaders. Обратите внимание, что PS_2D обращается к буферу "output2" в слоте t0 - и этос точно "трюк» что я хочу скопировать для 3D вершинного шейдераVS_3DA ":

float4 PS_2D ( float4 input : SV_Position) : SV_Target
{        
    uint2 pixel =  uint2(input.x, input.y);         
    return output2[ pixel.y * width + pixel.x]; 
}

float4 VS_2D ( uint vid : SV_VertexID ) : SV_POSITION
{
if (vid == 0)
    return float4(-1, -1, 0, 1);
if (vid == 1)
    return float4( 1, -1, 0, 1);
if (vid == 2)
    return float4(-1,  1, 0, 1);    

return float4( 1,  1, 0, 1);    
}

Три дня я искал и экспериментировал безрезультатно. Вся информация, которую я собрал, кажется, подтверждает, что мой подход с использованием тогда SV_VertexID должен работать.

Кто-нибудь может дать совет? Спасибо, что прочитали мой пост!

================================================== ===================

ПОДРОБНОСТИ:

Мне очень нравится концепция вычислительных шейдеров DirectX 11, и я хочу использовать ее для алгебраических вычислений. В качестве тестового примера я рендерил фракталы (множества Мандельброта) в 3D. Все работает как положено - кроме одного последнего кирпича в стене не хватает.

Расчет состоит из следующих шагов:

Использование CS для вычисления 2D текстуры (вывод «counterTable» а также "colorOutbutTable» (работает)

При желании визуализировать эту текстуру на экране (работает)

Использование другой CS для создания сетки (список треугольников). Эта CS берет значения x, y и цвета из шага 1, вычисляет координату z и, наконец, создает квад для каждого пикселя. Результат сохраняется в «vertexTable», (работает)

Подача списка треугольников в вершинный шейдер (проблема !!!)

Визуализация на экране (работает - с использованием буфера вершин).

Для программирования я использую F # 3.0 и SharpDX в качестве оболочки .NET. ShaderRessourceView для обоих шейдеров (пиксель и вершина) устанавливается с теми же параметрами (кроме параметров размера):

let mutable descr = new BufferDescription()     
descr.BindFlags 

Ответы на вопрос(2)

Ваш ответ на вопрос