游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4951|回复: 4

请教:HGE 引擎中的渲染句柄有什么用?谢谢!

[复制链接]

37

主题

67

帖子

73

积分

注册会员

Rank: 2

积分
73
发表于 2007-4-27 09:25:00 | 显示全部楼层 |阅读模式
TARGET Target_Create(int width,int height,bool zbuffer);

如果使用成功,使用Gfx_BeginScene返回渲染目标句柄。否则返回0。

渲染目标的尺寸必须是2的倍数。如果这个条件是不能碰到的,
被申请的尺寸将会自动调整到比原来大的最接近2的倍数的尺寸。

target=hge->Target_Create(512,512,false);   //创建渲染句柄

请教:
问题1:
创建这个渲染目标有什么用啊?
不创建渲染目标不是一样的可以渲染吗?
如:
hge->Gfx_BeginScene( );


hge->Gfx_BeginScene(target);
有什么区别?

如果带渲染句柄参数的话,说明就只渲染参数所定的区域

是这样吗?


谢谢!
[em3] [em4] [em17] [em20]

37

主题

67

帖子

73

积分

注册会员

Rank: 2

积分
73
 楼主| 发表于 2007-4-27 09:49:00 | 显示全部楼层

Re:请教:HGE 引擎中的渲染句柄有什么用?谢谢!

#include "include\hge.h"
#include "include\hgesprite.h"
#include "include\hgefont.h"
#include "include\hgeparticle.h"


HGE *hge=0;


hgeSprite*                        spr;   
hgeSprite*                        spt;
hgeSprite*                        tar;
hgeFont*                        fnt;
hgeParticleSystem*        par;

//理纹和声音句柄
//需要明白在 HGE 中理纹说的就是一幅大图片,里面可能含有小图片,
//如疯狂坦克,下面还包含有很多小图片
HTEXTURE                        tex;
HEFFECT                                snd;

// HGE render target handle
HTARGET                                target;   //渲染目标的句柄

float x=100.0f, y=100.0f;
float dx=0.0f, dy=0.0f;

const float speed=90;
const float friction=0.98f;

void boom() { ////撞击时发出声音
        int pan=int((x-256)/2.56f);
        float pitch=(dx*dx+dy*dy)*0.0005f+0.2f;
        hge->Effect_PlayEx(snd,100,pan,pitch);
}

// This function will be called by HGE
// when the application receives focus.
// We use it here to update the render
// target's texture handle that may change
// when the focus is lost.
bool FocusGainFunc()  //这里不知道是什么意思?
{
        if(tar && target) tar->SetTexture(hge->Target_GetTexture(target));
        return false;
}


bool FrameFunc()
{
        float dt=hge->Timer_GetDelta();  //得到时间差

        // Process keys
        if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true;
        if (hge->Input_GetKeyState(HGEK_LEFT)) dx-=speed*dt;
        if (hge->Input_GetKeyState(HGEK_RIGHT)) dx+=speed*dt;
        if (hge->Input_GetKeyState(HGEK_UP)) dy-=speed*dt;
        if (hge->Input_GetKeyState(HGEK_DOWN)) dy+=speed*dt;

        // Do some movement calculations and collision detection       
        dx*=friction; dy*=friction; x+=dx; y+=dy;
        if(x>496) {x=496-(x-496);dx=-dx;boom();}
        if(x<16) {x=16+16-x;dx=-dx;boom();}
        if(y>496) {y=496-(y-496);dy=-dy;boom();}
        if(y<16) {y=16+16-y;dy=-dy;boom();}

        // Update particle system
        par->info.nEmission=(int)(dx*dx+dy*dy);
        par->MoveTo(x,y);
        par->Update(dt);

        return false;
}


bool RenderFunc()
{
        int i;

        // Render graphics to the texture
        hge->Gfx_BeginScene(target);  //开始渲染 ,target 为渲染目标句柄
        hge->Gfx_Clear(0);            // 需要清除的渲染目标的ARGB颜色值
        par->Render();                //渲染
        spr->Render(x, y);            //渲染
        hge->Gfx_EndScene();          //渲染结束

        // Now put several instances of the rendered texture to the screen
        hge->Gfx_BeginScene();        //开始渲染
        hge->Gfx_Clear(0);            // 需要清除的渲染目标的ARGB颜色值
        for(i=0;i<6;i++)
        {
                tar->SetColor(0xFFFFFF | (((5-i)*40+55)<<24));
                //SetColor 设置颜色为特别的扭曲的点
                tar->RenderEx(i*100.0f, i*50.0f, i*M_PI/8, 1.0f-i*0.1f);
        //RenderEx 是高级渲染 第一个参数是 x 坐标,第一个参数是 y 坐标,第三个参数是 缩反复比例 ,第四个参数是旋转角度
        }
        fnt->printf(5, 5, HGETEXT_LEFT, "dt:%.3f\nFPS:%d (constant)", hge->Timer_GetDelta(), hge->Timer_GetFPS());
        hge->Gfx_EndScene();

        return false;
}


int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        hge = hgeCreate(HGE_VERSION);

        hge->System_SetState(HGE_LOGFILE, "hge_tut04.log");
        hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
        hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
        hge->System_SetState(HGE_FOCUSGAINFUNC, FocusGainFunc);
        hge->System_SetState(HGE_TITLE, "HGE Tutorial 04 - Using render targets");
        hge->System_SetState(HGE_FPS, 100);
        hge->System_SetState(HGE_WINDOWED, true);
        hge->System_SetState(HGE_SCREENWIDTH, 800);
        hge->System_SetState(HGE_SCREENHEIGHT, 600);
        hge->System_SetState(HGE_SCREENBPP, 32);

        tar=0;         //精灵缓冲初始化为 0
        target=0;      //渲染句柄初始化为 0

    //Engine 初始化
        if(hge->System_Initiate()) {
                snd=hge->Effect_Load("menu.wav"); //载入声音
                tex=hge->Texture_Load("particles.png");//载入图片
                if(!snd || !tex) //如果没有意外
                {
                        // If one of the data files is not found, display
                        // an error message and shutdown.
                        MessageBox(NULL, "Can't load one of the following files:\nMENU.WAV, PARTICLES.PNG, FONT1.FNT, FONT1.PNG, TRAIL.PSI", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
                        hge->System_Shutdown();  //关闭程序
                        hge->Release();          //释放资源      
                        return 0;                //结束循环
                }

                spr=new hgeSprite(tex, 96, 64, 32, 32); //创建精灵
                spr->SetColor(0xFFFFA000);              //给精灵颜色 颜色格式是 0xAARRGGBB
                spr->SetHotSpot(16,16);                 //设置的锚坐标,也就是设置图片的中心

                fnt=new hgeFont("font1.fnt");           //载入字体

                spt=new hgeSprite(tex, 32, 32, 32, 32); //得到粒子的图片
                spt->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE);
                spt->SetHotSpot(16,16);
                par=new hgeParticleSystem("trail.psi",spt); //trail.psi 这个文件设置图片 spt 运行的路径和效果
                par->Fire();                                //启动粒子系统

                // Create a render target and a sprite for it
                target=hge->Target_Create(512,512,false);   //创建渲染句柄
                tar=new hgeSprite(hge->Target_GetTexture(target),0,0,512,512); //返回渲染目标的纹理句柄。
               
                tar->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE);

                // Let's rock now!
                //启动 Engine 开始主循环
                hge->System_Start();   

                // Delete created objects and free loaded resources
                delete par;
                delete fnt;
                delete spt;
                delete spr;
                delete tar;
                hge->Target_Free(target);
                hge->Texture_Free(tex);
                hge->Effect_Free(snd);
        }

        // Clean up and shutdown
        hge->System_Shutdown();
        hge->Release();
        return 0;
}


全部程序

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2007-4-27 11:46:00 | 显示全部楼层

Re:请教:HGE 引擎中的渲染句柄有什么用?谢谢!

都说了不要太依赖文档,
HGE已经发布源代码怎么就没什么人愿意去看呢~~

Target_Create用于创建一个渲染目标,
hge->Gfx_BeginScene()和hge->Gfx_BeginScene(target)表示是渲染到默认渲染目标还是指定的渲染目标,
这个例子演示的是现将图形渲染到渲染目标,
然后再将渲染目标当普通纹理渲染出来,

另外,
bool FocusGainFunc()  
{
if(tar && target) tar->SetTexture(hge->Target_GetTexture(target));
return false;
}
当应用程序重获焦点时,
渲染目标句柄可能因重置设备而丢失,
所以在这里要重获这个句柄

37

主题

67

帖子

73

积分

注册会员

Rank: 2

积分
73
 楼主| 发表于 2007-4-28 09:37:00 | 显示全部楼层

Re:请教:HGE 引擎中的渲染句柄有什么用?谢谢!

谢谢大哥!

2

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2007-4-28 09:44:00 | 显示全部楼层

Re:请教:HGE 引擎中的渲染句柄有什么用?谢谢!

HTARGET 是渲染目标的句柄,可以简单的把目标想象成游戏中某一个场景,在游戏世界中只是简单的渲染纹理,这个目标场景的意义可能并不能体现出来,但如果你的游戏世界很复杂,例如需要对指定的区域进行缩放,旋转渲染的话,就可以很方便的实现。

从HGE的源码中你会发现HTARGET其实是一个包装过HTEXTURE的,在HGE引擎中有一个HGERGET的列表(CRenderTargetList *pTargets),当你用Target_Create创建一个渲染目标时,会自动将你所创建的这个目标句柄添加到pTargets中,当你需要对这个渲染目标场景进行操作时必须使用Gfx_BeginScene(target)指定,否则默认的操作对象是D3D的后台缓冲区。

而渲染目标不会自动的被绘制到D3D后台缓冲区,这一操作必须由你来进行,HGE提供了一个HGE::Target_GetTexture(HTARGET target)函数来从一个指定的渲染目标中得到纹理句柄,而这个纹理句柄与你从外部图片文件加载创建的纹理或用HGE::Texture_Create(int width, int height)创建的纹理格式是一样的,当然操作也是一样。在你需要的时候,你可以将你之前创建的目标场景渲染到D3D后台缓冲,来完成你游戏中所需要达到的目的。

你所发的就是一个典型的渲染目标范例,程序中每次先根据最新的状态将球体绘制到一个场景中,然后再将这个场景根据6种不同的角度旋转渲染出来。

bool FocusGainFunc()  //这里不知道是什么意思?
{
if(tar && target) tar->SetTexture(hge->Target_GetTexture(target));
return false;
}

这个函数是当系统重新获得焦点时被系统调用的,在引擎初始化时由HGE_FOCUSGAINFUNC这个系统状态指定。因为当游戏窗口失去焦点,再获得焦点后会丢失目标场景数据,而这个函数可以使程序重新获取目标场景的纹理句柄。

http://bogy.cn/labs/hge             HGE中文参考指南-Alpha

http://Blog.bogy.cn                 欢迎交流
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 15:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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