]> git.tdb.fi Git - libs/gl.git/commitdiff
Update and improve documentation
authorMikko Rasa <tdb@tdb.fi>
Sat, 30 Oct 2021 19:51:30 +0000 (22:51 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sat, 30 Oct 2021 22:28:13 +0000 (01:28 +0300)
66 files changed:
shaderlib/cooktorrance.glsl
source/core/batch.h
source/core/blend.h
source/core/buffer.h
source/core/bufferable.h
source/core/color.h
source/core/commands.h
source/core/datatype.h
source/core/deviceinfo.h
source/core/framebuffer.h
source/core/frameformat.h
source/core/mesh.h
source/core/module.h
source/core/pipelinestate.h
source/core/pixelformat.h
source/core/program.h
source/core/query.h
source/core/sampler.h
source/core/texture.h
source/core/texture1d.h
source/core/texture2d.h
source/core/texture2darray.h
source/core/texture2dmultisample.h
source/core/texture3d.h
source/core/texturecube.h
source/core/uniformblock.h
source/core/vertexarray.h
source/core/vertexformat.h
source/core/vertexsetup.h
source/effects/ambientocclusion.h
source/effects/bloom.h
source/effects/colorcurve.h
source/effects/effect.h
source/effects/environmentmap.h
source/effects/postprocessor.h
source/effects/shadowmap.h
source/effects/sky.h
source/glsl/optimize.h
source/materials/basicmaterial.h
source/materials/light.h
source/materials/lighting.h
source/materials/material.h
source/materials/pbrmaterial.h
source/materials/pointlight.h
source/materials/rendermethod.h
source/materials/unlitmaterial.h
source/render/camera.h
source/render/instancearray.h
source/render/object.h
source/render/objectinstance.h
source/render/occludedscene.h
source/render/offscreenview.h
source/render/orderedscene.h
source/render/placeable.h
source/render/programdata.h
source/render/renderable.h
source/render/renderer.h
source/render/rendertarget.h
source/render/scene.h
source/render/sequence.h
source/render/simplescene.h
source/render/text.h
source/render/view.h
source/render/windowview.h
source/render/zsortedscene.h
source/resources/resources.h

index d8e07b292e4e2ecdaa434875ef21f0f7cd1eec72..ff1a56c7c237e240ebd7cb4c69df8a7ce24a36ba 100644 (file)
@@ -74,7 +74,8 @@ virtual vec3 get_emission_color()
 /* Computes the diffuse reflection of the macrosurface */
 vec3 lambert_diffuse(vec3 base_color)
 {
-       // Scale by pi to get a result per steradian, suitable for integration
+       /* Scale by pi (cosine-weighted area of a hemisphere) because the light
+       scatters in every direction */
        return base_color/PI;
 }
 
index 1e0b4c4703e74b09602575b6f3fa206bfc746bdf..45101d4356672950dc9439a5401ed1a3311bc307 100644 (file)
@@ -14,12 +14,12 @@ namespace GL {
 class Buffer;
 
 /**
-Stores primitive type and element indices for a single GL draw call.  Data
-type for indices is automatically chosen to accommodate the largest index in
-the Batch.
+Stores primitive type and element indices for a single draw call.
 
-This is a pretty low-level class and mainly intended to be used by the Mesh
-class.
+Data type for indices is automatically chosen to accommodate the largest
+index, but can also be manually overridden.
+
+Batches are normally contained in a Mesh.
 */
 class Batch: public BatchBackend, public Bufferable
 {
@@ -39,17 +39,32 @@ private:
        unsigned max_index;
 
 public:
-       Batch(PrimitiveType t);
+       Batch(PrimitiveType);
        ~Batch();
 
        PrimitiveType get_type() const { return prim_type; }
+
+       /** Sets the data type for indices.  Allowed types are UNSIGNED_SHORT and
+       UNSIGNED_INT.  It's an error to specify a type which can't hold the current
+       range of index values. */
        void set_index_type(DataType);
+
        DataType get_index_type() const { return index_type; }
 
+       /** Appends a single index.  The data type is automatically adjusted if the
+       index is too large for the current data type. */
        Batch &append(unsigned);
+
        Batch &append(const std::vector<unsigned> &);
+
+       /** Checks if it's possible to append another Batch with a given primitive
+       type. */
        bool can_append(PrimitiveType);
+
+       /** Appends another batch.  Additional indices may be inserted in order to
+       join the primitives. */
        Batch &append(const Batch &);
+
 private:
        void append_index(unsigned);
        virtual std::size_t get_data_size() const { return data.size(); }
index 1d39b08fd30b586ba8889b402310ffbb13aae9c5..da7c8c7f266b1d08a26b95fc525a73fb1940336a 100644 (file)
@@ -46,7 +46,7 @@ enum ColorWriteMask
 };
 
 /**
-Blends incoming fragments with those already in the framebuffer.
+Blends incoming fragment color values with those already in the framebuffer.
 */
 struct Blend
 {
index 810bfc1a56253e181f7cc55b5d228c3441e99fee..b642738e0e96ef370a5e748701be071998e2de54 100644 (file)
@@ -16,9 +16,14 @@ public:
 };
 
 /**
-A buffer for storing data in GL memory.  Putting vertex and index data in
-buffers can improve rendering performance.  The VertexArray, Mesh and
-UniformBlock classes contain built-in support for buffers.
+Stores data in GPU memory.
+
+Memory must be allocated for the buffer by calling storage().  Contents can
+then be modified either synchronously with the data() and sub_data() functions,
+or asynchronously by memory-mapping the buffer.
+
+Applications normally don't need to deal with Buffers directly.  They're
+managed by other classes such as Mesh and ProgramData.
 */
 class Buffer: public BufferBackend
 {
@@ -28,17 +33,16 @@ private:
        std::size_t size = 0;
 
 public:
-       /** Defines the storage size of the buffer.  Must be called before data can
-       be uploaded.  Storage cannot be changed once set. */
+       /** Sets the storage size and allocates memory for the buffer.  Size cannot
+       be changed once set. */
        void storage(std::size_t);
 
-       /** Uploads data into the buffer, completely replacing any previous
-       contents.  Storage must be defined beforehand.  The data must have size
-       matching the defined storage. */
+       /** Replaces contents of the entire buffer.  Allocated storage must exist.
+       The data must have size matching the defined storage. */
        void data(const void *);
 
-       /** Overwrites part of the buffer data with new data.  Storage must be
-       defined beforehand. */
+       /** Replaces a range of bytes in the buffer.  Allocated storage must exist.
+       The range must be fully inside the buffer. */
        void sub_data(std::size_t, std::size_t, const void *);
 
        std::size_t get_size() const { return size; }
index 60ce307292d900f3d5df4e01b6df412f80e778e5..4a4114d0ce683483717eee9baf0770e3b7ab7c4b 100644 (file)
@@ -7,7 +7,9 @@ namespace GL {
 class Buffer;
 
 /**
-Base class for things that can store data in buffers.  Supports buffer sharing.
+Base class for things that can store data in buffers.  Multiple Bufferables
+may be put in the same buffer.
+
 A dirty flag is provided for derived classes.  It should be set when the data
 in the buffer is considered out of date, and is cleared by Bufferable after
 uploading fresh data to the buffer.
@@ -15,6 +17,11 @@ uploading fresh data to the buffer.
 class Bufferable
 {
 public:
+       /**
+       Uploads data to the buffer asynchronously, through a memory mapping.  API
+       calls are done in the constructor and desctructor, so upload_data may be
+       called from a different thread.
+       */
        class AsyncUpdater
        {
        private:
@@ -42,21 +49,23 @@ public:
        virtual ~Bufferable();
 
        /** Sets the buffer to use.  If prev is not null, it must use the same
-       buffer, and this object is inserted after it. */
-       void use_buffer(Buffer *buf, Bufferable *prev = 0);
+       buffer, and this object is inserted after it.
+
+       Date is not uploaded immediately, but only when refresh() is called. */
+       void use_buffer(Buffer *, Bufferable *prev = 0);
 
        /** Sets the buffer for the entire chain of objects. */
        void change_buffer(Buffer *);
 
        /** Returns the total amount of storage required by this object and others
-       in the same chain, including any alignment between objects. */
+       in the same chain, including any padding required by object alignment. */
        std::size_t get_required_buffer_size() const;
 
        /** Uploads new data into the buffer if necessary. */
        void refresh() const { if(dirty) upload_data(0); }
 
        /** Returns an object which can be used to upload data to the buffer using
-       mapped memory. */
+       mapped memory.  If data is not dirty, returns null. */
        AsyncUpdater *refresh_async() const { return dirty ? new AsyncUpdater(*this) : 0; }
 
 private:
@@ -70,11 +79,11 @@ public:
        virtual std::size_t get_data_size() const = 0;
 
 protected:
-       /** Returns a pointer to the start of data in client memory. */
+       /** Returns a pointer to the start of the data in client memory. */
        virtual const void *get_data_pointer() const = 0;
 
-       /** Returns the alignment required for the data, in bytes.  The offset is
-       guaranteed to be a multiple of this. */
+       /** Returns the alignment required for the data, in bytes.  The offset
+       within the buffer is guaranteed to be a multiple of the alignment. */
        virtual std::size_t get_alignment() const { return 1; }
 
        /** Updates the offsets for the chain so that data from different objects
index e376e3308bfed081d9e192dfecc100d7047874bb..999960ed7179147c8f8cefb293ee6d57720e336d 100644 (file)
@@ -23,6 +23,7 @@ struct Color
        Color(float v): r(v), g(v), b(v) { }
        Color(float r_, float g_, float b_): r(r_), g(g_), b(b_) { }
        Color(float r_, float g_, float b_, float a_): r(r_), g(g_), b(b_), a(a_) { }
+
        Color operator*(float f) const { return Color(r*f, g*f, b*f, a); }
        Color operator+(const Color &c) const { return Color(r+c.r, g+c.g, b+c.b, 1-(1-a)*(1-c.a)); }
        bool operator==(const Color &c) const { return (r==c.r && g==c.g && b==c.b && a==c.a); }
index 869c41b615ea9f66a206156c37e7c586a7157971..32adeddd77089f9db6bf3b9c8bd23e7cb1dfaccf 100644 (file)
@@ -6,6 +6,11 @@
 namespace Msp {
 namespace GL {
 
+/**
+Interface for low-level graphics commands.
+
+Applications normally use the higher-level Renderer class rather than this.
+*/
 class Commands: public CommandsBackend
 {
 public:
index a03b6bda99162f3dd6a59a8facd52c0886b59775..22c72f6a3d8ea0c67c8b6c1ab6921082fdbb2e8d 100644 (file)
@@ -8,9 +8,11 @@ namespace Msp {
 namespace GL {
 
 /**
-Identifies a data type.  The values are bitfields laid as follows:
+Identifies a data type.
 
-__ds addd ccrr _bfg ssss ssss
+The values are bitfields laid as follows:
+
+__hm addd ccrr _bfg ssss ssss
   â”‚│ â”‚  â”‚  â”‚ â”‚  â”‚││         â””â•´Size (bytes)
   â”‚│ â”‚  â”‚  â”‚ â”‚  â”‚│└──────────╴Signed flag
   â”‚│ â”‚  â”‚  â”‚ â”‚  â”‚└───────────╴Floating-point flag
@@ -23,7 +25,7 @@ __ds addd ccrr _bfg ssss ssss
   â””──────────────────────────╴Shadow sampler flag
 
 This information is presented for internal documentation purposes only; it is
-inadvisable for programs to rely on it.
+inadvisable for applications to rely on it.
 */
 enum DataType
 {
index 8550d85ff75f35061e5c5c8c7f7dbe371d2c24b2..e121a8cac2c7b65d74af87d085f262ce4a42791e 100644 (file)
@@ -6,6 +6,9 @@
 namespace Msp {
 namespace GL {
 
+/**
+Contains information about various limits imposed by the graphics device.
+*/
 struct Limits
 {
        unsigned max_vertex_attributes;
@@ -19,6 +22,9 @@ struct Limits
        Limits();
 };
 
+/**
+Contains information about a graphics device.
+*/
 struct DeviceInfo
 {
        Limits limits;
@@ -26,6 +32,7 @@ struct DeviceInfo
 
        DeviceInfo();
 
+       /** Returns information for the device currently in use. */
        static const DeviceInfo &get_global();
 };
 
index 262e4248c3e251ddeb86e99ef335dc4e4ad501a3..d2029022d94b6fee2d0380d43a18dbff90338a63 100644 (file)
@@ -23,16 +23,12 @@ public:
 };
 
 /**
-Framebuffer objects can be used to perform offscreen rendering.  The most
-common application is rendering to a texture, which can then be used for
-fullscreen shader effects.
+Uses one or more textures as buffers to draw into.  Framebuffers can contain
+multiple color buffers to match multiple outputs from a fragment shader, but
+only one depth and stencil buffer.
 
-A framebuffer consist of a number of logical buffers, such as color and depth
-buffers.  Textures can be attached to the logical buffers.  At least one image
-must be attached for the framebuffer to be usable.
-
-Requires the GL_EXT_framebuffer_object extension.  The blit functions require
-the GL_EXT_framebuffer_blit extension.
+RenderTarget provides a higher-level interface which manages the textures as
+well as the framebuffer itself.
 */
 class Framebuffer: public FramebufferBackend
 {
@@ -86,13 +82,21 @@ public:
        portion of attch is considered; pixel format is ignored.  The framebuffer
        must have a format and the format of the texture must match that defined
        in the framebuffer for this attachment point. */
-       void attach(FrameAttachment attch, Texture2D &tex, unsigned level = 0);
+       void attach(FrameAttachment attch, Texture2D &, unsigned level = 0);
+
+       void attach(FrameAttachment attch, Texture2DMultisample &);
+
+       /** Attaches a single layer from a 3-dimensional texture to the
+       framebuffer. */
+       void attach(FrameAttachment attch, Texture3D &, unsigned layer, unsigned level = 0);
+
+       void attach(FrameAttachment attch, TextureCube &, TextureCubeFace face, unsigned level = 0);
+
+       /** Attaches a layered texture to the framebuffer.  Shaders can direct
+       output to a particular layer. */
+       void attach_layered(FrameAttachment attch, Texture3D &, unsigned level = 0);
 
-       void attach(FrameAttachment attch, Texture2DMultisample &tex);
-       void attach(FrameAttachment attch, Texture3D &tex, unsigned layer, unsigned level = 0);
-       void attach(FrameAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level = 0);
-       void attach_layered(FrameAttachment attch, Texture3D &tex, unsigned level = 0);
-       void attach_layered(FrameAttachment attch, TextureCube &tex, unsigned level = 0);
+       void attach_layered(FrameAttachment attch, TextureCube &, unsigned level = 0);
        void detach(FrameAttachment attch);
 
        void resize(const WindowView &);
index df4363758644160c98b8d9d7e2dbc4c42f641338..4662ae8f9d2d02ec8aebe576532f13e932d67ed8 100644 (file)
@@ -8,8 +8,10 @@ namespace Msp {
 namespace GL {
 
 /**
-Describes a single attachment of a framebuffer.  The values are bitfields laid
-as follows:
+Describes a single attachment of a framebuffer, including the type and index
+of the attachment point and the format of the attached texture.
+
+The values are bitfields laid as follows:
 
 nnnn nn_f _sss _ccc
       â”‚ â”‚    â”‚    â””â•´Number of components
@@ -18,7 +20,7 @@ nnnn nn_f _sss _ccc
       â””────────────╴Attachment index
 
 This information is presented for internal documentation purposes only; it is
-inadvisable for programs to rely on it.
+inadvisable for applications to rely on it.
 */
 enum FrameAttachment: std::uint16_t
 {
index 14b08a964cd59e2889c853cc8230afaa81a97a34..5544ed1f55e0e5cdf772cf9194d26bc9eabbd775 100644 (file)
@@ -17,9 +17,12 @@ class Buffer;
 class Renderer;
 
 /**
-Raw mesh data, consisting of a VertexArray and one or more Batches.  Though a
-Mesh can draw itself, it's usually used as part of Renderables rather than on
-its own.
+Stores mesh data using a VertexArray and one or more Batches.
+
+Meshes can be created at runtime using the MeshBuilder class.
+
+The Object class provides a higher-level interface which associates a Mesh with
+a Technique and is usually the appropriate way to of rendering geometry.
 */
 class Mesh: public Resource
 {
@@ -79,8 +82,10 @@ public:
        Mesh(const VertexFormat &);
        ~Mesh();
 
+       /** Sets the vertex format for the mesh.  It cannot be changed once set. */
        void storage(const VertexFormat &);
 
+       /** Clears all vertices and batches.  Vertex format is retained. */
        void clear();
 private:
        void check_buffers(unsigned);
@@ -90,15 +95,25 @@ public:
        const VertexSetup &get_vertex_setup() const { return vtx_setup; }
        const Buffer *get_index_buffer() const { return ibuf; }
        std::size_t get_n_vertices() const;
+
+       /** Returns a pointer to a vertex.  Offsets of individual attributes can be
+       queried from VertexFormat. */
        char *modify_vertex(std::size_t);
 
+       /** Adds a batch to the mesh.  It may be combined with the last existing
+       batch if the primitive types are compatible. */
        void add_batch(const Batch &b);
+
        const std::vector<Batch> &get_batches() const { return batches; }
 
        void set_winding(FaceWinding);
 
        void draw(Renderer &) const;
+       
+       /** Draws multiple instances of the mesh.  The supplied VertexSetup must use
+       the mesh's vertex array. */
        void draw_instanced(Renderer &, const VertexSetup &, unsigned) const;
+
 private:
        void draw(Renderer &, const VertexSetup *, unsigned) const;
        void resize_buffers() const;
index 9ac54d328ee42a86b97fed32e82383a171138739..1ccbbf3d5c0d03fb3ca144d9f9def0231112fbf0 100644 (file)
@@ -21,6 +21,14 @@ public:
 
 class Resources;
 
+/**
+Base class for shader modules.  Internal representation depends on the
+concrete type.
+
+Modules can be loaded from files.
+
+Applications normally use the Program class to access shaders.
+*/
 class Module
 {
 public:
@@ -37,13 +45,24 @@ public:
 
        virtual Format get_format() const = 0;
 
+       /** Sets the module's content from GLSL source code. */
        void set_source(const std::string &);
-       void load_source(IO::Base &, Resources *, const std::string &);
+
+       /** Loads GLSL source from a file or other I/O object.  Any import
+       statements are resolved using res. */
+       void load_source(IO::Base &, Resources *res, const std::string &name);
+
+       /** Loads GLSL source from a file or other I/O object.  Only builtin
+       shader fragments can be imported. */
        void load_source(IO::Base &, const std::string &);
+
 private:
        virtual void compile(SL::Compiler &) = 0;
 };
 
+/**
+A shader module in GLSL source code format.
+*/
 class GlslModule: public Module
 {
 private:
@@ -61,6 +80,15 @@ public:
        const SL::SourceMap &get_source_map() const { return source_map; }
 };
 
+/**
+A shader module in SPIR-V binary format.
+
+When the module's contents are set from GLSL source, it will be automatically
+compiled to SPIR-V.  Pre-compiled SPIR-V modules can also be loaded.
+
+Afterwards reflection data is available, providing information about variables
+forming the module's interface.
+*/
 class SpirVModule: public Module
 {
 public:
@@ -210,6 +238,7 @@ private:
 public:
        virtual Format get_format() const { return SPIR_V; }
 
+       /** Loads a SPIR-V binary from a file or other I/O object. */
        void load_code(IO::Base &);
 private:
        virtual void compile(SL::Compiler &);
index 6d4d2f6441099a2565fc2d245e57f475bacd49f6..478705367a1b67a67b125f85f752a8f46d6014ee 100644 (file)
@@ -20,6 +20,11 @@ class Texture;
 class UniformBlock;
 class VertexSetup;
 
+/**
+Stores state for the entire GPU pipeline.
+
+Applications normally use the higher-level Renderer class rather than this.
+*/
 class PipelineState: public PipelineStateBackend
 {
        friend PipelineStateBackend;
index 71a8bd4c3de6c98994e618d3a382be4b9dbc1791..c180451403dc2af7e9f8c640a7c8384b04eb85e7 100644 (file)
@@ -9,8 +9,9 @@ namespace Msp {
 namespace GL {
 
 /**
-Identifies the components of a pixel, without type information.  The values
-are bitfields laid as follows:
+Identifies the components of a pixel, without type information.
+
+The values are bitfields laid as follows:
 
 _grs dccc
  â”‚││ â”‚  â””â•´Number of components
@@ -20,7 +21,7 @@ _grs dccc
  â””───────╴Grayscale flag
 
 This information is presented for internal documentation purposes only; it is
-inadvisable for programs to rely on it.
+inadvisable for applications to rely on it.
 */
 enum PixelComponents
 {
@@ -37,8 +38,9 @@ enum PixelComponents
 };
 
 /**
-Identifies a pixel format, with components and type.  The values are bitfields
-laid as follows:
+Identifies a pixel format, with components and type.
+
+The values are bitfields laid as follows:
 
 tnfg ssss cccc cccc
 â”‚│││    â”‚         â””â•´Components (see PixelComponents)
@@ -49,7 +51,7 @@ tnfg ssss cccc cccc
 â””──────────────────╴sRGB flag
 
 This information is presented for internal documentation purposes only; it is
-inadvisable for programs to rely on it.
+inadvisable for applications to rely on it.
 */
 enum PixelFormat
 {
index 770c6badc1cbe31a69945a805e1dd1346d8b91ff..dab249f47684546f42cc64b2c0436f538c434126 100644 (file)
@@ -13,8 +13,10 @@ namespace Msp {
 namespace GL {
 
 /**
-A complete shader program.  Programs can be assembled of individual Shaders or
-generated with a set of standard features.
+A shader program consisting of one or more stages.
+
+Programs are created from Modules.  Specialization values can be applied to
+customize behaviour of the module.
 */
 class Program: public ProgramBackend
 {
index 5bcae284e6cf28a067cd6d9555ca284251add92e..d5b83b960569911b5dd342351ec48567a0d98a1f 100644 (file)
@@ -11,9 +11,15 @@ class Renderer;
 
 enum QueryType
 {
+       /** Query result indicates if any fragments passed the depth and stencil
+       tests. */
        OCCLUSION_QUERY
 };
 
+/**
+A collection of query objects, which can be used to gather feedback from the
+GPU.  Semantics of the queries depend on the query type.
+*/
 class QueryPool: public QueryPoolBackend, public Msp::NonCopyable
 {
        friend QueryPoolBackend;
index c79068775b144499943196b316dc0f8f0406f75b..7cf3d83a7b0915481eef1417e2fe48c0a1e8bcee 100644 (file)
@@ -48,18 +48,12 @@ enum TextureWrap
 
 
 /**
-Samplers are used to access texture data in shaders.  To use a sampler with a
-texture, bind it to the same texture unit.  Each texture has a default sampler
-which is used if no external sampler is bound.
-
-A texture is generally rendered at a size that's either smaller or larger than
-its native size, so that the texture coordinates do not exactly correspond to
-the texels of the texture.  The kind of filtering used, if any, is determined
-by the minification and magnification filter parameters.  The default is LINEAR
-for magnification and NEAREST_MIPMAP_LINEAR for minification.
-
-If texture coordinates fall outside of the principal range of the texture,
-wrapping is applied.  The default for all directions is REPEAT.
+Stores settings affecting how values are obtained from textures in a shader.
+Samplers are always used together with textures.
+
+Texture coordinates are first transformed according to the wrap mode for each
+axis.  One or more texel values are then read and combined according to the
+filtering mode.
 */
 class Sampler: public SamplerBackend
 {
@@ -112,7 +106,12 @@ private:
        void update() const;
 
 public:
+       /** Sets filter to use when the texture is drawn at a size smaller than
+       original. */
        void set_min_filter(TextureFilter);
+
+       /** Sets filter to use when the texture is drawn at a size larger than
+       original.  Mipmapped filters can't be used. */
        void set_mag_filter(TextureFilter);
 
        /** Sets filter for both minification and magnification.  If a mipmapping
@@ -122,6 +121,9 @@ public:
        TextureFilter get_min_filter() const { return min_filter; }
        TextureFilter get_mag_filter() const { return mag_filter; }
 
+       /** Sets the maximum aspect ratio for anisotropic filtering.  If greater
+       than 1, filtering will consider more than than four samples when the texture
+       is drawn at an oblique angle. */
        void set_max_anisotropy(float);
        float get_max_anisotropy() const { return max_anisotropy; }
 
@@ -132,7 +134,9 @@ public:
        void set_wrap_t(TextureWrap);
        void set_wrap_r(TextureWrap);
 
+       /** Sets the border color for CLAMP_TO_BORDER wrap mode. */
        void set_border_color(const Color &);
+
        const Color &get_border_color() const { return border_color; }
 
        /** Disables depth comparison. */
@@ -140,7 +144,7 @@ public:
 
        /** Enables depth comparison and sets the compare function.  Only has an
        effect when used with a depth texture.  When depth comparison is enabled,
-       the third component of the texture coordinate is compared against the texel
+       the last component of the texture coordinate is compared against the texel
        value, and the result is returned as the texture sample.*/
        void set_compare(Predicate);
 
index c593c0ad5236657ac4f08b45ded75f8c3a144f4b..13ff5bc9f73095094a0800cd1efbd5aaa3a4246a 100644 (file)
@@ -12,13 +12,20 @@ namespace Msp {
 namespace GL {
 
 /**
-Base class for textures.  This class only defines operations common for all
-texture types and is not instantiable.  For specifying images for textures,
-see one of the dimensioned texture classes.
+Base class for textures.  Most operations are defined in subclasses.
 
-A texture can consinst of a stack of images, called a mipmap.  The dimensions
-of each mipmap level are half that of the previous level.  The mipmap stack
-can be used for texture minification; see the Sampler class for details.
+Memory must be allocated for the texture by calling storage().  Each subclass
+provides this function with parameters appropriate to that type of texture.
+Contents can then be modified using the image() and sub_image() functions
+provided by subclasses.
+
+Most types of textures can consist of a pyramid of images, called a mipmap.
+The dimensions of each mipmap level are half that of the previous level.
+
+Textures can be used as either a data source or target for draw commands.  To
+read from a texture in a shader, it must be paired with a Sampler to determine
+how the texels are accessed.  To draw into a texture, it must be attached to a
+Framebuffer.
 */
 class Texture: public TextureBackend, public Resource
 {
@@ -86,12 +93,13 @@ public:
 
        using TextureBackend::generate_mipmap;
 
-       /// Loads a Graphics::Image from a file and uploads it to the texture.
+       /** Loads an image into the texture from a file. */
        virtual void load_image(const std::string &, unsigned = 0);
 
-       /** Uploads an image to the texture.  If storage has not been defined, it
-       will be set to match the image.  Otherwise the image must be compatible
-       with the defined storage.  Semantics depend on the type of texture.  */
+       /** Sets the texture's contents from an image.  If storage has not been
+       allocated yet, it will be set to match the image.  Otherwise the image must
+       be compatible with the existing storage.  Subclasses may impose restrictions
+       on the image's dimensions. */
        virtual void image(const Graphics::Image &, unsigned = 0) = 0;
 
        virtual std::size_t get_data_size() const { return 0; }
index c4230d3162d08e85d2ae046d94250f22c9a3578a..7ef55f80fdf17ec9c295efff74f2e914dd91e975 100644 (file)
@@ -7,6 +7,9 @@
 namespace Msp {
 namespace GL {
 
+/**
+One-dimensional texture, consisting of a single row of texels.
+*/
 class Texture1D: public Texture1DBackend
 {
        friend Texture1DBackend;
@@ -30,10 +33,21 @@ private:
        unsigned levels = 0;
 
 public:
-       void storage(PixelFormat, unsigned, unsigned = 0);
+       /** Sets storage format and size and allocates memory for the texture.  If
+       lv is zero, a complete mipmap pyramid is automatically created.  Storage
+       cannot be changed once set. */
+       void storage(PixelFormat, unsigned wd, unsigned lv = 0);
+
+       /** Replaces contents of an entire mipmap level.  Allocated storage must
+       exist.  The image data is interpreted according to the storage format and
+       must have size matching the selected mipmap level. */
+       void image(unsigned level, const void *);
+
+       /** Replaces a range of texels in the texture.  Allocated storage must
+       exist.  The image data is interpreted according to the storage format and
+       the range must be fully inside the selected mipmap level. */
+       void sub_image(unsigned level, int x, unsigned wd, const void *);
 
-       void image(unsigned, const void *);
-       void sub_image(unsigned, int, unsigned, const void *);
        virtual void image(const Graphics::Image &, unsigned = 0);
 
        unsigned get_width() const { return width; }
index c6654df69222859a0a284c468c9859a737127d8c..427e179563943b312c7ea4f87b7ae3a5595e09db 100644 (file)
@@ -9,9 +9,7 @@ namespace Msp {
 namespace GL {
 
 /**
-Two-dimensional texture.  Consists of an array of texels in the shape of a
-rectangle.  Texture coordinate have a range of [0, 1].  Coordinates outside of
-this range are subject to wrapping.  This is the most common type of texture.
+Two-dimensional texture, consisting of a rectangular array of texels.
 */
 class Texture2D: public Texture2DBackend
 {
@@ -39,27 +37,22 @@ private:
 public:
        virtual ~Texture2D();
 
-       /** Defines storage structure for the texture.  If lv is zero, the number
-       of mipmap levels is automatically determined from storage dimensions.
+       /** Sets storage format and dimensions and allocates memory for the texture.
+       If lv is zero, a complete mipmap pyramid is automatically created.  Storage
+       cannot be changed once set. */
+       void storage(PixelFormat, unsigned wd, unsigned ht, unsigned lv = 0);
 
-       Must be called before an image can be uploaded.  Once storage is defined,
-       it can't be changed. */
-       void storage(PixelFormat fmt, unsigned wd, unsigned ht, unsigned lv = 0);
+       /** Replaces contents of an entire mipmap level.  Allocated storage must
+       exist.  The image data is interpreted according to the storage format and
+       must have size matching the selected mipmap level. */
+       virtual void image(unsigned level, const void *);
 
-       /** Updates the contents of the entire texture.  Storage must be defined
-       beforehand.  The image data must have dimensions and format matching the
-       defined storage. */
-       virtual void image(unsigned level, const void *data);
+       /** Replaces a rectangular region of the texture.  Allocated storage must
+       exist.  The image data is interpreted according to the storage format and
+       the region must be fully inside the selected mipmap level. */
+       void sub_image(unsigned level, int x, int y, unsigned wd, unsigned ht, const void *);
 
-       /** Updates a rectangular region of the texture.  Storage must be defined
-       beforehand.  The image data must be in a format mathing the defined storage
-       and the update region must be fully inside the texture. */
-       void sub_image(unsigned level, int x, int y, unsigned wd, unsigned ht, const void *data);
-
-       /** Updates the contents of the entire texture from an image.  If storage
-       has not been defined, it will be set to match the image.  Otherwise the
-       image must match the defined storage. */
-       virtual void image(const Graphics::Image &, unsigned lv = 0);
+       virtual void image(const Graphics::Image &, unsigned = 0);
 
        unsigned get_width() const { return width; }
        unsigned get_height() const { return height; }
index 662fbad8c71c7ac8de37fed1280e47062ccaa0f1..98cb1bdc13917871abcd21b2742ab0e367e57b46 100644 (file)
@@ -7,9 +7,10 @@ namespace Msp {
 namespace GL {
 
 /**
-An array of two-dimensional textures.  It's very much like a 3D texture, with
-two important differences: there's no filtering nor mipmapping along the third
-dimension.
+An array of two-dimensional textures.  It behaves much like a 3D texture, but
+mipmapping and filtering is not applied on the third dimension.  When sampling
+the texture, the third coordinate is not normalized and is rounded to the
+nearest integer to select the layer.
 */
 class Texture2DArray: public Texture2DArrayBackend
 {
@@ -25,7 +26,11 @@ public:
                void external_image(unsigned, const std::string &);
        };
 
+       /** Replaces contents of a single layer.  Allocated storage must exist.  The
+       image data is interpreted according to the storage format and must have
+       width and height matching the selected mipmap level. */
        void layer_image(unsigned, unsigned, const void *);
+
        void layer_image(unsigned, unsigned, const Graphics::Image &);
 
        unsigned get_layers() const { return get_depth(); }
index 77f4c542a51c1eba7da3684d56db3a1f98077704..82ab0818d84fc4d2994458dd8688d1b1b4ad8d9a 100644 (file)
@@ -6,6 +6,15 @@
 namespace Msp {
 namespace GL {
 
+/**
+Two-dimensional multisample texture, consisting of a rectancular array of
+texels with multiple samples each.
+
+The contents of multisample textures can not be set through API.  Their primary
+use is as Framebuffer attachments.
+
+Multisample textures can't have mipmaps.
+*/
 class Texture2DMultisample: public Texture2DMultisampleBackend
 {
        friend Texture2DMultisampleBackend;
@@ -16,7 +25,9 @@ private:
        unsigned samples = 0;
 
 public:
-       void storage(PixelFormat fmt, unsigned wd, unsigned ht, unsigned sm);
+       /** Sets storage dimensions, format and sample count and allocates memory
+       for the texture. */
+       void storage(PixelFormat, unsigned wd, unsigned ht, unsigned sm);
 
        virtual void image(const Graphics::Image &, unsigned = 0);
 
index d791633d3a306ef08607016efe4b956d850f43fa..9d5104c91e42892de2d9189b31291f4352c98e2f 100644 (file)
@@ -9,8 +9,7 @@ namespace Msp {
 namespace GL {
 
 /**
-Three-dimensional texture.  Consists of an array of texels in the shape of a
-right cuboid.  Texture coordinates have a principal range of [0, 1].
+Three-dimensional texture, consisting of a cuboid-shaped array of texels.
 */
 class Texture3D: public Texture3DBackend
 {
@@ -40,28 +39,25 @@ protected:
 public:
        Texture3D() = default;
 
-       /** Defines storage structure for the texture.  If lv is zero, the number
-       of mipmap levels is automatically determined from storage dimensions.
-
-       Must be called before an image can be uploaded.  Once storage is defined,
-       it can't be changed. */
-       void storage(PixelFormat fmt, unsigned wd, unsigned ht, unsigned dp, unsigned lv = 0);
-
-       /** Updates the contents of the entire texture.  Storage must be defined
-       beforehand.  The image data must have dimensions and format matching the
-       defined storage. */
-       void image(unsigned level, const void *data);
-
-       /** Updates a cuboid-shaped region of the texture.  Storage must be defined
-       beforehand.  The image data must be in a format mathing the defined storage
-       and the update region must be fully inside the texture. */
-       void sub_image(unsigned level, int x, int y, int z, unsigned wd, unsigned ht, unsigned dp, const void *data);
-
-       /** Updates the contents of the entire texture from an image.  If storage
-       has not been defined, it will be set to match the image.  In this case the
-       image will be treated as a stack of square layers and its height must be
-       divisible by its width.  Otherwise the image must match the defined
-       storage. */
+       /** Sets storage format and dimensions and allocates memory for the texture.
+       If lv is zero, a complete mipmap pyramid is automatically created.  Storage
+       cannot be changed once set. */
+       void storage(PixelFormat, unsigned wd, unsigned ht, unsigned dp, unsigned lv = 0);
+
+       /** Replaces contents of an entire mipmap level.  Allocated storage must
+       exist.  The image data is interpreted according to the storage format and
+       must have size matching the selected mipmap level. */
+       void image(unsigned level, const void *);
+
+       /** Replaces a cuboid-shaped region of the texture.  Allocated storage must
+       exist.  The image data is interpreted according to the storage format and
+       the region must be fully inside the texture. */
+       void sub_image(unsigned level, int x, int y, int z, unsigned wd, unsigned ht, unsigned dp, const void *);
+
+       /** Sets the texture's contents from an image.  The image is treated as a
+       stack of square layers and its height must be divisible by its width.  If
+       storage has not been allocated yet, it will be set to match the image.
+       Otherwise the image must be compatible with the existing storage. */
        virtual void image(const Graphics::Image &, unsigned = 0);
 
        unsigned get_width() const { return width; }
index e738ab53beba296520c3d130744a82b8b3e4208c..aa43c9da0a97ca084bd2690fd1f1e7b2dae35b13 100644 (file)
@@ -19,16 +19,13 @@ enum TextureCubeFace
 };
 
 /**
-Cube map texture, consisting of six square faces.  All of the faces must be of
-the same size.  A cube map texture is addressed by three-dimensional texture
-coordinates, with a principal range of [-1, 1].  The face is first selected
-according to the largest coordinate, and the remaining two coordinates are used
-to sample the face image.  The images are oriented so that the cross product of
-the s and t axes will point into the cube.
+Cube map texture, consisting of six square faces.
 
-All faces of a cube map texture must be allocated for it to be usable.
-
-Requires OpenGL version 1.3.
+A cube map texture is addressed by three-dimensional texture coordinates.  The
+coordinate vector is projected on the unit cube, with the largest coordinate
+selecting the face and the remaining two used to sample from the face image.
+The images are oriented so that the cross product of the s and t axes will
+point into the cube.
 */
 class TextureCube: public TextureCubeBackend
 {
@@ -58,25 +55,27 @@ private:
        static const unsigned orientations[12];
 
 public:
-       /** Defines storage structure for the texture.  If lv is zero, the number
-       of mipmap levels is automatically determined from storage dimensions.
-
-       Must be called before an image can be uploaded.  Once storage is defined,
-       it can't be changed. */
-       void storage(PixelFormat fmt, unsigned size, unsigned lv = 0);
+       /** Sets storage format and dimensions and allocates memory for the texture.
+       If lv is zero, a complete mipmap pyramid is automatically created.  Storage
+       cannot be changed once set. */
+       void storage(PixelFormat, unsigned size, unsigned lv = 0);
 
-       /** Updates the contents of a face.  Storage must be defined beforehand.
-       The image data must have dimensions and format matching the defined
-       storage. */
-       void image(TextureCubeFace face, unsigned level, const void *data);
+       /** Replaces contents of a single face.  Allocated storage must exist.  The
+       image data is interpreted according to the storage format and must have size
+       matching the selected mipmap level. */
+       void image(TextureCubeFace, unsigned level, const void *);
 
-       /** Updates a rectangular region of a face.  Storage must be defined
-       beforehand.  The image data must be in a format mathing the defined storage
-       and the update region must be fully inside the face. */
-       void sub_image(TextureCubeFace face, unsigned level, int x, int y, unsigned w, unsigned h, const void *data);
+       /** Replaces a rectangular region of a face.  Allocated storage must exist.
+       The image data is interpreted according to the storage format and the region
+       must be fully inside the face. */
+       void sub_image(TextureCubeFace, unsigned level, int x, int y, unsigned w, unsigned h, const void *);
 
        void image(TextureCubeFace, const Graphics::Image &);
 
+       /** Sets the texture's contents from an image.  The image is treated as a
+       stack of square layers and its height must be six times its width.  If
+       storage has not been allocated yet, it will be set to match the image.
+       Otherwise the image must be compatible with the existing storage. */
        virtual void image(const Graphics::Image &, unsigned = 0);
 
        unsigned get_size() const { return size; }
@@ -94,7 +93,7 @@ public:
        /** Returns a vector in the direction of the t axis of the face. */
        static const Vector3 &get_t_direction(TextureCubeFace);
 
-       /** Returns a vector pointing to the center a texel. */
+       /** Returns a vector pointing to the center of a texel. */
        Vector3 get_texel_direction(TextureCubeFace, unsigned, unsigned);
 
        virtual AsyncLoader *load(IO::Seekable &, const Resources * = 0) { return 0; }
index 5e88f0f80de81919ebcc510defaccc6f778e7b47..a71dab25f71afa7108e0867cd9f4740417ac169a 100644 (file)
@@ -11,8 +11,15 @@ namespace Msp {
 namespace GL {
 
 /**
-Stores uniforms with a specific layout.  Both named and default uniform blocks
-are supported.
+Stores uniform values in a block of memory.
+
+For named uniform blocks the values are stored according to the reflected
+layout of the block, ready for use by shaders.  For the default uniform block,
+the location of the uniform is multiplied by 16 to obtain the memory offset.
+
+Applications normally don't need to deal with UniformBlocks directly.  They're
+managed by the ProgramData class, which provides a higher-level interface for
+setting uniform values.
 */
 class UniformBlock: public UniformBlockBackend, public NonCopyable, public Bufferable
 {
index 60e035f9a6ad429cef54bee4aaa1832d38fb4e08..8e56ee226b599254f0876942322ee2a4dc1d6ee5 100644 (file)
@@ -11,14 +11,17 @@ namespace Msp {
 namespace GL {
 
 /**
-Stores vertex data.
+Stores vertex data.  Each vertex has one or more attributes defined by a
+VertexFormat.
 
 The array's contents can be modified with the append and modify methods.  To
 obtain the location of an individual component within the vertex, use
 VertexFormat::offset.
 
-A higher-level interface for filling in vertex data is available in the
-VertexArrayBuilder class.
+VertexArrayBuilder provides a convenient way of filling in vertex data.
+
+Applications normally don't need to deal with VertexArrays directly.  They're
+managed by the Mesh and InstanceArray classes.
 */
 class VertexArray: public Bufferable
 {
@@ -39,24 +42,28 @@ private:
 public:
        VertexArray() = default;
 
-       /// Construct a VertexArray and set its format.
+       /** Constructs a VertexArray and sets its format. */
        VertexArray(const VertexFormat &);
 
-       /// Sets the format of the VertexArray.
+       /** Sets the format of the VertexArray.  The format cannot be changed once
+       set. */
        void set_format(const VertexFormat &);
 
        const VertexFormat &get_format() const { return format; }
 
-       /// Clears all vertices from the array.
+       /** Clears all vertices from the array.  Vertex format is retained. */
        void clear();
 
-       /// Reserve space for vertices.
+       /** Reserve space for vertices.  If n is smaller than the current size,
+       nothing is done. */
        void reserve(std::size_t n);
 
-       /// Append a new vertex at the end of the array and return its location.
+       /** Append a new vertex at the end of the array and return a pointer to it.
+       The array is marked as dirty. */
        char *append();
 
-       /// Returns the location of a vertex for modification.
+       /** Returns a pointer to a vertex for modification.  The array is marked as
+       dirty. */
        char *modify(std::size_t);
 private:
        virtual std::size_t get_data_size() const;
index 4ff3401778d15b5989130d4dcf6c2ce803eb4bee..d5835013b53a925584bbfa8055a663f1f1382ed4 100644 (file)
@@ -8,7 +8,8 @@
 namespace Msp {
 namespace GL {
 
-/** A single vertex attribute.  Commonly used attributes are named by their
+/**
+A single vertex attribute.  Commonly used attributes are named by their
 semantical meaning in the standard shaders.  Texture coordinates and generic
 attributes can additionally be given an index.  There are four texture
 coordinate attributes available.  The number of available generic attributes
@@ -29,7 +30,7 @@ nnnn nn_f gsss iccc
       â””────────────╴Attribute index (semantic)
 
 This information is presented for internal documentation purposes only; it is
-inadvisable for programs to rely on it.
+inadvisable for applications to rely on it.
 */
 enum VertexAttribute: std::uint16_t
 {
@@ -70,6 +71,9 @@ enum VertexAttribute: std::uint16_t
        RAW_ATTRIB_I4 = 0xFCCC
 };
 
+/**
+Describes the attributes of a vertex.  Up to 15 attributes are allowed.
+*/
 class VertexFormat
 {
 private:
@@ -91,7 +95,13 @@ public:
        bool empty() const { return !count; }
        const VertexAttribute *begin() const { return attributes; }
        const VertexAttribute *end() const { return attributes+count; }
+
+       /** Returns the displacement from one vertex to the next. */
        unsigned stride() const;
+
+       /** Returns the offset of an attribute within a vertex.  A stored attribute
+       must have the same semantic and type and at least as many components as
+       requested to be considered a match. */
        int offset(VertexAttribute) const;
 };
 
index 208e55d3cd676729d4299024feaad06a273bf3d2..1cdedc79e7bf2c4186f78c0b59304d800a58564e 100644 (file)
@@ -12,8 +12,11 @@ class Buffer;
 class VertexArray;
 
 /**
-Combines a VertexArray with an index buffer.  This wraps OpenGL's vertex array
-objects.  Intended for internal use.
+Combines vertex and instance attributes and an index buffer for a complete
+description of vertex input state.
+
+Applications normally don't need to deal with VertexSetups directly.  They're
+managed by the Mesh and InstanceArray classes.
 */
 class VertexSetup: public VertexSetupBackend
 {
@@ -36,12 +39,25 @@ private:
        DataType index_type = UNSIGNED_SHORT;
 
 public:
+       /** Sets format for vertex data.  Instance attributes won't be used.  The
+       format cannot be changed once set. */
        void set_format(const VertexFormat &);
+
+       /** Sets formats for both vertex and instance data.  The formats cannot be
+       changed once set. */
        void set_format_instanced(const VertexFormat &, const VertexFormat &);
 
+       /** Sets the VertexArray to use as the source of vertex attribute values.
+       The array's format must match the VertexSetup's vertex format. */
        void set_vertex_array(const VertexArray &);
+
+       /** Sets the VertexArray to use as the source of instance attribute values.
+       An instance format must be defined and the array's format must match it. */
        void set_instance_array(const VertexArray &);
+
+       /** Sets the buffer containing index data and the type of indices. */
        void set_index_buffer(const Buffer &, DataType);
+
        const VertexArray *get_vertex_array() const { return vertex_array; }
        const VertexArray *get_instance_array() const { return inst_array; }
        const Buffer *get_index_buffer() const { return index_buffer; }
index efaa2f378b2be66282648d2855f602fcc1a59071..a9ffb81e2ac4d52c82557400da03835f6a8a0ef1 100644 (file)
@@ -11,7 +11,7 @@ namespace GL {
 class Program;
 
 /**
-Implements screen-space ambient occlusion.
+Darkens recessed areas of the scene to simulate the occlusion of ambient light.
 
 http://en.wikipedia.org/wiki/Screen_Space_Ambient_Occlusion
 */
index 94057b2f7b21a0603db19432fcfe4602082a0a3b..30e98f7ee75f95a52e8f3e0ef7764daf380f3876 100644 (file)
@@ -11,12 +11,11 @@ namespace GL {
 class Program;
 
 /**
-The Bloom post-processing effect causes very bright areas of the image to bleed
-into surrounding pixels.  Commonly used together with HDR rendering.
+Bleeds very bright areas of the image into surrounding pixels to simulate
+optical imperfections in lenses.
 
-The technique used is to gaussian blur the image and then blend the result with
-the original image.  With suitable parameters, this effect may also be used as
-a blur filter.
+The input image is blurred with a gaussian kernel to simulate the Airy disc
+produced by a lens, then the blurred image is blended with the original.
 */
 class Bloom: public PostProcessor
 {
index 5cebcb00835e818fe2b44a303928b2b502c149f4..99263407d965bccaea891025a8ef7df035f67dea 100644 (file)
@@ -11,9 +11,12 @@ namespace GL {
 class Program;
 
 /**
-Processes oversaturated colors to preserve hues.  When one color component
-exceeds 1.0, the overflow is distributed to the other components, scaling the
-color towards white.
+Maps high dynamic range colors to 8-bit and applies gamma correction.
+
+An exponential curve (with exponent less than or equal to 1) is applied to
+simulate the response of the human eye.  If the maximum color component of the
+result exceeds 1, the overflow is distributed to the other components to
+increase the apparent brightness without changing the hue.
 
 Gamma or sRGB correction can also be applied to the output.  It can be used to
 improve color reproduction by performing lighting calculations in linear color
index 0d794a3a2d9b6b264b17e880cf0a02c95d8218d7..ac458361700cf669052ea69039017451f2497e8f 100644 (file)
@@ -9,13 +9,23 @@ namespace Msp {
 namespace GL {
 
 /**
-Effects are used to wrap other renderables and give them additional visual
-properties.  An Effect's render method should set up the necessary state, call
-the wrapped Renderable's render method, and clean up after itself.
+Base class for visual effects.
+
+Effects wrap other renderables and provide additional textures or uniform
+values which can be used by shaders to modify the appearance of the content
+renderable.  Some material properties require certain Effects to be present in
+order to function properly.
+
+If an Effect subclass needs to do any sideband rendering to prepare for a
+frame, that should be done in setup_frame().  The render() function should only
+set up the necessary state and call the content renderable's render() function.
 */
 class Effect: public Renderable
 {
 public:
+       /**
+       Holds the parameters for an Effect.  Used with SequenceTemplate.
+       */
        struct Template
        {
                class Loader: public DataFile::CollectionObjectLoader<Template>
index 4338581648b5b05917f48d8024ff98fc14bc56ea..20c6779abf4ef3672f556e51531455f2edb56ff3 100644 (file)
@@ -16,13 +16,17 @@ class Mesh;
 class Sampler;
 
 /**
-Creates a cube map texture of the surroundings of the renderable.  This texture
-can then be used to implement effects such as reflections or refractions.
+Creates a cube map texture of the surroundings of the content renderable, for
+use in image-based lighting.  Also called a light probe.
 
-If the EnvironmentMap is used in a Sequence, it's worth noting that the cube
-map will be prepared outside of any rendering pass.  It's recommended to use
-another Sequence to define which passes should be used to render the
-environment.
+The cube map can optionally be prefiltered for varying amounts of roughness.
+An irradiance map for diffuse lighting is also created.
+
+The EnvironmentMap won't be rendered inside its own environment.  This avoids
+artifacts if one is used to create reflections on a complex object.
+
+The shader fragment common.glsl provides interfaces to access the environment
+data.
 */
 class EnvironmentMap: public Effect
 {
@@ -86,9 +90,15 @@ protected:
        unsigned update_delay = 0;
 
 public:
-       EnvironmentMap(unsigned size, PixelFormat, Renderable &rend, Renderable &env);
-       EnvironmentMap(unsigned size, PixelFormat, unsigned, Renderable &rend, Renderable &env);
+       EnvironmentMap(unsigned size, PixelFormat, Renderable &content, Renderable &env);
+
+       /** Creates an EnvironmentMap with prefiltering for varying amounts of
+       roughness.  Levels specifies the number of prefilter mipmap levels and must
+       be valid for the size. */
+       EnvironmentMap(unsigned size, PixelFormat, unsigned levels, Renderable &content, Renderable &env);
 
+       /** Sets a fixed position to render the environment map from.  This can be
+       useful if the content renderable does not have a model matrix. */
        void set_fixed_position(const Vector3 &);
 
        void set_depth_clip(float, float);
index 8b2884acf6a360953f2e0a63ddeec2d44a64e689..02d9d17a6f104d3672dc152849eced83f5ca9adf 100644 (file)
@@ -12,13 +12,17 @@ class Sampler;
 class Texture2D;
 
 /**
-Base class for post-processing effects.  Post-processors receive the contents
-of the entire framebuffer as a texture and render it back, altering it in the
-process.
+Base class for post-processing effects.
+
+PostProcessors can be added to a Sequence.  They receive the contents of the
+entire framebuffer as a texture and render it back, altering it in the process.
 */
 class PostProcessor
 {
 public:
+       /**
+       Holds the parameters for a PostProcessor.  Used with SequenceTemplate.
+       */
        struct Template
        {
                class Loader: public Msp::DataFile::ObjectLoader<Template>
@@ -39,7 +43,6 @@ protected:
 public:
        virtual ~PostProcessor() { }
 
-       /// Renders the effect.
        virtual void render(Renderer &, const Texture2D &, const Texture2D &) = 0;
 
        virtual void set_debug_name(const std::string &) = 0;
index 502480122fc68354e45c85adec5b8a3d22c328de..da76062833c745a487549df4a2a88e265f70cf2c 100644 (file)
@@ -17,10 +17,17 @@ class Light;
 class PointLight;
 
 /**
-Creates shadows on a renderable through a shadow map texture.  In the setup
-phase, the scene is rendered to a depth texture from the point of view of the
-lightsource.  This texture is then used in the rendering phase together with
-texture coordinate generation to determine whether each fragment is lit.
+Creates a depth texture which can be used to add shadows to a renderable.
+
+In the setup phase, the scene is rendered from the point of view of the light
+source and the depth values are recorded.  This texture can be used by shaders
+to determine if the light can reach a particular position.
+
+A shadow map can be created as an atlas, containing multiple lights in the same
+depth texture.  Each light is automatically allocated a region of the texture
+and region information is added to the uniform values.
+
+The shader fragment shadow.glsl provides interfaces to access the shadow map.
 */
 class ShadowMap: public Effect
 {
@@ -115,30 +122,40 @@ private:
        std::string debug_name;
 
        ShadowMap(unsigned, unsigned, Renderable &, const Lighting *);
+
 public:
-       ShadowMap(unsigned, Renderable &, const DirectionalLight &, Renderable &);
-       ShadowMap(unsigned, unsigned, Renderable &, const Lighting &);
+       /** Creates a shadow map for a single light. */
+       ShadowMap(unsigned size, Renderable &content, const DirectionalLight &, Renderable &caster);
+
+       /** Creates a shadow map atlas, to which multiple lights can be added. */
+       ShadowMap(unsigned width, unsigned height, Renderable &, const Lighting &);
+
+       /** Adds a directional light.  The shadow map is rendered using an
+       orthogonal projection. */
+       void add_light(const DirectionalLight &, unsigned size, Renderable &caster);
 
-       void add_light(const DirectionalLight &, unsigned, Renderable &);
-       void add_light(const PointLight &, unsigned, Renderable &);
+       /** Adds a point light.  The shadow map is rendered using a perspective
+       projection, with four views in a tetrahedral arrangement.  The shader must
+       clip vertices appropriately.  Occluder_thsm.glsl can be used for this. */
+       void add_light(const PointLight &, unsigned size, Renderable &caster);
 private:
        void add_light(const Light &, unsigned, ShadowType, Renderable &);
 
 public:
-       /** Sets the ShadowMap target point and radius.  The transformation matrix is
-       computed so that a sphere with the specified parameters will be completely
-       covered by the ShadowMap. */
+       /** Sets the shadow volume parameters.  For directional lights the shadow
+       camera will be positioned so that the spherical shadow volume fits entirely
+       in the view volume.  For point lights the shadow volume's radius will be
+       used as the view distance. */
        void set_target(const Vector3 &, float);
 
        /** Sets the darkness of shadows.  Must be in the range between 0.0 and 1.0,
-       inclusive.  Only usable with shaders, and provided through the
-       shadow_darkness uniform. */
+       inclusive.  Values other than 1.0 are not physically correct. */
        void set_darkness(float);
 
-       /** Sets a distance beyond objects from which the shadow starts.  Expressed
-       in pixel-sized units.  Must be positive; values less than 1.0 are not
-       recommended.  Larger values produce less depth artifacts, but may prevent
-       thin objects from casting shadows on nearby sufraces. */
+       /** Sets an offset for depth values to avoid surfaces incorrectly shadowing
+       themselves.  Must be positive; values less than 1.0 are not recommended.
+       Larger values produce less artifacts, but may cause shadows to become
+       disconnected from the objects casting them. */
        void set_depth_bias(float);
 
        const Texture2D &get_depth_texture() const { return depth_buf; }
index 0152729a0ec8cf8dbb5ba88c5fc529ad5fd895c2..7d8933d4a65f4a6facbb7799fbb99f59293bc6bb 100644 (file)
@@ -13,9 +13,14 @@ class Mesh;
 class Program;
 
 /**
-Renders a procedurally generated sky at the background.  Based on the paper
-"A Scalable and Production Ready Sky and Atmosphere Rendering Technique" by
-Sébastien Hillaire (https://sebh.github.io/publications/egsr2020.pdf).
+Renders a procedurally generated sky at the background.
+
+In addition to the background, the transmittance of the sun light is calculated
+to produce realistic lighting at dawn and dusk.
+
+Based on the techniques described in "A Scalable and Production Ready Sky and
+Atmosphere Rendering Technique" by Sébastien Hillaire
+(https://sebh.github.io/publications/egsr2020.pdf).
 */
 class Sky: public Effect
 {
index d9fc2d6a7a074367262dc890967ac632b9d22682..9b7b7affecf58035f19c2457cbd08c8c4adddf3d 100644 (file)
@@ -276,6 +276,7 @@ private:
        virtual void visit(Iteration &);
 };
 
+/** Removes code which is never executed due to flow control statements. */
 class UnreachableCodeRemover: private TraversingVisitor
 {
 private:
index bf1b0e8cdfb1190b114906abe398e4f1376216e4..4fe4e10c2012bc9be0c3e2171bd39f01e8e341a5 100644 (file)
@@ -6,6 +6,13 @@
 namespace Msp {
 namespace GL {
 
+/**
+A basic and cheap material using the Phong shading model.  Results are roughly
+equivalent to legacy OpenGL materials.
+
+In addition to the usual properties of the Phong shading model, normal mapping
+and reflections are supported.  Reflections require an EnvironmentMap effect.
+*/
 class BasicMaterial: public Material
 {
 public:
index b20ebae44d3fe714f0a7bc4365f160bf3ae9b7e9..189380cdb7a1e2f1b619423761b708bfadc8b2dc 100644 (file)
@@ -19,7 +19,7 @@ implement different types of lights.
 Lights are usually grouped with a Lighting object, which can be used in a
 Sequence::Step.
 
-Lights do not cast shadows by themselves.  See ShadowMap for that.
+Shadows can be added to lights by using the ShadowMap effect.
 */
 class Light: public Placeable
 {
@@ -55,15 +55,15 @@ protected:
 public:
        virtual ~Light() = default;
 
-       /** Sets the color of the Light. */
+       /** Sets the color of the light. */
        void set_color(const Color &);
 
        const Color &get_color() const { return color; }
 
        unsigned get_generation() const { return generation; }
 
-       /** Updates a ProgramData object with the uniforms for the Light.  A light
-       source index must be passed in.  Primarily used by Lighting. */
+       /** Updates a ProgramData object with the uniform values for the light.  A
+       light source index must be passed in. */
        void update_shader_data(ProgramData &, unsigned) const;
 
 protected:
index 658d7476a794843650188cd6c5ca7a5c7afcc141..335e78872a23f2a0f9acfcf4b05ffddfa0fd2f56 100644 (file)
@@ -12,8 +12,9 @@ namespace GL {
 class Light;
 
 /**
-Encapsulates global lighting parameters and any number of individual light
-sources.
+Combines multiple light sources with global lighting parameters.
+
+This class also stores ProgramData for using the lights in shaders.
 */
 class Lighting
 {
@@ -55,7 +56,8 @@ private:
 public:
        Lighting();
 
-       /** Sets the ambient lighting color.  Affects all surfaces in the scene. */
+       /** Sets the ambient lighting color.  Affects all surfaces in an equal
+       amount. */
        void set_ambient(const Color &);
 
        const Color &get_ambient() const { return ambient; }
index 98baaa54ff2faf41b7975427dc4412306ac2e906..ff7f53c0d3ffdb23acf15f55c649f6aacaa1708d 100644 (file)
@@ -13,6 +13,9 @@ namespace GL {
 
 class Sampler;
 
+/**
+Base class for materials.  Subclasses provide different shading models.
+*/
 class Material
 {
 private:
@@ -75,15 +78,21 @@ protected:
 public:
        virtual ~Material() = default;
 
+       /** Returns a shader appropriate for this material.  The same shader is
+       returned for materials with the same set of features.  Additional
+       specialization values can be passed in to customize the shader. */
        virtual const Program *create_compatible_shader(const std::map<std::string, int> & = std::map<std::string, int>()) const;
 protected:
        virtual void fill_program_info(std::string &, std::map<std::string, int> &) const = 0;
 
 public:
-       /** Returns the uniforms for the material. */
+       /** Returns the uniform values for the material. */
        const ProgramData &get_shader_data() const { return shdata; }
 
+       /** Returns texture tags used by the material.  The returned array is
+       terminated by an empty tag. */
        virtual const Tag *get_texture_tags() const = 0;
+
        virtual const Texture *get_texture(Tag) const = 0;
        virtual const Sampler *get_sampler(Tag) const { return sampler; }
 
index 9669bc35a3a1086e117c73cc8aa2e2f4d677d315..18719bd44e98f8616f2fb7e2e85aac79d2baccda 100644 (file)
@@ -8,6 +8,15 @@ namespace GL {
 
 class Texture2D;
 
+/**
+A physically-based material using the Cook-Torrance BRDF.
+
+The material is characterized by base color, metalness and roughness.  Fully
+metallic materials have no diffuse reflection and their specular reflection is
+tinted by the base color.  For fully dielectric materials base color determines
+the color of the diffuse reflection; specular reflection is untinted.
+Roughness affects how blurry specular reflections are.
+*/
 class PbrMaterial: public Material
 {
 public:
index ed9789c7b0d2de622bc04e61800205260347dc0d..a49fbe0ef3de09b462cc54c44ad0d5e40b653be8 100644 (file)
@@ -43,7 +43,10 @@ public:
        void set_position(const Vector3 &);
        const Vector3 &get_position();
 
+       /** Sets the constant, linear and quadratic attentuation factors for the
+       light. */
        void set_attenuation(float, float, float);
+
        const float *get_attenuation() const { return attenuation; }
 
 protected:
index 94f716a41c871d4705f76bc585ad493087379fa6..9d9ae6725437161355c605250bb00128d95c26f9 100644 (file)
@@ -17,8 +17,11 @@ class Sampler;
 class Texture;
 
 /**
-Encapsulates the data that determines the appearance of a rendered surface.
-This includes shader and data for it, material and texturing.
+Describes the appearance of a surface with a shader, uniform values and
+textures.
+
+A Material can be used to automatically populate most of the fields of a
+RenderMethod.
 */
 class RenderMethod
 {
@@ -91,11 +94,17 @@ private:
        void set_material_textures();
 
 public:
+       /** Sets the shader program and uniform values. */
        void set_shader_program(const Program *, const ProgramData *);
+
        const Program *get_shader_program() const { return shprog; }
        const ProgramData *get_shader_data() const { return shdata.get(); }
        Tag get_slotted_uniform_tag(Tag) const;
+
+       /** Sets a Material to use as a basis for the render method.  If a shader
+       has not been explicitly set, the material's shader will be used. */
        void set_material(const Material *);
+
        const Material *get_material() const { return material; }
        const std::string &get_material_slot_name() const { return material_slot; }
        void set_texture(Tag, const Texture *, const Sampler * = 0);
@@ -104,9 +113,17 @@ public:
        CullMode get_face_cull() const { return face_cull; }
        void set_blend(const Blend &);
        const Blend &get_blend() const { return blend; }
+
+       /** Toggles shadows on objects using this render method.  Only affects
+       shaders created from materials.  A ShadowMap effect is required. */
        void set_receive_shadows(bool);
+
        bool get_receive_shadows() const { return receive_shadows; }
+
+       /** Toggles the use of an environment map as a light source.  Only affects
+       shaders created from materials.  An EnvironmentMap effect is required. */
        void set_image_based_lighting(bool);
+
        bool get_image_based_lighting() const { return image_based_lighting; }
 
        void apply(Renderer &) const;
index 11641fa15be3a0b78de657af3669f0f399c12208..f4f1086d32c68acd4aca0b557dd4d68b03551aa3 100644 (file)
@@ -6,6 +6,10 @@
 namespace Msp {
 namespace GL {
 
+/**
+A material which performs no lighting calculations at all.  Useful for HUD
+graphics.
+*/
 class UnlitMaterial: public Material
 {
 public:
index 0dd599298b3baed315f6d647cd932150feaa2511..ed81a9511b3fcd9640fa4170f5adf28c23091a34 100644 (file)
@@ -8,6 +8,20 @@
 namespace Msp {
 namespace GL {
 
+/**
+Represents a point of view in 3D space.
+
+A Camera provides two matrices.  The view matrix is the inverse of the camera's
+model matrix and transforms coordinates from world space to eye space (the
+camera's object space).  The projection matrix transforms coordinates from eye
+space to clip space. 
+
+Orientation of the Camera is determined by look direction and up direction.
+Look direction corresponds to the negative Z axis direction in eye space.  The
+YZ plane of eye space is aligned to the plane formed by the look and up
+directions.  Setting the up direction to the opposite of gravity direction is
+an easy way to keep the camera upright.
+*/
 class Camera: public Placeable
 {
 public:
@@ -47,12 +61,26 @@ private:
 public:
        Camera();
 
+       /** Sets the camera projection to perspective, characterised by the vertical
+       field of view.  Horizontal FoV is computed with the aspect ratio. */
        void set_field_of_view(const Geometry::Angle<float> &);
+
+       /** Sets the camera projection to orthogonal, characterized by the size of
+       the projection region. */
        void set_orthographic(float, float);
+
        void set_aspect_ratio(float);
        void set_depth_clip(float, float);
+
+       /** Sets the direction of the frustum axis, which corresponds to the center
+       of the screen.  The offset is expressed in terms of the neutral frustum such
+       that -1 is the left or bottom edge and 1 is the right or top edge. */
        void set_frustum_axis(float, float);
+
+       /** Apply a rotation to the view frustum after projection.  This can be used
+       with rotated displayes without affecting the camera's orientation. */
        void set_frustum_rotation(const Geometry::Angle<float> &);
+
        const Geometry::Angle<float> &get_field_of_view() const { return fov; }
        bool is_orthographic() const { return fov==Geometry::Angle<float>::zero(); }
        float get_orthographic_width() const { return height*aspect; }
@@ -91,6 +119,7 @@ public:
        Vector4 unproject(const Vector4 &) const;
        Vector3 unproject(const Vector3 &) const;
 
+       /** Returns a ProgramData object containing the camera matrices. */
        const ProgramData &get_shader_data() const { return shdata; }
 
 private:
index 0965499fe66f98de6268619a189f80d253d91800..d793ce2ed229cd8159ac9fc2504c9c1d0472a854 100644 (file)
@@ -15,10 +15,14 @@ class Object;
 class ObjectInstance;
 
 /**
-Renders multiple instances of an Object in an efficient manner.  If instanced
-rendering is supported, only one draw call per Batch needs to be issued.
+Renders multiple instances of an Object in an efficient manner.
 
-Changing the Mesh of the Object while an InstanceArray exists is not supported.
+The instance specific transform is passed to the shader in an attribute with
+the name instance_transform.  The attribute should have the type vec4[3].  Each
+elements of the array corresponds to a row of the transform matrix.
+
+If the Mesh or Technique of the Object is changed during the lifetime of the
+InstanceArray, behaviour is undefined.
 */
 class InstanceArray: public Renderable
 {
@@ -51,6 +55,8 @@ public:
 
        void set_matrix_attribute(const std::string &);
 
+       /** Adds a new instance to the array.  The instance class must have a
+       constructor taking a const reference to Object as its sole parameter. */
        template<typename T = ObjectInstance>
        T &append();
 private:
index b6bd3a69d9b5c00ff74a14233963a11787eb70fb..7d9f1619d58e5846759a68cc753f9951ad3808b6 100644 (file)
@@ -14,16 +14,19 @@ class ObjectInstance;
 class Technique;
 
 /**
-Combines a Mesh with a Technique to give it an appearance.  The Technique will
-define which render passes the Object supports.
+Combines a Mesh with a Technique for a complete model.
 
-In many cases, it's desirable to include multiple copies of an Object in a
-Scene, with different model matrices.  ObjectInstances can be used to alter the
-rendering of an object on a per-instance basis.
+An object does not have a model matrix and will be rendered at origin if used
+by itself.  The ObjectInstance class provides a way to position objects in a
+scene and customize them in other ways.
 
-Objects can have multiple levels of detail.  The most detailed level has index
-0, with increasing indices having less detail.  When rendering an instance, the
-instance's get_level_of_detail method is called to determine which LoD to use.
+Objects can have multiple levels of detail, with different resources.  The most
+detailed level has index 0, with increasing indices having less detail.  When
+rendering an instance, the instance's get_level_of_detail method is called to
+determine which LoD to use.
+
+An Object can be rendered with any tag its Technique supports.  Unknown tags
+are silently ignored.
 */
 class Object: public Renderable, private ResourceObserver
 {
@@ -83,8 +86,9 @@ public:
        /** Sets the mesh for the highest level of detail (index 0). */
        void set_mesh(const Mesh *m) { set_mesh(0, m); }
 
-       /** Sets the mesh for a given level of detail.  Previous LoDs must have been
-       defined. */
+       /** Sets the mesh for a specific level of detail.  LoDs must be defined in
+       order, without gaps.  If this call creates a new LoD, technique is copied
+       from the previous one. */
        void set_mesh(unsigned, const Mesh *);
 
 private:
@@ -95,8 +99,9 @@ public:
        /** Sets the technique for the highest level of detail (index 0). */
        void set_technique(const Technique *t) { set_technique(0, t); }
 
-       /** Sets the technique for a given level of detail.  Previous LoDs must have
-       been defined. */
+       /** Sets the technique for a specific level of detail.  LoDs must be defined
+       in order, without gaps.  If this call creates a new LoD, mesh is copied from
+       the previous one. */
        void set_technique(unsigned, const Technique *);
 
        const Technique *get_technique(unsigned = 0) const;
index b1501a7bc82f06afc9277ec53f8a4df624af7e32..5c36113daee00c89d7d9c8ba9a4931a603f584c9 100644 (file)
@@ -9,9 +9,11 @@ namespace Msp {
 namespace GL {
 
 /**
-Represents a single instance of an Object.  Thanks to being derived from
-Placeable in can be positioned without additional effort.  Other instance
-parameters can be set by overriding the hook functions.
+Represents a single instance of an Object.  A model matrix is provided through
+the Placeable base class.
+
+The state used to render the object can be customized by overriding the
+setup_render() and finish_render() functions.
 */
 class ObjectInstance: public PlacedRenderable
 {
@@ -46,6 +48,8 @@ public:
        anything. */
        virtual void finish_render(Renderer &, Tag) const { }
 
+       /** Returns the level of detail to render this instance with.  This function
+       should apply LoD bias from the Renderer if desired. */
        virtual unsigned get_level_of_detail(const Renderer &) const;
 };
 
index 4d56db7a1ff6c565585a2dbd7d006a206d6c46d0..2e24db5ed87faaa69813ae776e37a28e765d43fa 100644 (file)
@@ -15,8 +15,11 @@ class Mesh;
 class Program;
 
 /**
-A scene that performs occlusion queries on renderables to skip those that are
+A scene which performs occlusion queries on renderables to skip those which are
 entirely occluded by others.
+
+Renderables must have valid model matrices and bounding spheres to participate
+in occlusion culling.  Those lacking one or both are always rendered.
 */
 class OccludedScene: public Scene
 {
index 3de47f10b9a2a8f3ad22f0d4387de7d2b336b812..0801c3bfa9cbd3b6bf2aacb29a71240dc4d44dd1 100644 (file)
@@ -9,6 +9,9 @@ namespace GL {
 class Framebuffer;
 class RenderTarget;
 
+/**
+A View targeting an offscreen framebuffer.
+*/
 class OffscreenView: public View
 {
 public:
index be17e2206e3451b6ac214d754ddca28fc66ed3d9..a4e5631bf337f852c166e752016ad725f9cd1104 100644 (file)
@@ -8,8 +8,7 @@ namespace Msp {
 namespace GL {
 
 /**
-A scene that renders its contents in a specific order.  Inserting Renderables
-in the middle and removing them are O(N) operations.
+A scene which renders its contents in a specific order.
 */
 class OrderedScene: public Scene
 {
index 6cb372354439bbdff1d7531186075e08f460dfb3..9d0c2dd7703fd38b86df2cea5ca93f11a319ed9a 100644 (file)
@@ -27,6 +27,10 @@ public:
 };
 
 
+/**
+An intermediate base class combining the functionality of Renderable and
+Placeable.
+*/
 class PlacedRenderable: public Renderable, public Placeable
 {
 protected:
index 4e8ee37302a90b23a7d64f05cd4ce7cb024586f2..9d08219ef84368943f6cb4535466bc61a1c742af 100644 (file)
@@ -26,10 +26,11 @@ class UniformBlock;
 struct Color;
 
 /**
-Stores uniform variables for shader programs.  The uniforms are stored in a
-program-independent way, and UniformBlocks are created to match the uniform
-layouts of different programs.  If multiple programs have the same layout, the
-same block is used for them.
+Stores uniform values for shader programs.
+
+The uniforms are stored in a program-independent way, and UniformBlocks are
+created to match the uniform layouts of different programs.  If multiple
+programs have the same layout, the same block is used for them.
 
 The class is optimized for an access pattern where the set of uniforms and
 programs stays constants, with only the values changing.
@@ -243,6 +244,8 @@ private:
 
        std::vector<ProgramBlock>::const_iterator prepare_program(const Program &) const;
 public:
+       /** Creates or updates UniformBlocks for a specific program if necessary,
+       then sets them to the PipelineState. */
        void apply(const Program &, PipelineState &) const;
 
        void set_debug_name(const std::string &);
index a8da643029ae03ed5739522431ffd46f5740a1c7..dcb7edd59cc474e97996cd056a3162fe415596aa 100644 (file)
@@ -11,18 +11,19 @@ class Matrix;
 class Renderer;
 
 /**
-Base class for renderable objects.  Rendering is performed with the help of a
-Renderer object.
+Base class for things which can be rendered.  Rendering is performed with the
+help of the Renderer class.
 
-The render method takes a Tag to identify a render method.  It can be used with
-a Technique to select alternative rendering methods, such as simplified shaders
-for a depth-only shadow pass.
+The tag parameter of render() can be used to choose between different render
+methods, such as simplified shaders for a depth-only shadow pass.  Typically
+tags are defined using a Sequence.
 
-The setup_frame and finish_frame methods provide a mechanism for performing
+The setup_frame() and finish_frame() functions can be overridden to perform
 once-per-frame operations.  This is most useful for effects, which may need to
-do auxiliary rendering.  With complex rendering hierarchies, these methods may
-be called multiple times for one frame, but it's guaranteed that no rendering
-will occur before a setup_frame call or after a finish_frame call.
+prepare textures or other data before actual rendering happens.  With complex
+rendering graphs, these functions may be called multiple times for one frame,
+but it's guaranteed that no render() calls will occur before a setup_frame()
+call or after a finish_frame() call.
 */
 class Renderable
 {
@@ -47,7 +48,7 @@ public:
        /** Called when a complete frame has been rendered. */
        virtual void finish_frame() { }
 
-       /** Renders the Renderable.  Implementors should take care to return the
+       /** Renders the Renderable.  Subclasses should take care to return the
        renderer to the state it was in, for example by using Renderer::Push. */
        virtual void render(Renderer &, Tag = Tag()) const = 0;
 };
index eb23e96dab8deb8d8c10ec384bca387ef21b7085..001ec7e1ca11864c172cef70219872de36fdbb6d 100644 (file)
@@ -27,22 +27,24 @@ class Texture;
 class VertexSetup;
 
 /**
-A class for supervising the rendering process.  While many Renderables (in
-particular, Objects and Scenes) can by rendered without a Renderer, using one
-will often be more efficient.  This is especially true for ObjectInstances.
-
-The Renderer works by deferring GL state changes until something is actually
-being drawn.  This avoids many unnecessary GL calls if consecutive renderables
-use the same resources.
-
-A state stack is provided to help with state scoping.  Typically a Renderable
-will push the current state on entry, set whatever state it requires, render
-itself, and pop the state when it's done.  An RAII helper class is provided for
-the push/pop operation.
+Rendering supervisor.  This is the primary interface for setting state and
+issuing draw commands.
+
+The Renderer class allows setting textures and uniform values by names (using
+ProgramData for the latter).  The names are resolved into binding points when
+the resources are needed for a draw command.
+
+A state stack is provided to help with state management in render graphs.
+Renderables can save the state by pushing it on the stack before beginning
+their work, and pop it afterwards to restore it without disturbing state set
+by outer scopes.
 */
 class Renderer
 {
 public:
+       /**
+       RAII helper class for pushing state on the stack.
+       */
        class Push
        {
        private:
@@ -137,13 +139,13 @@ public:
 
        DEPRECATED void set_lighting(const Lighting *);
 
-       /** Sets the shader program to use.  An initial set of data can be set as
-       well, with the same semantics as add_shader_data. */
+       /** Sets the shader program to use.  As a convenience, uniform values may be
+       specified at the same time. */
        void set_shader_program(const Program *prog, const ProgramData *data = 0);
 
-       /** Adds another set of data to be use with shader programs.  The data is
-       independent of any shader program changes and remains in effect until the
-       Renderer state is popped. */
+       /** Adds uniform values, which will be available for shader programs.  If
+       multiple ProgramData objects with the same uniforms are added, the one added
+       last will be used. */
        void add_shader_data(const ProgramData &data);
 
        DEPRECATED void flush_shader_data() { flush_shader_data_(); }
@@ -176,10 +178,15 @@ public:
 
        void clear(const ClearValue *);
 
+       /** Draws a batch of primitives.  A shader must be active. */
        void draw(const Batch &);
+
+       /** Draws multiple instances of a batch of primitives.  A shader must be active. */
        void draw_instanced(const Batch &, unsigned);
 
-       void resolve_multisample(Framebuffer &);
+       /** Resolves multisample attachments from the active framebuffer into
+       target. */
+       void resolve_multisample(Framebuffer &target);
 
        void begin_query(const QueryPool &, unsigned);
        void end_query(const QueryPool &, unsigned);
index bad7845c4064d1bb1c7993a97565a8aa071db81c..98189e78d17731215b096be9513846e1caa9a733 100644 (file)
@@ -9,6 +9,12 @@ namespace GL {
 class Texture;
 class Texture2D;
 
+/**
+Wraps a Framebuffer and its attachments for easier management.
+
+All attachments will be created as 2D or 2D multisample textures, depending on
+the sample count of the format.
+*/
 class RenderTarget
 {
 private:
index f89f10daf26691412de2f950925b11b524d9c783..692dcd0dfc6c7ebf88e0e8c7f0b26d7c0aae4b33 100644 (file)
@@ -11,9 +11,15 @@ namespace Msp {
 namespace GL {
 
 /**
-Scenes are containers for other Renderables.  This is a base class that can't
-be instantiated.  Examples of available Scene types are SimpleScene,
-InstancedScene and OrderedScene.
+Container for other renderables.  Subclasses provide different ways of
+rendering the contents.
+
+All types of Scenes perform frustum culling on the contents, skipping
+renderables whose bounding sphere is fully outside the view volume.  If a
+bounding sphere cannot be determined, culling is not performed on that
+renderable.
+
+SimpleScene is a good default choice if there are no specific requirements.
 */
 class Scene: public Renderable
 {
index dd9fd8849b62b47f338970bdb9206f240c4470b6..b6a8cb34a158271468e3b9195b10709a93728b93 100644 (file)
@@ -16,18 +16,23 @@ class PostProcessor;
 class RenderTarget;
 
 /**
-Top-level content class.  Typically a Sequence is used as the content
-Renderable for a View or effects such as ShadowMap or EnvironmentMap.
+Top-level content class.  Typically a Sequence is used as content for a View
+or sideband content for effects such as ShadowMap or EnvironmentMap.
 
 A Sequence consists of a number of steps.  Each step is defined with a
-Renderable and a tag to render it with and may also have Lighting, DepthTest
-and Blend states.  Scenes can be used to further organize Renderables within a
-step.
+Renderable and a tag to render it with.  Lighting, DepthTest and StencilTest
+states may also be applied to steps.  Scenes can be used to organize multiple
+Renderables within a step.
+
+The target framebuffer can optionally be cleared before the first step.
 
 PostProcessors can be applied after all of the steps in the Sequence have been
 processed.  Framebuffer objects are automatically used to pass render results
-to the PostProcessors.  High dynamic range and multisample rendering can be
-requested for increased quality.
+to the PostProcessors.  The Sequence must be created with a size and a frame
+format.
+
+A Sequence itself is normally rendered with an empty tag.  A special "noclear"
+tag can be used to suppress clearing.
 */
 class Sequence: public Renderable
 {
@@ -94,12 +99,13 @@ public:
        void set_clear_stencil(int);
 
        /** Adds a step to the sequence.  It's permissible to add the same
-       Renderable multiple times. */
+       Renderable or tag multiple times. */
        Step &add_step(Tag, Renderable &);
 
        const std::vector<Step> &get_steps() const { return steps; }
 
-       /** Adds a postprocessor to the sequence. */
+       /** Adds a postprocessor to the sequence.  A render target format must be
+       defined. */
        void add_postprocessor(PostProcessor &);
 
        const std::vector<PostProcessor *> &get_postprocessors() const { return postproc; }
index ccca360a5c1275f44aedc897ed6f097dd38f68c0..ce2a154642cda385ab502af5b35ab217ab6867be 100644 (file)
@@ -8,7 +8,7 @@ namespace Msp {
 namespace GL {
 
 /**
-A simple yet efficient scene.  Rendering order is unspecified.
+A simple scene which renders its contents in an unspecified order.
 */
 class SimpleScene: public Scene
 {
index c007c81f8aeaee0c9813dbf66915ccdd12814400..b4fc8f52e9aae3ddc2aae3344dce51b3e567804e 100644 (file)
@@ -10,9 +10,13 @@ namespace Msp {
 namespace GL {
 
 /**
-Creates an object consisting of the visual representation of a string.  If you
-derive from Text to customize it, make sure you call Text::setup_render or
-otherwise bind the appropriate texture.
+Creates a Mesh and an Object for rendering text.
+
+The mesh is created with a font size of 1 unit.  Set the Text's model matrix to
+scale it to the desired size.
+
+If you derive from Text to customize it, make sure you call Text::setup_render
+or otherwise set the appropriate texture to the Renderer.
 */
 class Text: public ObjectInstance
 {
@@ -46,14 +50,14 @@ public:
 
        const Mesh *get_mesh() const { return &mesh; }
 
-       /** Sets technique to render with, replacing the given texture slot with
+       /** Sets technique to render with, along with the texture slot to use for
        the font texture.  If no texture slot is specified, heuristics are used to
        choose a suitable one. */
        void set_technique(const Technique *, Tag = Tag());
 
        const Technique *get_technique() const { return object.get_technique(); }
 
-       /// Sets the string to be displayed.
+       /** Sets the string to be displayed, with an explicit character encoding. */
        void set_text(const std::string &, StringCodec::Decoder &);
 
        template<typename C>
@@ -63,13 +67,14 @@ public:
                set_text(t, dec);
        }
 
+       /** Sets the string to be displayed, with UTF-8 encoding. */
        void set_text(const std::string &t)
        { set_text<StringCodec::Utf8>(t); }
 
-       /// Clears the object's contents.
+       /** Clears any previous contents. */
        void clear();
 
-       /// Sets horizontal and vertical alignment with predefined anchors.
+       /** Sets horizontal and vertical alignment with predefined anchors. */
        void set_alignment(HorizontalAlign, VerticalAlign = BASELINE);
 
        /** Sets horizontal and vertical alignment.  0.0 means left or baseline,
index 9c756bbcdb453c62b1701a8421d3df075c6076f0..23425a86e3dff251322f219c6a337bac27e3bd0d 100644 (file)
@@ -11,7 +11,11 @@ class Renderable;
 class Renderer;
 
 /**
-Manages the presentation of rendering results on the screen.
+An ultimate render target, which is typically visible to the user of the
+application in some way.
+
+The content renderable's render() function is called with an empty tag.  A
+Sequence can be used to specify other tags and add post-processing.
 */
 class View
 {
@@ -29,7 +33,10 @@ public:
        virtual unsigned get_height() const { return target.get_height(); }
        float get_aspect_ratio() const { return static_cast<float>(get_width())/get_height(); }
 
+       /** Sets the camera to render with.  The camera's aspect ratio is set to
+       match that of the view. */
        void set_camera(Camera *);
+
        void set_content(Renderable *);
 
        virtual void render();
index e61107a4790c2d492eda33c89de11af02b0213fa..9646a65d746ebcef6e7e5aa15db422d93dc5d602 100644 (file)
@@ -9,6 +9,14 @@
 namespace Msp {
 namespace GL {
 
+/**
+A view targeting a Graphics::Window.
+
+After rendering, buffers are swapped to show the result in the window.
+
+The aspect ratio of the view's Camera is automatically updated to match that of
+the window.
+*/
 class WindowView: public View, public sigc::trackable
 {
 private:
index 749a97052e8010ad8097e0fcc5f2034d019a6341..277d62cf7ac080ed8aa70d4b132e1f4bbf636f48 100644 (file)
@@ -22,8 +22,11 @@ enum DepthReference
 };
 
 /**
-Sorts renderables by their distance from the camera before rendering.  Requires
-renderables to have a matrix.
+A scene which sorts renderables by their distance from the camera before
+rendering.
+
+Renderables must have valid model matrices to be sorted.  Those without a
+matrix are sorted as closest to the camera.
 */
 class ZSortedScene: public Scene
 {
index f1aec26b283b2d6cb871f551e84456ffcc8e6b1e..589ea5ae78d9f758b30fd2d65b55964983c09f1a 100644 (file)
@@ -16,8 +16,44 @@ class Scene;
 class Texture2D;
 
 /**
-A collection class for GL resources.  Most useful as a base class for an
-application-specific collection.
+A collection class for GL resources.
+
+The following types of objects can be loaded:
+Animation                          .anim
+Armature                           .arma
+BasicMaterial (Material)           .mat
+Camera                             .camera
+DirectionalLight (Light)           .light
+Font                               .font
+KeyFrame                           .kframe
+Lighting                           .lightn
+Mesh                               .mesh
+Module                             .glsl .spv
+Object (Renderable)                .object
+OccludedScene (Scene, Renderable)  .scene
+OrderedScene (Scene, Renderable)   .scene
+PbrMaterial (Material)             .mat
+PointLight (Light)                 .light
+SequenceTemplate                   .seq
+Pose                               .pose
+Program                            .shader
+Sampler                            .samp
+SimpleScene (Scene, Renderable)    .scene
+Technique                          .tech
+Texture1D (Texture)                .tex
+Texture2D (Texture)                .tex .png .jpg
+Texture3D (Texture)                .tex
+TextureCube (Texture)              .tex
+Texture2DArray (Texture)           .tex
+UnlitMaterial (Material)           .mat
+ZSortedScene (Scene, Renderable)   .scene
+
+This class is normally used by deriving from it and adding any necessary data
+sources in the derived class.
+
+A ResourceManager can be set to manage objects derived from Resource.  Bulk
+data for those objects will then be loaded in the background, without blocking
+the main thread.
 */
 class Resources: virtual public DataFile::Collection
 {