1 #ifndef INCLUDE_AL_GRAPHICS_SHADER_HPP
2 #define INCLUDE_AL_GRAPHICS_SHADER_HPP
50 #include <unordered_map>
51 #include "al/graphics/al_GPUObject.hpp"
52 #include "al/math/al_Mat.hpp"
53 #include "al/math/al_Quat.hpp"
54 #include "al/math/al_Vec.hpp"
55 #include "al/types/al_Color.hpp"
57 #define AL_SHADER_MAX_LOG_SIZE 4096
68 const char *
log()
const;
74 virtual void get(
int pname,
void *params)
const = 0;
75 virtual void getLog(
char *buf)
const = 0;
85 enum Type { VERTEX, GEOMETRY, FRAGMENT };
87 Shader(
const std::string &source =
"", Shader::Type type = FRAGMENT);
93 Shader &source(
const std::string &v);
94 Shader &source(
const std::string &v, Shader::Type type);
96 bool compiled()
const;
98 Shader::Type type()
const {
return mType; }
104 virtual void get(
int pname,
void *params)
const;
105 virtual void getLog(
char *buf)
const;
107 virtual void onCreate();
108 virtual void onDestroy();
179 bool compile(
const std::string &vertSource,
const std::string &fragSource,
180 const std::string &geomSource =
"");
212 void uniform4f(
int loc,
float v0,
float v1,
float v2,
float v3)
const;
213 void uniformMat4f(
int loc,
float *data)
const;
218 return uniform(loc,
float(v));
220 const ShaderProgram &uniform(
int loc,
float v0,
float v1)
const;
221 const ShaderProgram &uniform(
int loc,
float v0,
float v1,
float v2)
const;
222 const ShaderProgram &uniform(
int loc,
float v0,
float v1,
float v2,
224 const ShaderProgram &uniform4v(
int loc,
const float *v,
int count = 1)
const;
226 template <
typename T>
227 const ShaderProgram &uniform(
int loc,
const Vec<2, T> &v)
const {
228 return uniform(loc, v.x, v.y);
230 template <
typename T>
231 const ShaderProgram &uniform(
int loc,
const Vec<3, T> &v)
const {
232 return uniform(loc, v.x, v.y, v.z);
234 template <
typename T>
235 const ShaderProgram &uniform(
int loc,
const Vec<4, T> &v)
const {
236 return uniform(loc, v.x, v.y, v.z, v.w);
238 const ShaderProgram &uniformMatrix3(
int loc,
const float *v,
239 bool transpose =
false)
const;
240 const ShaderProgram &uniformMatrix4(
int loc,
const float *v,
241 bool transpose =
false)
const;
242 const ShaderProgram &uniform(
int loc,
const Mat<4, float> &m)
const {
243 return uniformMatrix4(loc, m.elems());
245 template <
typename T>
246 const ShaderProgram &uniform(
int loc,
const Mat<4, T> &m)
const {
247 return uniform(loc,
Mat4f(m));
250 const ShaderProgram &uniform(
const char *name,
int v)
const;
251 const ShaderProgram &uniform(
const char *name,
float v)
const;
252 const ShaderProgram &uniform(
const char *name,
double v)
const {
253 return uniform(name,
float(v));
255 const ShaderProgram &uniform(
const char *name,
float v0,
float v1)
const;
256 const ShaderProgram &uniform(
const char *name,
float v0,
float v1,
258 const ShaderProgram &uniform(
const char *name,
float v0,
float v1,
float v2,
261 template <
typename T>
262 const ShaderProgram &uniform(
const char *name,
const Vec<2, T> &v)
const {
263 return uniform(name, v.x, v.y);
266 template <
typename T>
267 const ShaderProgram &uniform(
const char *name,
const Vec<3, T> &v)
const {
268 return uniform(name, v.x, v.y, v.z);
271 template <
typename T>
272 const ShaderProgram &uniform(
const char *name,
const Vec<4, T> &v)
const {
273 return uniform(name, v.x, v.y, v.z, v.w);
276 const ShaderProgram &uniform(
const char *name,
const Mat<4, float> &m,
277 bool transpose =
false)
const {
278 return uniformMatrix4(name, m.elems(), transpose);
281 template <
typename T>
282 const ShaderProgram &uniform(
const char *name,
const Mat<4, T> &m,
283 bool transpose =
false)
const {
284 return uniform(name,
Mat4f(m), transpose);
287 template <
typename T>
288 const ShaderProgram &uniform(
const char *name,
const Quat<T> &q)
const {
290 return uniform(name, q.x, q.y, q.z, q.w);
293 const ShaderProgram &uniform1(
const char *name,
const float *v,
294 int count = 1)
const;
295 const ShaderProgram &uniform2(
const char *name,
const float *v,
296 int count = 1)
const;
297 const ShaderProgram &uniform3(
const char *name,
const float *v,
298 int count = 1)
const;
299 const ShaderProgram &uniform4(
const char *name,
const float *v,
300 int count = 1)
const;
302 const ShaderProgram &uniformMatrix3(
const char *name,
const float *v,
303 bool transpose =
false)
const;
304 const ShaderProgram &uniformMatrix4(
const char *name,
const float *v,
305 bool transpose =
false)
const;
307 const ShaderProgram &
attribute(
int loc,
float v)
const;
308 const ShaderProgram &
attribute(
int loc,
float v0,
float v1)
const;
309 const ShaderProgram &
attribute(
int loc,
float v0,
float v1,
float v2)
const;
310 const ShaderProgram &
attribute(
int loc,
float v0,
float v1,
float v2,
313 const ShaderProgram &
attribute(
const char *name,
float v)
const;
314 const ShaderProgram &
attribute(
const char *name,
float v0,
float v1)
const;
315 const ShaderProgram &
attribute(
const char *name,
float v0,
float v1,
317 const ShaderProgram &
attribute(
const char *name,
float v0,
float v1,
float v2,
320 const ShaderProgram &attribute1(
const char *name,
const float *v)
const;
321 const ShaderProgram &attribute2(
const char *name,
const float *v)
const;
322 const ShaderProgram &attribute3(
const char *name,
const float *v)
const;
323 const ShaderProgram &attribute4(
const char *name,
const float *v)
const;
324 const ShaderProgram &attribute1(
int loc,
const double *v)
const;
325 const ShaderProgram &attribute2(
int loc,
const double *v)
const;
326 const ShaderProgram &attribute3(
int loc,
const double *v)
const;
327 const ShaderProgram &attribute4(
int loc,
const double *v)
const;
329 template <
typename T>
330 const ShaderProgram &
attribute(
int loc,
const Vec<2, T> &v)
const {
333 template <
typename T>
334 const ShaderProgram &
attribute(
int loc,
const Vec<3, T> &v)
const {
337 template <
typename T>
338 const ShaderProgram &
attribute(
int loc,
const Vec<4, T> &v)
const {
339 return attribute(loc, v.x, v.y, v.z, v.w);
341 template <
typename T>
342 const ShaderProgram &
attribute(
int loc,
const Quat<T> &q)
const {
344 return attribute(loc, q.x, q.y, q.z, q.w);
347 static void use(
unsigned programID);
352 std::string mVertSource, mFragSource, mGeomSource;
353 mutable std::unordered_map<std::string, int> mUniformLocs, mAttribLocs;
356 virtual void get(
int pname,
void *params)
const;
357 virtual void getLog(
char *buf)
const;
void destroy()
Destroys object on GPU.
void printLog() const
Prints info log, if any.
const char * log() const
Returns info log or 0 if none.
const ShaderProgram & detach(const Shader &s) const
Detach shader from program.
const ShaderProgram & link(bool doValidate=true) const
Link attached shaders.
virtual void onCreate()
Called when currently assigned context is created.
void end() const
End use of shader program.
bool validateProgram(bool printLog=false) const
Returns whether linked program can execute in current graphics state.
@ SAMPLER_1D
A 1D texture.
@ BOOL3
Three bool values.
@ SAMPLER_CUBE
A cubemap texture.
@ FLOAT
A single float value.
@ SAMPLER_RECT
A rectangular texture.
@ BOOL
A single bool value.
@ SAMPLER_2D_SHADOW
A 2D depth texture.
@ VEC3
Three float values.
@ SAMPLER_1D_SHADOW
A 1D depth texture.
@ SAMPLER_2D
A 2D texture.
@ SAMPLER_3D
A 3D texture.
int attribute(const char *name) const
Get location of attribute.
virtual ~ShaderProgram()
Any attached shaders will automatically be detached, but not deleted.
ShaderProgram & attach(Shader &s)
Attach shader to program.
void begin()
Begin use of shader program.
void listParams() const
Print out all the input parameters to the shader.
bool linked() const
Returns whether program linked successfully.
bool compile(const std::string &vertSource, const std::string &fragSource, const std::string &geomSource="")
Compile and link shader sources.
int getUniformLocation(const char *name) const
Get location of uniform.
virtual void onDestroy()
Called when currently assigned context is destroyed.
Mat< 4, float > Mat4f
float 4x4 matrix
float components[4]
RGBA component vector.