98 lines
3.1 KiB
HLSL
98 lines
3.1 KiB
HLSL
// This file is part of the OGRE project.
|
|
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
|
// of this distribution and at https://www.ogre3d.org/licensing.
|
|
|
|
// @public-api
|
|
|
|
#if OGRE_HLSL >= 4
|
|
|
|
// SM4 separates sampler into Texture and SamplerState
|
|
|
|
#define sampler1D Sampler1D
|
|
#define sampler2D Sampler2D
|
|
#define sampler3D Sampler3D
|
|
#define samplerCUBE SamplerCube
|
|
|
|
struct Sampler1D
|
|
{
|
|
Texture1D t;
|
|
SamplerState s;
|
|
};
|
|
struct Sampler2D
|
|
{
|
|
Texture2D t;
|
|
SamplerState s;
|
|
};
|
|
struct Sampler3D
|
|
{
|
|
Texture3D t;
|
|
SamplerState s;
|
|
};
|
|
struct SamplerCube
|
|
{
|
|
TextureCube t;
|
|
SamplerState s;
|
|
};
|
|
|
|
float4 tex1D(Sampler1D s, float v) { return s.t.Sample(s.s, v); }
|
|
float4 tex2D(Sampler2D s, float2 v) { return s.t.Sample(s.s, v); }
|
|
float4 tex3D(Sampler3D s, float3 v) { return s.t.Sample(s.s, v); }
|
|
float4 texCUBE(SamplerCube s, float3 v) { return s.t.Sample(s.s, v); }
|
|
float4 texCUBElod(SamplerCube s, float4 v) { return s.t.SampleLevel(s.s, v.xyz, v.w); }
|
|
|
|
float4 tex2D(Sampler2D s, float2 v, float2 ddx, float2 ddy) { return s.t.SampleGrad(s.s, v, ddx, ddy); }
|
|
float4 tex2Dproj(Sampler2D s, float4 v) { return s.t.Sample(s.s, v.xy/v.w); }
|
|
float4 tex2Dlod(Sampler2D s, float4 v) { return s.t.SampleLevel(s.s, v.xy, v.w); }
|
|
|
|
#define SAMPLER1D(name, reg) \
|
|
Texture1D name ## Tex : register(t ## reg);\
|
|
SamplerState name ## State : register(s ## reg);\
|
|
static Sampler1D name = {name ## Tex, name ## State}
|
|
|
|
#define SAMPLER2D(name, reg) \
|
|
Texture2D name ## Tex : register(t ## reg);\
|
|
SamplerState name ## State : register(s ## reg);\
|
|
static Sampler2D name = {name ## Tex, name ## State}
|
|
|
|
#define SAMPLER3D(name, reg) \
|
|
Texture3D name ## Tex : register(t ## reg);\
|
|
SamplerState name ## State : register(s ## reg);\
|
|
static Sampler3D name = {name ## Tex, name ## State}
|
|
|
|
#define SAMPLERCUBE(name, reg) \
|
|
TextureCube name ## Tex : register(t ## reg);\
|
|
SamplerState name ## State : register(s ## reg);\
|
|
static SamplerCube name = {name ## Tex, name ## State}
|
|
|
|
// the following are not available in D3D9, but provided for convenience
|
|
struct Sampler2DShadow
|
|
{
|
|
Texture2D t;
|
|
SamplerComparisonState s;
|
|
};
|
|
struct Sampler2DArray
|
|
{
|
|
Texture2DArray t;
|
|
SamplerState s;
|
|
};
|
|
|
|
#define SAMPLER2DSHADOW(name, reg) \
|
|
Texture2D name ## Tex : register(t ## reg);\
|
|
SamplerComparisonState name ## State : register(s ## reg);\
|
|
static Sampler2DShadow name = {name ## Tex, name ## State}
|
|
|
|
#define SAMPLER2DARRAY(name, reg) \
|
|
Texture2DArray name ## Tex : register(t ## reg);\
|
|
SamplerState name ## State : register(s ## reg);\
|
|
static Sampler2DArray name = {name ## Tex, name ## State}
|
|
|
|
float tex2Dcmp(Sampler2DShadow s, float3 v) { return s.t.SampleCmpLevelZero(s.s, v.xy, v.z); }
|
|
float4 tex2DARRAY(Sampler2DArray s, float3 v) { return s.t.Sample(s.s, v); }
|
|
#else
|
|
|
|
#define SAMPLER1D(name, reg) sampler1D name : register(s ## reg)
|
|
#define SAMPLER2D(name, reg) sampler2D name : register(s ## reg)
|
|
#define SAMPLER3D(name, reg) sampler3D name : register(s ## reg)
|
|
#define SAMPLERCUBE(name, reg) samplerCUBE name : register(s ## reg)
|
|
|
|
#endif |