Шейдер в том числе другой шейдер? - PullRequest
2 голосов
/ 20 июня 2011

Возможно ли с помощью XNA 4 включить шейдер в другой шейдер?Я знаю, что вы могли бы сделать это в 3.1, но у меня, похоже, проблемы с этим?Если бы вы могли, любые указатели были бы хороши.

РЕДАКТИРОВАТЬ

//---------------------------------------------------------------------------//
// Name : Rain.fx
// Desc : Rain particle effect using cylindrical billboards
// Author   : Justin Stoecker. Copyright (C) 2008-2009.
//---------------------------------------------------------------------------//

#include "common.inc"  // It's this line that causes me a problem

float4x4 matWorld;

float3 vVelocity;
float3 vOrigin;         // min point of the cube area
float fWidth;           // width of the weather region (x-axis)
float fHeight;          // height of the weather region (y-axis)
float fLength;          // length of the weather region (z-axis)

... Rest of file ...

В файле "common.inc" есть переменные, но мне было интересно, если выМогут ли там быть методы?

Ответы [ 2 ]

1 голос
/ 20 июня 2011

#include с работают так:

Препроцессор загружает ваш основной файл .fx и анализирует его, ища все, что начинается с #. #include s заставляет препроцессор загрузить указанный файл и вставить его содержимое в исходный буфер. По сути, ваша директива #include заменяется всем содержимым включенного файла.

Итак, да, вы можете определить в своих #include все, что вы можете определить в обычном .fx файле. Я использую это для хранения функций освещения, объявлений типов вершин и т. Д. В общих файлах, которые используются несколькими шейдерами.

1 голос
/ 20 июня 2011

Да, возможно, из памяти, я думаю, что пример базового примера шейдера из MS App Hub делает это.

В любом случае, см. Код ниже!

В FractalBase.fxh

float4x4 MatrixTransform : register(vs, c0);

float2 Pan;
float Zoom;
float Aspect;

float ZPower = 2;

float3 Colour = 0;
float3 ColourScale = 0;

float ComAbs(float2 Arg)
{

}

float2 ComSquare(float2 Arg)
{

}

int GreaterThan(float x, float y)
{

}

float4 GetColour(int DoneIterations, float MaxIterations, float BailoutTest, float OldBailoutTest, float BailoutFigure)
{

}

void SpriteVertexShader(inout float4 Colour    : COLOR0,
                        inout float2 texCoord : TEXCOORD0,
                        inout float4 position : SV_Position)
{
    position = mul(position, MatrixTransform);

    // Convert the position into from screen space into complex coordinates
    texCoord = (position) * Zoom * float2(1, Aspect) - float2(Pan.x, -Pan.y);
}

В FractalMandelbrot.fx

#include "FractalBase.fxh"

float4 FractalPixelShader(float2 texCoord : TEXCOORD0, uniform float Iterations) : COLOR0
{

}

technique Technique1
{
    pass
    {
        VertexShader = compile vs_3_0 SpriteVertexShader();
        PixelShader = compile ps_3_0 FractalPixelShader(128);
    }
}
...