游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2565|回复: 2

盖莫游戏引擎2.1.2 GLSL+Light

[复制链接]

56

主题

94

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2010-5-17 18:10:00 | 显示全部楼层 |阅读模式
盖莫游戏引擎2.1.2 GLSL+Light
这几天忙着做项目 引擎进度缓慢
先上封转的GLSL吧(这个是从网上找的一段代码修改的)
如下:
////////////////////////////////////////////////////////////
/// GL着色器基类
////////////////////////////////////////////////////////////
class GLSLShader : public Object
{
public:
////////////////////////////////////////////////////////
/// 构造,析构GL着色器
////////////////////////////////////////////////////////
GLSLShader();
virtual ~GLSLShader();

////////////////////////////////////////////////////////
/// 着色器编译,检测是否编译
////////////////////////////////////////////////////////  
    virtual bool Compile() = 0;
    virtual bool IsCompiled() const = 0;

////////////////////////////////////////////////////////
/// 获取着色器日志
////////////////////////////////////////////////////////  
    virtual void GetShaderLog(engine_string &log) const = 0;
   
////////////////////////////////////////////////////////
/// 获取,设置着色器数据
////////////////////////////////////////////////////////  
virtual void GetShaderSource(engine_string &shader) const = 0;
    virtual void SetShaderSource(engine_string &code) = 0;
  
////////////////////////////////////////////////////////
/// 获取着色器句柄(标号)
////////////////////////////////////////////////////////   
    virtual GLuint GetHandle() const = 0;

////////////////////////////////////////////////////////
/// 获取着色器参数  
////////////////////////////////////////////////////////  
    virtual void   GetParameter(GLenum param, GLint *data) const = 0;
private:
    DECLARE_OBJECT(GLSLShader)
};

////////////////////////////////////////////////////////////
/// 定义引擎GLSL着色程序
////////////////////////////////////////////////////////////
class GLSLProgram : public Object
{
public:
        ////////////////////////////////////////////////////////
        /// 构造,析构GL着色程序
        ////////////////////////////////////////////////////////
        GLSLProgram();
        virtual ~GLSLProgram();
  
        ////////////////////////////////////////////////////////
        /// 链接,卸载着色程序
        ////////////////////////////////////////////////////////  
        virtual void Attach(const RefPtr<GLSLShader> &shader) = 0;
    virtual void Detach(const RefPtr<GLSLShader> &shader) = 0;
        
        ////////////////////////////////////////////////////////
        /// 链接着色程序
        ////////////////////////////////////////////////////////        
        virtual bool Link() = 0;
        
        ////////////////////////////////////////////////////////
        /// 启用,禁止着色程序
        ////////////////////////////////////////////////////////               
        virtual void Begin() const = 0;
        virtual void End() const = 0;

        ////////////////////////////////////////////////////////
        /// 设置着色程序参数
        ////////////////////////////////////////////////////////        
        virtual void SendUniform(const engine_string &name, float x) = 0;
        virtual void SendUniform(const engine_string &name, float x, float y) = 0;
        virtual void SendUniform(const engine_string &name, float x, float y, float z) = 0;
        virtual void SendUniform(const engine_string &name, float x, float y, float z, float w) = 0;
        virtual void SendUniform(const engine_string &name, int x) = 0;
        virtual void SendUniform(const engine_string &name, int x, int y) = 0;
        virtual void SendUniform(const engine_string &name, int x, int y, int z) = 0;
        virtual void SendUniform(const engine_string &name, int x, int y, int z, int w) = 0;
        virtual void SendUniform(const engine_string &name, float *m, bool transp = false, int size = 4) = 0;

        ////////////////////////////////////////////////////////
        /// 设置指定位置的着色程序参数
        ////////////////////////////////////////////////////////        
        virtual void SendUniform(GLuint location, float x) = 0;
        virtual void SendUniform(GLuint location, float x, float y) = 0;
        virtual void SendUniform(GLuint location, float x, float y, float z) = 0;
        virtual void SendUniform(GLuint location, float x, float y, float z, float w) = 0;
        virtual void SendUniform(GLuint location, int x) = 0;
        virtual void SendUniform(GLuint location, int x, int y) = 0;
        virtual void SendUniform(GLuint location, int x, int y, int z) = 0;
        virtual void SendUniform(GLuint location, int x, int y, int z, int w) = 0;
        virtual void SendUniform(GLuint location, float *m, bool transp = false, int size = 4) = 0;
        
        ////////////////////////////////////////////////////////
        /// 设置给定索引的顶点属性参数
        ////////////////////////////////////////////////////////        
    virtual void SendVertexAttrib(GLuint index, int x) = 0;
    virtual void SendVertexAttrib(GLuint index, int x, int y) = 0;
    virtual void SendVertexAttrib(GLuint index, int x, int y, int z) = 0;
    virtual void SendVertexAttrib(GLuint index, int x, int y, int z, int w) = 0;
        
    virtual void SendVertexAttrib(GLuint index, float x) = 0;
    virtual void SendVertexAttrib(GLuint index, float x, float y) = 0;
    virtual void SendVertexAttrib(GLuint index, float x, float y, float z) = 0;
    virtual void SendVertexAttrib(GLuint index, float x, float y, float z, float w) = 0;  

        ////////////////////////////////////////////////////////
        /// 获取指定参数的位置
        ////////////////////////////////////////////////////////
        virtual GLuint GetUniformLocation(const engine_string &name) const = 0;
        virtual void   SetAttributeLocation(const engine_string &name, GLuint location) = 0;
        virtual GLuint GetAttributeLocation(const engine_string &name) const = 0;

        ////////////////////////////////////////////////////////
        /// 获取程序日志
        ////////////////////////////////////////////////////////
        virtual void   GetProgramLog(engine_string &log) const = 0;
        
        ////////////////////////////////////////////////////////
        /// 获取着色程序句柄
        ////////////////////////////////////////////////////////        
        virtual GLuint GetHandle() const = 0;
        
        ////////////////////////////////////////////////////////
        /// 获取着色器参数
        ////////////////////////////////////////////////////////        
        virtual void   GetParameter(GLenum param, GLint *data) const = 0;
        
        ////////////////////////////////////////////////////////
        /// 着色器合法性检查
        ////////////////////////////////////////////////////////        
        virtual bool   IsValid() const = 0;
        virtual bool   IsValidProgram() const = 0;
        virtual void   GetAttributeInfo(GLuint location, engine_string &name, GLenum &type, GLint &size) const = 0;
        virtual void   GetUniformInfo(GLuint location, engine_string &name, GLenum &datatype, GLint &size) const = 0;
        virtual void   GetAttachedShaders(std::vector<GLuint> &shaderhandles) = 0;
        virtual void   GetAttachedShaders(std::vector<GLSLShader> &shaders) = 0;
private:
    DECLARE_OBJECT(GLSLProgram)        
};






56

主题

94

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2010-5-17 18:11:00 | 显示全部楼层

Re:盖莫游戏引擎2.1.2 GLSL+Light

这个没什么说的
如何获取其指针?
从这里!
///////////////////////////////////////////////////////
/// 定义引擎渲染者对象O(∩_∩)O~
///////////////////////////////////////////////////////
class G_DLL_API Renderer : public Object
{
public:
        ///////////////////////////////////////////////////////
    ///  构造,析构可渲染对象
        ///////////////////////////////////////////////////////        
    Renderer();
        virtual ~Renderer();
public:         
        ///////////////////////////////////////////////////////
    ///  获取着色器程序指针
        ///////////////////////////////////////////////////////                 
    virtual RefPtr<GLSLProgram> CreateGLSLProgram(const engine_string& vertex,const engine_string& frag) = 0;
然后是使用的一段代码(感觉越写越复杂了)
    //! 获取材质管理器
    core::RefPtr<core::MaterialManager> materialmanager = resourcemanager->GetMaterialManager();        
        //! 获取一个材质指针(我们从脚本中载入材质数据O(∩_∩)O~)
    core::RefPtr<core::Material> material = materialmanager->CreateObject("material","..\\script//move_light_material.lua","material");
    //! 材质渲染
    material->Render();  
   
    //! 获取光管理器指针
    core::RefPtr<core:ightManager> lightmanager = resourcemanager->GetLightManager();
    //! 启用光源
    lightmanager->EnableLight();   
   
    //! 获取光模型指针
    lightmodel = lightmanager->GetLightModel();
    lightmodel->SetLocalViewer(false);
    lightmodel->SetAmbientColor(core::Color(0.4f,0.4f,1.0f,1.0f));
    lightmodel->Render();
   
    light[0] = lightmanager->CreateObject("light1","..\\script//move_light_light.lua","light0");
    light[1] = lightmanager->CreateObject("light2","..\\script//move_light_light.lua","light1");
    light[2] = lightmanager->CreateObject("light3","..\\script//move_light_light.lua","light2");
   
    //! 获取渲染器
    core::RefPtr<core::Renderer> renderer = device->GetRenderer();
   
    //获取GLSL着色指针
    core::RefPtr<core::GLSLProgram> glsl1 = renderer->CreateGLSLProgram("..\\shader//multilight//pervertex1.vert","..\\shader//multilight//pervertex1.frag");
    core::RefPtr<core::GLSLProgram> glsl2 = renderer->CreateGLSLProgram("..\\shader//multilight//perpixel1.vert","..\\shader//multilight//perpixel1.frag");
    core::RefPtr<core::GLSLProgram> glsl3 = renderer->CreateGLSLProgram("..\\shader//multilight//pervertex3.vert","..\\shader//multilight//pervertex3.frag");
    core::RefPtr<core::GLSLProgram> glsl4 = renderer->CreateGLSLProgram("..\\shader//multilight//perpixel3.vert","..\\shader//multilight//perpixel3.frag");
    core::RefPtr<core::GLSLProgram> glsl5 = renderer->CreateGLSLProgram("..\\shader//multilight//deferredfirst.vert","..\\shader//multilight//deferredfirst.frag");
    core::RefPtr<core::GLSLProgram> glsl6 = renderer->CreateGLSLProgram("..\\shader//multilight//deferredsecond.vert","..\\shader//multilight//deferredsecond.frag");  

    glsl6->Begin();
    glsl6->SendUniform("Tex0",0);
    glsl6->SendUniform("Tex1",1);
    glsl6->SendUniform("Tex2",2);
    glsl6->End();
        
        core::RefPtr<core::Image> wallimage = imagemanager->CreateObject("wall","..\\image//wall.bmp");
        core::RefPtr<core::Image> cubeimage = imagemanager->CreateObject("cube","..\\image//logo.bmp");
        core::RefPtr<core::Texture> wall = texturemanager->CreateObject("wall",wallimage);
        core::RefPtr<core::Texture> cube = texturemanager->CreateObject("cubel",cubeimage);
        wall->Generate();
        cube->Generate();
        
        texid[0] = wall->GetTextureId();
        texid[1] = cube->GetTextureId();

    //! 获取摄像机指针
    core::RefPtr<core::Camera> camera = scenemanager->GetCameraManager()->CreateCamera("camera",
                                                                           Vector3f(500,35,400),
                                                                           Vector3f(504,35,400));
    camera->SetViewPort(Recti(0,0,640,480));
    camera->SetPerspective(45.0f,640.0f/480.0f,0.1f,100.0f);

    BEGIN_LOOP(device)
       videodriver->SetClearBuffer(ENGINE_CLEAR_COLOR | ENGINE_CLEAR_DEPTH);
           
           if(input->IsPressedKey(KEY_M) == true)
               movelights = !movelights;
           if(input->IsPressedKey(KEY_SPACE) == true)
               move = !move;
       if(input->IsPressedKey(KEY_R) == true)     
           rotation = !rotation;               
       if(input->IsPressedKey(KEY_B) == true)      
               bg = !bg;
           if(input->IsPressedKey(KEY_KP_0) == true)
       {   
               movz = 0.0f;
               roty = 0.0f;
           movl = 0.0f;
       }
       if(input->IsPressedKey(KEY_U) == true)
       {
           renderer->DisableGLSL();
           lightmanager->DisableLight();
           rendermode = 0;
       }
       if(input->IsPressedKey(KEY_H) == true)
       {
           renderer->DisableGLSL();
           lightmanager->EnableLight();
           rendermode = 0;
       }
       if(input->IsPressedKey(KEY_K) == true)
       {
           renderer->DisableGLSL();
           lightmanager->EnableLight();
           multish = 0;
           rendermode = 1;
       }
       if(input->IsPressedKey(KEY_S) == true)
       {
           multish = glsl1->GetHandle();
           rendermode = 1;
       }
       if(input->IsPressedKey(KEY_T) == true)
       {
           multish = glsl2->GetHandle();
           rendermode = 1;
       }
       if(input->IsPressedKey(KEY_L) == true)
       {
                    glsl3->Begin();
            rendermode = 0;
       }
       if(input->IsPressedKey(KEY_O) == true)
       {
                   glsl4->Begin();
               rendermode = 0;
       }

           interval = 16;

                if (move)
                        movz += 0.0025 * interval;
                if (rotation)
                        roty += 0.1 * interval;
                if (movelights)
                        movl += 0.0025 * interval;
         
        DrawLight(light,movl);

                videodriver->SetClearBuffer(ENGINE_CLEAR_COLOR | ENGINE_CLEAR_DEPTH);
                glLoadIdentity();
                videodriver->SetPilotView(0,2,10,0,0,-15);
                switch(rendermode)
        {
                case 0:
                        DrawScene(bg,texid[0],texid[1],roty,movz);
                        break;
                case 1:
                        if (!multish)
            {
                                for (i = 1; i < NUM_LIGHTS; i++)
                                    light->SetVisible(false);
                        }

                        glUseProgram(multish);
                        for (i = 0; i < NUM_LIGHTS; i++)
            {
                                if (i > 0)
                {
                                        lightmodel->Render();
                    videodriver->SetBlending(true);
                                }
                                light->Render();
                DrawScene(bg,texid[0],texid[1],roty,movz);
                        }

                        videodriver->SetBlending(false);

                        if (!multish)
            {
                                for (i = 1; i < NUM_LIGHTS; i++)
                                        {light->SetVisible(true);light->Render();}
                        }
                        break;
                }
            
        DrawLights(light);
           
    END_LOOP(device)

56

主题

94

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2010-5-17 18:11:00 | 显示全部楼层

Re:盖莫游戏引擎2.1.2 GLSL+Light

下面是几张对应的图片
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-1 19:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表