[OpenGL]建立测试环境

文章目录[x]
  1. 1:TestBed
  2. 2:SubTestBed
  3. 3:Usage

在教程中,所有的教学都是以OpenGL原生代码来教学的,并且是以流水线的形式改掉旧代码以达到新知识的目的。但是作为学习者来说,我并不想改掉旧代码,而是想保留之以防不备。所以迫切需要一个测试环境,本人在这里写了一个简单的,供读者参考。

TestBed


class TestBed
{
protected:
    SubTestBed* subTest;

public:
    // 进入游戏循环前
    virtual void Setup()
    {
        subTest->Setup();
    }

    // 游戏循环
    virtual void Render()
    {
        subTest->Render();
    }

    // 结束游戏循环
    virtual void Destroy()
    {
        subTest->Destroy();
    }

    virtual ~TestBed()
    {
        delete subTest;
    }

private: 
    virtual const std::string GetShaderPath(const std::string shaderName) const = 0;
};

 

SubTestBed


class SubTestBed
{
protected:
    
public:
    SubTestBed(const std::string shaderPath)
    {
        
    }

    // 进入游戏循环前
    virtual void Setup()
    {
        
    }

    // 游戏循环
    virtual void Render()
    {
        m_Renderer.Draw(*m_VA, *m_IB, *m_Shader);
    }

    // 结束游戏循环
    virtual void Destroy()
    {
    
    };
};

 

Usage


新建测试类


HelloWorld.h
#ifndef HELLOTWORLD_H
#define HELLOTWORLD_H

#include "../TestBed.h"

class HelloWorld : public TestBed
{
private:
    class FirstTriangle: public SubTestBed
    {
    public:
        FirstTriangle(const std::string shaderPath) : FirstTriangle(shaderPath) { }
    };

public:
    HelloTriangle()
    {
        this->subTest = new FirstTriangle(GetShaderPath("Basic.shader"));
    }

private:
    virtual const std::string GetShaderPath(const std::string shaderName) const override
    {
        return "SandBox/HelloWorld/" + shaderName;
    }

};

#endif // !HELLOTWORLD_H
Application.cpp
int main()
{
    GLFWwindow* window = CreateOpenGLWindow("Application", SRC_WIDTH, SRC_HEIGHT);
    std::cout << glGetString(GL_VERSION) << "\n" << std::endl;

    TestBed* context = new HelloWorld();

    context->Setup(); 

    while (!glfwWindowShouldClose(window))
    {
        processInput(window);
        glClearColor(r, g, b, a);
        glClear(GL_COLOR_BUFFER_BIT);

        context->Render();

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    context->Destroy();
    delete context;

    glfwTerminate();
    return 0;
}

大致思路就是,HelloWorld 作为这一章节要学习的内容,其继承自 TestBed,而这一章节可能有几个阶段或者习题,这样我们为这几个阶段或习题分别建立一个继承自 SubTestBed 类就行了。

Setup()里主要干的事就是生成VAO, VBO, IBO,加载Shader等事情,而Render(),正如代码中所展现的一样,在游戏循环中调用。

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像