着色器包括另一个着色器?

时间:2011-06-20 13:12:22

标签: xna shader

是否可以使用XNA 4在另一个着色器中包含Shader?我知道你可以在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 个答案:

答案 0 :(得分:1)

是的,从内存来看,我认为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);
    }
}

答案 1 :(得分:1)

#include的工作方式如下:

预处理器加载您的主.fx文件,并对其进行解析,查找以#开头的任何内容。 #include导致预处理器加载引用的文件并将其内容插入源缓冲区。实际上,您的#include指令将被包含文件的全部内容替换。

所以,是的,您可以在#include中定义可以在常规.fx文件中定义的任何内容。我使用它来保持几个着色器使用的公共文件中的光照函数,顶点类型声明等。