是否可以使用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”文件中有变量,但我想知道你是否也可以在那里放置方法?
答案 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文件中定义的任何内容。我使用它来保持几个着色器使用的公共文件中的光照函数,顶点类型声明等。