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


Синтаксис stream out

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

Синтаксис конструирования

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

 

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

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

 

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

Синтаксис объявления stream out

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

 

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

Все объявление потоковой передачи может иметь значение 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)