Files
libsst/Include/ZRenderer/ZSampler.hpp
2026-04-03 00:22:39 -05:00

193 lines
5.7 KiB
C++

/*
ZSampler.hpp
Author: James Russell <jcrussell@762studios.com>
Created: 7/1/2012
Purpose:
Samplers act as a view onto a texture object, encapsulating all the filtering, mipmapping,
and addressing settings for shaders to access a texture.
TODO - A writeup here on the various settings and how they interact, or at least a link to
some place that does
License:
TODO
*/
#pragma once
#ifndef _ZSAMPLER_HPP
#define _ZSAMPLER_HPP
#include <ZRenderer/ZRendererBuild.hpp>
#include <ZRenderer/ZRendererResource.hpp>
//This should be ~log2 of ZT_MAX_TEXTURE_DIMENSION
#ifndef ZS_DEFAULT_MAX_LOD
#define ZS_DEFAULT_MAX_LOD (13.0f)
#endif
//Enumeration of sampler wrapping modes
enum ZSamplerWrapMode
{
ZSWM_CLAMP_EDGE, //Sampling beyond the edge results in the last pixel value
ZSWM_CLAMP_BORDER, //Sampling beyond the edge results in the specified border value
ZSWM_MIRROR_REPEAT, //Sampling beyond the edge wraps back in on itself
ZSWM_REPEAT, //Sampling beyond the edge wraps around to the other side
ZSWM_SIZE
};
//Enumeration of magnification sampler filtering modes
enum ZSamplerMagFilter
{
ZSMAGF_NEAREST, //Nearest mode filter
ZSMAGF_LINEAR, //Linear mode filter
ZSMAGF_SIZE
};
//Enumeration of minification sampler filtering modes
enum ZSamplerMinFilter
{
ZSMINF_NEAREST, //Nearest-neighbor pixel, no mip levels
ZSMINF_NEAREST_MIP_NEAREST, //Nearest-neighbor sampling on nearest mip level
ZSMINF_NEAREST_MIP_LINEAR, //Nearest-neighbor sampling on lerped mip level
ZSMINF_LINEAR, //Linear interpolation, no mip levels
ZSMINF_LINEAR_MIP_NEAREST, //Lerped sampling on nearest mip level
ZSMINF_LINEAR_MIP_LINEAR, //Lerped sampling on lerped mip level
ZSMINF_SIZE
};
//Enumeration of sampler comparison modes
enum ZSamplerCompareMode
{
ZSCM_COMPARE_REF_TO_TEXTURE, //Compares reference to texture
ZSCM_NONE, //No comparison
ZSCM_SIZE
};
//Enumeration of sampler comparison functions
enum ZSamplerCompareFunc
{
ZSCF_LESS_EQUAL, //Less than or equal
ZSCF_GREATER_EQUAL, //Greater than or equal
ZSCF_LESS, //Less than
ZSCF_GREATER, //Greater than
ZSCF_EQUAL, //Equal
ZSCF_NOT_EQUAL, //Not Equal
ZSCF_ALWAYS, //Always
ZSCF_NEVER, //Never
ZSCF_SIZE
};
//Struct that encapsulates the sampler state
struct ZSamplerState
{
ZSamplerWrapMode SWrapMode; //Wrapping mode for S
ZSamplerWrapMode TWrapMode; //Wrapping mode for T (unused for 1D)
ZSamplerWrapMode RWrapMode; //Wrapping mode for R (unused for 1D, 2D)
ZSamplerMinFilter MinFilter; //Minification Filter
ZSamplerMagFilter MagFilter; //Magnification Filter
float MaxAnisotropy; //Maximum Anisotropy (< 2.0 has no effect)
float MinLOD; //Minimum LOD
float MaxLOD; //Maximum LOD
float LODBias; //LOD Bias
float BorderColor[4]; //RGBA Border Color
ZSamplerCompareMode CompareMode; //Sampler Comparison Mode
ZSamplerCompareFunc CompareFunc; //Sampler Comparison Function
//Default Configuration
ZSamplerState()
: SWrapMode(ZSWM_REPEAT), TWrapMode(ZSWM_REPEAT), RWrapMode(ZSWM_REPEAT),
MinFilter(ZSMINF_LINEAR), MagFilter(ZSMAGF_LINEAR),
MaxAnisotropy(1.0), MinLOD(0), MaxLOD(ZS_DEFAULT_MAX_LOD), LODBias(0),
CompareMode(ZSCM_NONE), CompareFunc(ZSCF_ALWAYS)
{ }
};
/*
Sampler interface class.
*/
class ZSampler : public ZRendererResource
{
public:
//Virtual Destructor
virtual ~ZSampler() { }
/*
ZSampler::Get*
The following methods are getters for the various ZSampler settings
that can be set on a given sampler. For a greater explanation of each
setting and what it does, see above.
*/
//Getters for the S, T, and R Wrap Mode set on this sampler
virtual ZSamplerWrapMode GetSWrapMode() = 0;
virtual ZSamplerWrapMode GetTWrapMode() = 0;
virtual ZSamplerWrapMode GetRWrapMode() = 0;
//Getters for the minification filter and magnification filter
virtual ZSamplerMagFilter GetMagFilter() = 0;
virtual ZSamplerMinFilter GetMinFilter() = 0;
//Getters for the maximum anisotropy, minimum LOD, maximum LOD, and LOD bias
virtual float GetMaxAnisotropy() = 0;
virtual float GetMinLOD() = 0;
virtual float GetMaxLOD() = 0;
virtual float GetLODBias() = 0;
//Getter for the border color setting (four-element array, RGBA)
virtual const float* GetBorderColor() = 0;
//Getter for the comparison mode and comparison function
virtual ZSamplerCompareMode GetCompareMode() = 0;
virtual ZSamplerCompareFunc GetCompareFunc() = 0;
//Getter for the entire sampler state
virtual const ZSamplerState& GetSamplerState() = 0;
/*
ZSampler::Set*
The following methods are setters for the various ZSampler settings than
can be set on a given sampler. For a greater explanation of each setting and what it
does, see above.
If any of the setters returns false, it is because the resource is contended.
*/
//Setters for the S, T, and R wrapping modes
virtual bool SetSWrapMode(ZSamplerWrapMode _mode) = 0;
virtual bool SetTWrapMode(ZSamplerWrapMode _mode) = 0;
virtual bool SetRWrapMode(ZSamplerWrapMode _mode) = 0;
//Setters for the minification and magnification filter
virtual bool SetMagFilter(ZSamplerMagFilter _filter) = 0;
virtual bool SetMinFilter(ZSamplerMinFilter _filter) = 0;
//Setters for maximum anisotropy, minimum LOD, maximum LOD, and LOD bias
virtual bool SetMaxAnisotropy(float _max) = 0;
virtual bool SetMinLOD(float _min) = 0;
virtual bool SetMaxLOD(float _max) = 0;
virtual bool SetLODBias(float _bias) = 0;
//Setter for border color
virtual bool SetBorderColor(float _r, float _g, float _b, float _a) = 0;
//Setter for comparison mode and comparison function
virtual bool SetCompareMode(ZSamplerCompareMode _mode) = 0;
virtual bool SetCompareFunc(ZSamplerCompareFunc _func) = 0;
//Setter for entire sampler state
virtual bool SetSamplerState(const ZSamplerState& _state) = 0;
};
#endif