Skip to main content
Notice removed Draw attention by MattMatt
Bounty Ended with Miklas's answer chosen by MattMatt
Tweeted twitter.com/#!/StackCodeReview/status/632856593957318656
added 49 characters in body
Source Link
MattMatt
  • 603
  • 8
  • 18

PS: Is the term "ShaderBatch" appropriate ?

PS: Is the term "ShaderBatch" appropriate ?

Notice added Draw attention by MattMatt
Bounty Started worth 50 reputation by MattMatt
deleted 250 characters in body; edited title
Source Link
Jamal
  • 35.2k
  • 13
  • 134
  • 238

A basic Opengl Basic OpenGL Renderer

I recently added this ShaderBatch to my engine, which takes care of rendering objects which share the same render technique  (shader) :, like billboards, and lights, ... I would like to ask you to point out, if there would beare any relevant changes I coulcould make to my this class : here is my code :.

ShaderBatch.h :ShaderBatch.h:

    /*
     * ShaderTechnique.h
     *
     *  Created on: Aug 9, 2015
     *      Author: mattmatt
     */
    
    #pragma once
    
    #include "alpha/Shader.h"
    #include "alpha/Light.h"
    #include "alpha/Camera.h"
    #include "alpha/Transform.h"
    #include <glm/glm.hpp>
    
    class ShaderBatch {
    public:
        ShaderBatch();
        virtual ~ShaderBatch(){}
    
        void SetMatrices(const Camera& camera, const Transform& transform);
    
        void Begin();
        void End();
    protected:
        Shader m_shader;
        Camera m_camera;
        Transform m_transform;
    };
    
    class LightBatch : public ShaderBatch{
    public:
        LightBatch();
        virtual ~LightBatch(){}
    
        void SetMaterial(Material material){
            m_material = material;
        }
        void SetPointLight(PhongLight light){
            m_light = light;
        }
        void SetCameraPosition(glm::vec3 pos){
            m_camPosition = pos;
        }
    
        void Begin();
        void End();
    
    private:
        Material m_material;
        PhongLight m_light;
        glm::vec3 m_camPosition;
    };
ShaderBatch.cpp : 
#include "ShaderBatch.h"

ShaderBatch::ShaderBatch(){}

void ShaderBatch::SetMatrices(const Camera& camera, const Transform& transform){
    m_camera = camera;
    m_transform = transform;
}

void ShaderBatch::Begin(){
     m_shader->Bind();
         m_camera.SetUniforms(m_shader, m_transform);
}

void ShaderBatch::End(){}

LightBatch::LightBatch()
    : ShaderBatch(),
      m_material(CreateTexture("res/images/Debug.png")),
      m_light(PhongLight()),
      m_camPosition(glm::vec3(0.0, 0.0, 0.0))
{
    ShaderBatch::m_shader = CreateShader("res/shaders/basicShader.glslv", "res/shaders/phongShader.glslf");
}

void LightBatch::Begin(){
    ShaderBatch::Begin();
        m_material.Bind(ShaderBatch::m_shader);
            m_material.SetUniforms(ShaderBatch::m_shader);
            m_light.SetUniforms(m_shader);
}

void LightBatch::End(){}

and main.cpp :ShaderBatch.cpp:

#include "ShaderBatch.h"

ShaderBatch::ShaderBatch(){}

void ShaderBatch::SetMatrices(const Camera& camera, const Transform& transform){
    m_camera = camera;
    m_transform = transform;
}

void ShaderBatch::Begin(){
     m_shader->Bind();
         m_camera.SetUniforms(m_shader, m_transform);
}

void ShaderBatch::End(){}

LightBatch::LightBatch()
    : ShaderBatch(),
      m_material(CreateTexture("res/images/Debug.png")),
      m_light(PhongLight()),
      m_camPosition(glm::vec3(0.0, 0.0, 0.0))
{
    ShaderBatch::m_shader = CreateShader("res/shaders/basicShader.glslv", "res/shaders/phongShader.glslf");
}

void LightBatch::Begin(){
    ShaderBatch::Begin();
        m_material.Bind(ShaderBatch::m_shader);
            m_material.SetUniforms(ShaderBatch::m_shader);
            m_light.SetUniforms(m_shader);
}

void LightBatch::End(){}

main.cpp:

A basic Opengl Renderer

I recently added this ShaderBatch to my engine, which takes care of rendering objects which share the same render technique(shader) : like billboards, lights, ... I would like to ask you to point out, if there would be any relevant changes I coul make to my this class : here is my code :

ShaderBatch.h :

    /*
     * ShaderTechnique.h
     *
     *  Created on: Aug 9, 2015
     *      Author: mattmatt
     */
    
    #pragma once
    
    #include "alpha/Shader.h"
    #include "alpha/Light.h"
    #include "alpha/Camera.h"
    #include "alpha/Transform.h"
    #include <glm/glm.hpp>
    
    class ShaderBatch {
    public:
        ShaderBatch();
        virtual ~ShaderBatch(){}
    
        void SetMatrices(const Camera& camera, const Transform& transform);
    
        void Begin();
        void End();
    protected:
        Shader m_shader;
        Camera m_camera;
        Transform m_transform;
    };
    
    class LightBatch : public ShaderBatch{
    public:
        LightBatch();
        virtual ~LightBatch(){}
    
        void SetMaterial(Material material){
            m_material = material;
        }
        void SetPointLight(PhongLight light){
            m_light = light;
        }
        void SetCameraPosition(glm::vec3 pos){
            m_camPosition = pos;
        }
    
        void Begin();
        void End();
    
    private:
        Material m_material;
        PhongLight m_light;
        glm::vec3 m_camPosition;
    };
ShaderBatch.cpp : 
#include "ShaderBatch.h"

ShaderBatch::ShaderBatch(){}

void ShaderBatch::SetMatrices(const Camera& camera, const Transform& transform){
    m_camera = camera;
    m_transform = transform;
}

void ShaderBatch::Begin(){
     m_shader->Bind();
         m_camera.SetUniforms(m_shader, m_transform);
}

void ShaderBatch::End(){}

LightBatch::LightBatch()
    : ShaderBatch(),
      m_material(CreateTexture("res/images/Debug.png")),
      m_light(PhongLight()),
      m_camPosition(glm::vec3(0.0, 0.0, 0.0))
{
    ShaderBatch::m_shader = CreateShader("res/shaders/basicShader.glslv", "res/shaders/phongShader.glslf");
}

void LightBatch::Begin(){
    ShaderBatch::Begin();
        m_material.Bind(ShaderBatch::m_shader);
            m_material.SetUniforms(ShaderBatch::m_shader);
            m_light.SetUniforms(m_shader);
}

void LightBatch::End(){}

and main.cpp :

Basic OpenGL Renderer

I recently added this ShaderBatch to my engine, which takes care of rendering objects which share the same render technique  (shader), like billboards and lights. I would like you to point out if there are any relevant changes I could make to my class.

ShaderBatch.h:

/*
 * ShaderTechnique.h
 *
 *  Created on: Aug 9, 2015
 *      Author: mattmatt
 */

#pragma once

#include "alpha/Shader.h"
#include "alpha/Light.h"
#include "alpha/Camera.h"
#include "alpha/Transform.h"
#include <glm/glm.hpp>

class ShaderBatch {
public:
    ShaderBatch();
    virtual ~ShaderBatch(){}

    void SetMatrices(const Camera& camera, const Transform& transform);

    void Begin();
    void End();
protected:
    Shader m_shader;
    Camera m_camera;
    Transform m_transform;
};

class LightBatch : public ShaderBatch{
public:
    LightBatch();
    virtual ~LightBatch(){}

    void SetMaterial(Material material){
        m_material = material;
    }
    void SetPointLight(PhongLight light){
        m_light = light;
    }
    void SetCameraPosition(glm::vec3 pos){
        m_camPosition = pos;
    }

    void Begin();
    void End();

private:
    Material m_material;
    PhongLight m_light;
    glm::vec3 m_camPosition;
};

ShaderBatch.cpp:

#include "ShaderBatch.h"

ShaderBatch::ShaderBatch(){}

void ShaderBatch::SetMatrices(const Camera& camera, const Transform& transform){
    m_camera = camera;
    m_transform = transform;
}

void ShaderBatch::Begin(){
     m_shader->Bind();
         m_camera.SetUniforms(m_shader, m_transform);
}

void ShaderBatch::End(){}

LightBatch::LightBatch()
    : ShaderBatch(),
      m_material(CreateTexture("res/images/Debug.png")),
      m_light(PhongLight()),
      m_camPosition(glm::vec3(0.0, 0.0, 0.0))
{
    ShaderBatch::m_shader = CreateShader("res/shaders/basicShader.glslv", "res/shaders/phongShader.glslf");
}

void LightBatch::Begin(){
    ShaderBatch::Begin();
        m_material.Bind(ShaderBatch::m_shader);
            m_material.SetUniforms(ShaderBatch::m_shader);
            m_light.SetUniforms(m_shader);
}

void LightBatch::End(){}

main.cpp:

Source Link
MattMatt
  • 603
  • 8
  • 18

A basic Opengl Renderer

I recently added this ShaderBatch to my engine, which takes care of rendering objects which share the same render technique(shader) : like billboards, lights, ... I would like to ask you to point out, if there would be any relevant changes I coul make to my this class : here is my code :

ShaderBatch.h :

    /*
     * ShaderTechnique.h
     *
     *  Created on: Aug 9, 2015
     *      Author: mattmatt
     */
    
    #pragma once
    
    #include "alpha/Shader.h"
    #include "alpha/Light.h"
    #include "alpha/Camera.h"
    #include "alpha/Transform.h"
    #include <glm/glm.hpp>
    
    class ShaderBatch {
    public:
        ShaderBatch();
        virtual ~ShaderBatch(){}
    
        void SetMatrices(const Camera& camera, const Transform& transform);
    
        void Begin();
        void End();
    protected:
        Shader m_shader;
        Camera m_camera;
        Transform m_transform;
    };
    
    class LightBatch : public ShaderBatch{
    public:
        LightBatch();
        virtual ~LightBatch(){}
    
        void SetMaterial(Material material){
            m_material = material;
        }
        void SetPointLight(PhongLight light){
            m_light = light;
        }
        void SetCameraPosition(glm::vec3 pos){
            m_camPosition = pos;
        }
    
        void Begin();
        void End();
    
    private:
        Material m_material;
        PhongLight m_light;
        glm::vec3 m_camPosition;
    };
ShaderBatch.cpp : 
#include "ShaderBatch.h"

ShaderBatch::ShaderBatch(){}

void ShaderBatch::SetMatrices(const Camera& camera, const Transform& transform){
    m_camera = camera;
    m_transform = transform;
}

void ShaderBatch::Begin(){
     m_shader->Bind();
         m_camera.SetUniforms(m_shader, m_transform);
}

void ShaderBatch::End(){}

LightBatch::LightBatch()
    : ShaderBatch(),
      m_material(CreateTexture("res/images/Debug.png")),
      m_light(PhongLight()),
      m_camPosition(glm::vec3(0.0, 0.0, 0.0))
{
    ShaderBatch::m_shader = CreateShader("res/shaders/basicShader.glslv", "res/shaders/phongShader.glslf");
}

void LightBatch::Begin(){
    ShaderBatch::Begin();
        m_material.Bind(ShaderBatch::m_shader);
            m_material.SetUniforms(ShaderBatch::m_shader);
            m_light.SetUniforms(m_shader);
}

void LightBatch::End(){}

and main.cpp :

#include "alpha.h"

#include <btBulletCollisionCommon.h>
#include <btBulletDynamicsCommon.h>

#include "ShaderBatch.h"

static const unsigned WIDTH = 1000.0;
static const unsigned HEIGHT = 900.0;

int main(int argc, char **args){

    Window window(200, 10, WIDTH, HEIGHT, "Alpha engine - release alpha 0.0", true, false);
    window.SetMouseVisible(false);

    Mesh box1 = CreateMesh("res/models/Terrain.obj");

    Shader shader = CreateShader("res/shaders/basicShader.glslv", "res/shaders/phongShader.glslf");

    LightBatch batch;

    Camera camera(glm::vec3(0, 5.0, 2.5), 70.0f, (float)window.GetWidth() / (float)window.GetHeight(), 0.01, 1000.0f);
    Transform transform;
    InputHandler input = InputHandler();
    PhongLight phongLight;
    phongLight.SetPosition(glm::vec3(-1.0f, 5.0f, 1.0f));
    phongLight.SetIntensity(glm::vec3(1.0f, 1.0f, 1.0f));
    phongLight.SetAttenuation(0.01);

    Material material(CreateTexture("res/images/Terrain.jpg"), CreateTexture("res/images/TerrainNormalMap.jpg"));

    bool isRunning = true;
    unsigned FPS = 0;

    transform.GetPos() -= glm::vec3(.0, 8.5, .0);
    transform.GetScale() *= 7;

    util::InMainLoop(2000, isRunning,
    [&](float delta){
        window.Update();
        input.Update();
        isRunning = !(input.CloseRequested() || input.KeyDown(SDL_SCANCODE_ESCAPE));


        if(!input.KeyDown(SDL_SCANCODE_TAB)){
            util::ApplyFreeFPSLook(camera, input, window, delta, 0.01, 5.0, glm::ivec2(WIDTH / 2, HEIGHT / 2));
            window.SetMouseVisible(false);
        }
        else
            window.SetMouseVisible(true);


        if(input.KeyDown(SDL_SCANCODE_RIGHT))
            phongLight.SetPosition(phongLight.GetPosition() += glm::vec3(0.01, 0.0, 0.0));
        if(input.KeyDown(SDL_SCANCODE_LEFT))
            phongLight.SetPosition(phongLight.GetPosition() -= glm::vec3(0.01, 0.0, 0.0));
        if(input.KeyDown(SDL_SCANCODE_UP))
                    phongLight.SetPosition(phongLight.GetPosition() += glm::vec3(0.0, 0.01, 0.0));
        if(input.KeyDown(SDL_SCANCODE_DOWN))
            phongLight.SetPosition(phongLight.GetPosition() -= glm::vec3(0.0, 0.01, 0.0));


        if(input.KeyDown(SDL_SCANCODE_N))
            material = Material(CreateTexture("res/images/Terrain.jpg"),CreateTexture("res/images/TerrainNormalMap.jpg"));
        if(input.KeyDown(SDL_SCANCODE_P))
            material = Material(CreateTexture("res/images/Terrain.jpg") ,CreateTexture("res/images/DefaultNormalMap.jpg"));
        if(input.KeyDown(SDL_SCANCODE_F))
            material = Material(CreateTexture("res/images/Checkered.png") ,CreateTexture("res/images/TerrainNormalMap.jpg"));
        if(input.KeyDown(SDL_SCANCODE_TAB) && input.KeyDown(SDL_SCANCODE_L))
            glDrawMode(GL_LINES);
        if(input.KeyDown(SDL_SCANCODE_TAB) && input.KeyDown(SDL_SCANCODE_S))
                glDrawMode(GL_TRIANGLES);
        if(input.KeyDown(SDL_SCANCODE_TAB) && input.KeyDown(SDL_SCANCODE_P))
                glDrawMode(GL_POINTS);

    },
    [&](){
            window.Clear(.0f, .0f, .0f, .0f);
            /*
            shader->Bind();
            camera.SetUniforms(shader, transform);
            material.SetUniforms(shader);
            phongLight.SetUniforms(shader);

            material.Bind(shader);
*/
            batch.SetMatrices(camera, transform);
            batch.SetMaterial(material);
            batch.SetPointLight(phongLight);
            batch.Begin();

            box1->Draw();

            window.SwapBuffers();
    },
    FPS
    );
    return EXIT_SUCCESS;///YEHE ! EVERYTHING WENT RIGHT !

}