00001
00002 #ifndef _TP_SAMPLER_H
00003 #define _TP_SAMPLER_H
00004
00005 #include "GLResource.h"
00006 #include "GL/GLPlatform.h"
00007
00008
00009 namespace gk {
00010
00011 class GLSampler : public GLResource
00012 {
00013
00014 GLSampler( const GLSampler& );
00015 GLSampler& operator= ( const GLSampler& );
00016
00017 protected:
00018 GLuint m_name;
00019
00020 public:
00021 GLSampler( )
00022 :
00023 m_name(0)
00024 {
00025 glGenSamplers(1, &m_name);
00026 }
00027
00028 virtual ~GLSampler( )
00029 {
00030 glDeleteSamplers(1, &m_name);
00031 }
00032
00033 int createGLResource( )
00034 {
00035 return (m_name != 0) ? 0 : -1;
00036 }
00037
00038 int releaseGLResource( )
00039 {
00040 return (m_name != 0) ? 0 : -1;
00041 }
00042
00043 GLuint name( ) const
00044 {
00045 return m_name;
00046 }
00047
00048 int bind( const unsigned int unit )
00049 {
00050 if(m_name == 0)
00051 return -1;
00052 glBindSampler(unit, m_name);
00053 return 0;
00054 }
00055
00056 int unbind( const unsigned int unit )
00057 {
00058 if(m_name == 0)
00059 return -1;
00060 glBindSampler(unit, 0);
00061 return 0;
00062 }
00063
00064 int parameter( const GLenum parameter, const int value )
00065 {
00066 if(m_name == 0)
00067 return -1;
00068 glSamplerParameteri(m_name, parameter, value);
00069 return 0;
00070 }
00071
00072 int parameter( const GLenum parameter, const float value )
00073 {
00074 if(m_name == 0)
00075 return -1;
00076 glSamplerParameterf(m_name, parameter, value);
00077 return 0;
00078 }
00079 };
00080
00081 class GLNearestSampler : public GLSampler
00082 {
00083 public:
00084 GLNearestSampler( )
00085 :
00086 GLSampler()
00087 {
00088 if(m_name == 0)
00089 return;
00090 glSamplerParameteri(m_name, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
00091 glSamplerParameteri(m_name, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
00092 glSamplerParameteri(m_name, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
00093
00094 glSamplerParameteri(m_name, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
00095 }
00096
00097 ~GLNearestSampler( ) {}
00098 };
00099
00100 class GLLinearSampler : public GLSampler
00101 {
00102 public:
00103 GLLinearSampler( )
00104 :
00105 GLSampler( )
00106 {
00107 if(m_name == 0)
00108 return;
00109 glSamplerParameteri(m_name, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
00110 glSamplerParameteri(m_name, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
00111 glSamplerParameteri(m_name, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
00112 glSamplerParameteri(m_name, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00113 }
00114
00115 ~GLLinearSampler( ) {}
00116 };
00117
00118 class GLDepthSampler : public GLSampler
00119 {
00120 public:
00121 GLDepthSampler( )
00122 :
00123 GLSampler()
00124 {
00125 if(m_name == 0)
00126 return;
00127 glSamplerParameteri(m_name, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
00128 glSamplerParameteri(m_name, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
00129 glSamplerParameteri(m_name, GL_TEXTURE_COMPARE_MODE, GL_NONE);
00130 glSamplerParameteri(m_name, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
00131
00132 glSamplerParameteri(m_name, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
00133 }
00134 };
00135
00136 }
00137
00138 #endif