Поделиться через


Синтаксис потоковой передачи

Геометрическая шейдера с потоком объявляется с определенным синтаксисом. В этом разделе описывается синтаксис. В среде выполнения эффектов этот синтаксис будет преобразован в вызов ID3D11Device::CreateGeometryShaderWithStreamOutput.

Синтаксис конструкции

[ StreamingShaderVar = ] ConstructGSWithSO( ShaderVar, "OutputDecl0" )
Имя Описание
StreamingShaderVar Необязательный. Строка ASCI, которая однозначно идентифицирует имя переменной шейдера геометрии с потоком. Это необязательно, так как КонструкторGSWithSO можно поместить непосредственно в вызов SetGeometryShader или BindInterfaces.
ШейдерВар Переменная шейдера геометрии или шейдера вершин.
OutputDecl0 Строка, определяющая, какие выходные данные шейдера в потоке 0 передаются из потока. См. ниже синтаксис.

 

Это синтаксис, определенный в fx_4_0 файлах. Обратите внимание, что в gs_4_0 и vs_x шейдерах существует только один поток данных. Результирующий шейдер выводит один поток как в единицу потока, так и в единицу растеризатора.

[ StreamingShaderVar = ] ConstructGSWithSO( ShaderVar, "OutputDecl0", "OutputDecl1", "OutputDecl2", 
"OutputDecl3", RasterizedStream )
Имя Описание
StreamingShaderVar Необязательный. Строка ASCI, которая однозначно идентифицирует имя переменной шейдера геометрии с потоком. Это необязательно, так как КонструкторGSWithSO можно поместить непосредственно в вызов SetGeometryShader или BindInterfaces.
ШейдерВар Переменная шейдера геометрии или шейдера вершин.
OutputDecl0 Строка, определяющая, какие выходные данные шейдера в потоке 0 передаются из потока. См. ниже синтаксис.
OutputDecl1 Строка, определяющая, какие выходные данные шейдера в потоке 1 передаются из потока. См. ниже синтаксис.
OutputDecl2 Строка, определяющая, какие выходные данные шейдера в потоке 2 передаются из потока 2. См. ниже синтаксис.
OutputDecl3 Строка, определяющая, какие выходные данные шейдера в потоке 3 передаются из потока 3. См. ниже синтаксис.
RasterizedStream Целое число, указывающее, какой поток будет отправлен в растризатор.

 

Обратите внимание, что gs_5_0 шейдеры могут определять до четырех потоков данных. Результирующий шейдер выводит один поток в единицу выхода потока для каждого объявления выходных данных, отличного отNULL, и одного потока единицы растризатора.

Синтаксис объявления Stream Out

" [ Buffer: ] Semantic[ SemanticIndex ] [ .Mask ]; [ ... ; ] ... [ ... ;]"
Имя Описание
буфера Необязательный. Целое число, 0 <= буфер < 4, указывающее, к какой буфер вне потока будет переходить значение.
семантические Строка, а также SemanticIndex, указывающая, какое значение следует выводить.
SemanticIndex Необязательный. Индекс, связанный с семантикой.
Маска Необязательный. Маска компонента, указывающая, какие компоненты значения следует выводить.

 

Существует одна особая семантика, помеченная как "$SKIP", которая указывает на пустую семантику, оставляя соответствующую память в буфере вне потока без изменения. Семантика $SKIP не может иметь семантику, но может иметь маску.

Все объявление потока может быть NULL.

Пример

struct GSOutput
{
int4 Pos : Position;
int4 Color : Color;
int4 Texcoord : Texcoord;
};

[maxvertexcount(1)]
void gsBase (inout PointStream<GSOutput> OutputStream, inout PointStream<GSOutput> OutputStream1)
{
GSOutput output;
output.Pos = int4(1,2,3,4);
output.Color = int4(5,6,7,8);
output.Texcoord = int4(9,10,11,12);
OutputStream.Append(output);

output.Pos = int4(1,2,3,4);
    output.Color = int4(5,6,7,8);
output.Texcoord = int4(9,10,11,12);
OutputStream1.Append(output);
};


GeometryShader pGSComp = CompileShader(gs_5_0, gsBase());
GeometryShader pGSwSO = ConstructGSWithSO(pGSComp, "0:Position.xy; 1:Position.zw; 2:Color.xy", 
                                                   "3:Texcoord.xyzw; 3:$SKIP.x;", NULL, NULL, 1);

// The following two passes perform the same operation
technique11 SOPoints
{
    pass 
    {
        SetGeometryShader(ConstructGSWithSO(pGSComp, "0:Position.xy; 1:Position.zw; 2:Color.xy", 
                                                     "3:Texcoord.xyzw; 3:$SKIP.x;", NULL, NULL, 1));
    }
    pass 
    {
        SetGeometryShader(pGSwSO);
    }
}

эффектов (Direct3D 11)