游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5007|回复: 0

使用盖莫游戏引擎做的渲染到纹理的例子

[复制链接]

56

主题

94

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2010-9-17 18:27:00 | 显示全部楼层 |阅读模式
使用盖莫游戏引擎做的渲染到纹理的例子
首先上代码吧个人感觉写的很清爽
/*!==========================================================================
*
*  盖莫游戏引擎(GaiMo Game Engine)
*
*  版权所有 (C) 2009-2009 成都盖莫软件技术工作室 保留所有权利
*  Copyright (C) 成都盖莫软件技术工作室.  All Rights Reserved.
*
*  了解更多情况,请访问 http://www.gaimo.net
****************************************************************************/
//! 本demo测试引擎渲染到纹理功能
#include <iostream>
#include <GEngine/Header_Config.hpp>

using namespace std;
using namespace core;

#define FRAME_NUMBER 12

//! 定义图形纹理指针
RefPtr<core::Texture>  texture_ptr[FRAME_NUMBER];
//! 渲染到纹理指针
RefPtr<Renderable> rendertotexture;
core::TextDesc* text = NULL;
Matrix4f mat;
float pos[] = {0,0,0};
float length[] = {16,16,16};
void  CreateTexture();
void  InitCamera();
void  Render();

int main(int argc, char *argv[])
{
    //! 窗体描述符
    ScreenDesc desc;
    desc.name_ = "RenderToTextureTest";
    //! 生成窗体
    RefPtr<Screen> screen = CreateScreen(desc);

    //! 生成纹理
    CreateTexture();

    //! 初始化摄像机
    InitCamera();

    while(screen->IsOpen())
    {
        Render();
    }

    DestroyScreen();
    return EXIT_SUCCESS;
}

//! 构造纹理
void CreateTexture()
{
    //! 载入资源包
    GLOBAL_FILESYSTEM_PTR->RegisterPackage("..\\package\\logo.zip");
    RefPtr<core::ReadFile> imagefile;

    RefPtr<Image> image[FRAME_NUMBER];
    for(int i = 0;i < FRAME_NUMBER ;i++)
    {
        std::string name = ToString<int>(i);
        imagefile = GLOBAL_FILESYSTEM_PTR->GetRead("logo.jpg");
        image = GLOBAL_IMAGEMANAGER_PTR->CreateImage(name,imagefile);
    }

    //! 反色
    image[0]->GetInvertImage();
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(0),image[0]);
    //! 水平翻转
    image[1]->FlipImage(Image::IMAGE_FLIP_X);
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(1),image[1]);
    //! 竖直翻转
    image[2]->FlipImage(Image::IMAGE_FLIP_Y);
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(2),image[2]);
    //! Gamma调整
    image[3]->AdjustGamma(0.4);
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(3),image[3]);
    //! 亮度调整
    image[4]->AdjustBrightness(0.4);
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(4),image[4]);
    //! 对比度调整
    image[5]->AdjustContrast(0.6);
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(5),image[5]);
    //! 翻转
    image[6]->FlipImage(Image::IMAGE_FLIP_XY);
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(6),image[6]);
    //! 旋转
    image[7]->RotatedImage(Image::IMAGE_ROTATE_90);
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(7),image[7]);
    //! Gamma调整
    image[8]->AdjustGamma(0.1);
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(8),image[8]);
    //! 亮度调整
    image[9]->AdjustBrightness(0.8);
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(9),image[9]);
    //! 对比度调整
    image[10]->AdjustContrast(0.3);
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(10),image[10]);
    GLOBAL_TEXTUREMANAGER_PTR->CreateTexture2(ToString<int>(11),image[11]);

    for(int i = 0; i < FRAME_NUMBER; i++)
    {
        //! 纹理构建
        GLOBAL_TEXTUREMANAGER_PTR->GetObject(ToString<int>(i))->Generate();
    }

    text = new core::TextDesc("..\\package\\accid.ttf",12,0,0,3,Color::Cyan);
    text->SetText(engine_wstring(L"maker:gaimosoft,ccsdu2004@yahoo.com.cn"));

    //! 获取渲染到纹理指针
    rendertotexture = GLOBAL_RENDERER_PTR->GetRenderToTexture(640,480,GL_RGBA,GL_FLOAT);

    glEnable(GL_DEPTH_TEST);
}

void InitCamera()
{
    RefPtr<Camera> orthocamera = GLOBAL_CAMERAMANAGER_PTR->CreateCamera("orthocamera");
    orthocamera->SetOrtho(0,640,480,0,-1.2,0.8);
    RefPtr<Camera> camera = GLOBAL_CAMERAMANAGER_PTR->GetActiveCamera();
    camera->GetViewPort()->Render();
    camera->SetPerspective(45.0f,640.0f/480.0f,1.0f,600.0f);
    camera->SetPosition(Vector3f(20,20,20));
    camera->SetView(Vector3f());
    camera->ApplayProjectMatrix();
}

void RenderTexture()
{
    std::string texturename;
    for(int i = 0; i < FRAME_NUMBER; i++)
    {
        texturename = ToString<int>(i);
        GLOBAL_TEXTUREMANAGER_PTR->GetObject(texturename)->AttachRenderTarget();
        UI_Brush::RenderTexture((i%4)*160,(i/4)*160,160,160);
    }
}

//! 处理鼠标响应
void MouseCheck()
{
    if(GLOBAL_INPUT_PTR->IsPressedKey(KEY_F1))
    {
        mat*=mat.Rotate((rand()%200)/900.0f,1,0,0);
    }
    else if(GLOBAL_INPUT_PTR->IsPressedKey(KEY_F2))
    {
        mat*=mat.Rotate((rand()%200)/900.0f,0,1,0);
    }
    else if(GLOBAL_INPUT_PTR->IsPressedKey(KEY_F3))
    {
        mat*=mat.Rotate((rand()%200)/900.0f,0,0,1);
    }
}

void RenderText()
{
    UI_Brush:reRender();
    static int offset = 0;
    text->Render(Rectf(offset,460,400,20));
    offset ++;
    if(offset >= 600)
        offset = -500;
    UI_Brush::PostRender();
}

void RenderToTexture()
{
    rendertotexture->BeginRender();
    GLOBAL_RENDERER_PTR->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    GLOBAL_CAMERAMANAGER_PTR->GetObject("orthocamera")->ApplayProjectMatrix();
    RenderTexture();
    RenderText();
    rendertotexture->AfterRender();
}

void RenderToScreen()
{
    GLOBAL_RENDERER_PTR->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    GLOBAL_CAMERAMANAGER_PTR->GetActiveCamera()->ApplayProjectMatrix();
    GLOBAL_CAMERAMANAGER_PTR->GetActiveCamera()->ApplayViewMatrix();
    GLOBAL_RENDERER_PTR->DrawCube(pos,mat.ptr(),length);
}

void Render()
{
    MouseCheck();
    RenderToTexture();
    RenderToScreen();
}
基本步骤就是生成窗体
初始化摄像机
生成纹理
渲染到纹理
渲染到窗体
完了

图图如下:
似乎我比较喜欢贴立方体啊 呵呵

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-28 17:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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