Renderowanie 2d część 3: Sampler State

Posted on Sun 11 June 2017 in OpenGL

Sampler to dość nowa rzecz w OpenGL, dostępna od wersji 3.3. Jest to taki kontener, który pozwala na przechowywanie parametrów potrzeb renderowania tekstur. Jego ustawienia są wykorzystywane przez fragment shader. W poprzednich wersjach OpenGL ustawienia te trzeba było ustawiać w teksturze przez funkcje glTexParameteri(), ale w momencie kiedy mamy do dyspozycji sampler, to używać będziemy właśnie jego. Sam interfejs klasy wygląda w następujący sposób:

enum TextureWrap
{
    REPEAT = GL_REPEAT,
    MIRRORED_REPEAT = GL_MIRRORED_REPEAT,
    CLAMP_TO_EDGE = GL_CLAMP_TO_EDGE,
    CLAMP_TO_BORDER = GL_CLAMP_TO_BORDER
};

enum TextureFilter
{
    POINT = GL_NEAREST,
    LINEAR = GL_LINEAR
};

class SamplerState
{
public:
    SamplerState(TextureWrap wrap, TextureFilter filter);
    ~SamplerState();
    void bind();
    void unbind();

    void changeFilter(TextureFilter filter);
    void changeWrap(TextureWrap wrap);
public:
    GLuint _samplerId;
};

Funkcje Bind i unbind służą do aktywowania i dezaktywacji samplera, dla danej tekstury i ich implementacje wyglądają w następujący sposób:

void SamplerState::bind()
{
    glBindSampler(0, this->_samplerId);
}

void SamplerState::unbind()
{
    glBindSampler(0, 0);
}

Do zmiany parametrów renderowania tekstur używamy natomiast poniższych funkcji:

void SamplerState::changeFilter(TextureFilter filter)
{
    glSamplerParameteri(this->_samplerId, GL_TEXTURE_MAG_FILTER, filter);
    glSamplerParameteri(this->_samplerId, GL_TEXTURE_MIN_FILTER, filter);
}

void SamplerState::changeWrap(TextureWrap wrap)
{
    glSamplerParameteri(this->_samplerId, GL_TEXTURE_WRAP_S, wrap);
    glSamplerParameteri(this->_samplerId, GL_TEXTURE_WRAP_T, wrap);
}

To tyle z elementów potrzebnych do renderowania 2D. W następnym poście zacznę od tego, że poskładamy to wszystko razem i zaimplementujemy Spritebach, który pozwoli na rysowanie 2D .