战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

#

在Windows XP下, 在任何磁盘里,创建一个文件,再复制粘贴,就会生成一个新的拷贝.文件名中有个词叫:"复件"

但是感觉这个词貌似是学多了英语后的人硬拼出来的,时间长了,大家习惯了这个叫法,这个词也就出来了.

在Windows Vista或者Windows 7里,这个词变成了 "副本", 估计是微软也发现"复件"这个词不是很正规或者让人接受而换的

:)

posted @ 2010-04-16 17:20 战魂小筑 阅读(1747) | 评论 (1)编辑 收藏

OGRE 中的3种层次实现多线程渲染的文档:

http://isdlibrary.intel-dispatch.com/vc/1632/Threading_OGRE3D.pdf

 

ATI有关多线程效率提升的游戏比较及一些tips

http://developer.amd.com/assets/ATIMThread.pdf

posted @ 2010-04-15 16:06 战魂小筑 阅读(1766) | 评论 (1)编辑 收藏

从Windows XP SP2通过Windows Updates 的SP3推送更新到SP3并不是真正意义上的SP3. 至少发现有以下兼容问题:

1. RenderMonkey 1.82 在这种升级版本下会启动会报MSXML错误

2. VS2010 安装完成后, C#和WPF工程都无法正常创建,打开vs2008及老的sln,project都会出现卡死,甚至崩溃的错误. 估计也是MSXML的问题

 

 

解决方法:安装Windows 更高版本或者直接使用原生Windows SP3

posted @ 2010-04-14 15:53 战魂小筑 阅读(1626) | 评论 (2)编辑 收藏

名称:Chrome Stylist

地址:https://chrome.google.com/extensions/detail/pabfempgigicdjjlccdgnbmeggkbjdhd?hl=zh-cn

安装好后,在StyleList的选项里找到Styles选项卡,将里面其他的删除,新建一个Style,点上All Site,在黑色栏里填入一个你喜欢的名字,在css内容里填入

html, body, * {
font-family: "微软雅黑" ! important;
}

点击下面的save存盘,刷新其他网站,地址栏最右边出现彩虹的图标就表示工作正常了

have fun, :)

posted @ 2010-04-11 12:49 战魂小筑 阅读(2489) | 评论 (1)编辑 收藏

假设我们有3个工程及其工程类型:

CORE              DLL

ENGINE           DLL

GAME             EXE

D3DRENDER      DLL

其中D3DRENDER是GAME动态载入的,其需要链接CORE,ENGINE

这是一个很常见的模式,但是不好的是,因为CORE和ENGINE均是DLL,代码中的Symbol都被导出才可使用。任何人使用DEPENDENCE工具就可以将DLL中引用的东西查看的清楚,虽然这不至于造成技术泄漏,但从速度和DLL大小来说都是不划算的。

现在很多游戏主exe一般都是10M+甚至20M+的大exe,这都是使用静态链接而成。但是对代码结构也必须做出一定的调整。所有工程必须都是静态库,这样才能保证像CORE这样的静态库中的全局/静态变量不至于被链接2份而造成内存段逻辑错误。

当然,使用全静态库还需要注意一点:所有的lib都是在最后的game工程里来做链接。

posted @ 2010-04-07 16:08 战魂小筑 阅读(2207) | 评论 (2)编辑 收藏

转载自 独立游戏中文论坛

UDK是unrealengine develpoment kit 的缩写,简单来说就是大名鼎鼎的虚幻3引擎的免费商业版本.不过虚幻3毕竟还是4年前的dx9的入门级引擎,在商业上取得
巨大成功,技术上也显得落后.目前Epic想榨干虚幻3的最后一点潜力,于是干脆发布了这个免费版本.任何人都可以用UDK开发游戏,但是如果游戏牟利的话每年还是要向
Epic交纳一定数量的技术授权费用的.先不管这个,还是来看看它的官方视频教程吧.
  [attach]44[/attach]
链接如下:  
http://udn.epicgames.com/Three/VideoTutorials.html
一共5个教程 从引擎配置介绍开始,到关卡和人物编辑器,以及最后一个完整的小游戏的制作,对于入门来说完全足够了.
视频说的还比较详细,听力不好的同学可以对照下开发文档 http://www.udk.com/documentation 里面基本说的很详细.
最后附上UDK的下载地址: March 2010 UDK Beta (548 MB .exe) 
好了,UDK对于初学者来说还是比较适合的.对于游戏的开发人员来说引擎的整体架构还是很值得学习的.希望你学的愉快.

posted @ 2010-04-07 10:36 战魂小筑 阅读(2801) | 评论 (4)编辑 收藏

RenderTarget完成后,开始模拟OGRE的Compositor。

OGRE的Compositor其实就是用于解决绘制PostEffect的,简单的说,就是一种RenderTarget的流程控制脚本

这是OGRE compositor文件的片段

compositor Bloom
{
    technique
    {
        // Temporary textures
        texture rt_output target_width target_height PF_R8G8B8
        texture rt0 target_width_scaled 0.25 target_height_scaled 0.25 PF_R8G8B8
        texture rt1 target_width_scaled 0.25 target_height_scaled 0.25 PF_R8G8B8
 
        target rt_output
        {
            // Render output from previous compositor (or original scene)
            input previous
        }
 
        target rt0
        {
            // Start with clear texture
            input none
            // Horizontal blur pass
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material Ogre/Compositor/BrightPass2
                input 0 rt_output
            }
        }
 
        target rt1
        {
            // Start with clear texture
            input none
            // Horizontal blur pass
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material Ogre/Compositor/BlurV
                input 0 rt0
            }
        }
 
        target rt0
        {
            // Start with clear texture
            input none
            // Horizontal blur pass
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material Ogre/Compositor/BlurH
                input 0 rt1
            }
        }
 
        target_output
        {
            // Start with clear output
            input none
            // Draw a fullscreen quad
            pass render_quad
            {
                // Renders a fullscreen quad with a material
                material Ogre/Compositor/BloomBlend2
                input 0 rt_output
                input 1 rt0
            }
        }
    }
}

 

大概我们知道,一个Compositor分为资源定义与绘制步骤(target xxx)

而一个绘制步骤又分别定义:

1. (输入)绘制的是什么东西?

2. (效果)绘制成什么样子?

3. (输出)往哪里绘制?

输出方式在这个例子有2种:纹理(RT)和屏幕

输入方式有2中:纹理及场景

我们可以使用一个回调来对一个绘制步骤提供绘制输入

绘制效果就是一大堆的Shader,这些shader都是基于一个quad来做的,也就是一个矩形,使用变换后的顶点和一个纹理坐标作为顶点定义

不过这里是不需要做vertexshader的,仅仅ps足矣。

绘制的最后,是将前面绘制的RT(纹理)混合起来

当然,如果步骤比较多和复杂时,RT之间跟寄存器一样,可以反复使用

YR7HEX8VAB[67GPOWLNPIBA

显示茶壶法线的场景加上 Blur 的PostEffect

<?xml version="1.0" encoding="gb2312" ?>
<Compositor name = "bloom" >
  <Resource>
    <RenderTarget name ="rt_source" size="screenquad" />
    <RenderTarget name ="rt0" size="screenquad" />
    <RenderTarget name ="rt1" size="screenquad" />
  </Resource>
  <Step target="rt_source">
    <Geometry type ="callback" callback = "rt_input"/>
  </Step>
  <Step target="rt0">
    <Geometry type = "screenquad"/>
    <Effect name ="material\blurH.xml">
      <Texture name ="mTexture" value ="rt_source" />
    </Effect>
  </Step>
  <Step target="rt1">
    <Geometry type = "screenquad"/>
    <Effect name ="material\blurV.xml">
      <Texture name ="mTexture" value ="rt_source" />
    </Effect>
  </Step>
  <Step>
    <Geometry type = "screenquad"/>
    <Effect name ="material\combine.xml">
      <Texture name ="mTexture1" value ="rt0" />
      <Texture name ="mTexture2" value ="rt1" />
    </Effect>
  </Step>
</Compositor>
这是我的引擎里的Compositor脚本,还在慢慢加强功能,希望能有一天达到OGRE的Compositor功能
posted @ 2010-04-01 18:56 战魂小筑 阅读(2835) | 评论 (1)编辑 收藏

如果让你的引擎结构支持多个RenderTarget绘制及多个Viewport?这里是我的简单设计:

同样适用我的文本设计图标准(+为包含,  <为派生)

 

RenderTexture

      RenderTarget

          <ScreenTarget(引擎启动时,初始化屏幕大小的Viewport)

          +RenderView (对于一个RT,可以是屏幕,可以是纹理RT,所以可以拥有 1~n个切分视图 )

               +Camera

               +Viewport

 

以下是多View绘制的类XNA伪代码

 

Engine.Run()
{
    Device.Clear()
 
    // 保存当前全屏Viewport
    ScreenViewport = Device.CurrentViewport
 
    Device.BeginScene()    
 
    // 遍历当前屏幕RT下的所有View
    foreach RenderView in ScreenRT
    {
        // 未激活的View不用绘制
        if RenderView not active then continue
 
        // 将View对应的Viewport提交到设备        
        RenderView.CommitViewport()
 
        // 渲染回调
        foreach RenderEventListener in RenderEventListenerList
        {
            RenderEventListener.OnRenderFrame()
        }
    }
 
    Device.EndScene()
 
     Device.Present()
 
    Device.CurrentViewport = ScreenViewport // 恢复全屏viewport
}

 

 

以下是RT间嵌套绘制的伪代码:

RenderView.SwitchRenderTarget(stage, RenderTarget)
{
    // 保存绘制前的RT
    PreTarget = Device.GetRenderTarget()
    // 设置为当前的RT
    Device.SetRenderTarget( RenderTarget )
 
    // 更新RT摄像机
    RenderTarget.UpdateCamera()    
    
    // 清空RT
    Device.Clear()
 
    // 绘制回调
    RenderTarget.OnRender( )
 
    // 恢复之前的RT
    Device.SetRenderTarget( PreTarget  );
}
posted @ 2010-03-29 18:16 战魂小筑 阅读(2189) | 评论 (0)编辑 收藏

完成自己的shader系统后,翻出之前写过的代码中发现有一个地方很奇怪

我的矩阵定义跟OGRE的没什么区别

        union 
        {
            struct
            {
                float m11, m12, m13, m14;
                float m21, m22, m23, m24;
                float m31, m32, m33, m34;
                float m41, m42, m43, m44;
            };
            float m[4][4];
        };

   乘法也跟OGRE的一模一样,但在将view及project乘好的矩阵送给HLSL时,却必须转置下,才能得到正确的结果

mSkinnedEffect.mMatrix.mValue = (camera.mViewMatrix * camera.mProjectMatrix).Transpose();

shader:

float4 localpos = mul(In.Position, skinTransform);

 

    OGRE中有这么一段代码及注释:

    const Matrix4& AutoParamDataSource::getProjectionMatrix(void) const
    {
        if (mProjMatrixDirty)
        {
            // NB use API-independent projection matrix since GPU programs
            // bypass the API-specific handedness and use right-handed coords
            if (mCurrentRenderable && mCurrentRenderable->getUseIdentityProjection())
            {
                // Use identity projection matrix, still need to take RS depth into account.
                RenderSystem* rs = Root::getSingleton().getRenderSystem();
                rs->_convertProjectionMatrix(Matrix4::IDENTITY, mProjectionMatrix, true);
            }
            else
            {
                mProjectionMatrix = mCurrentCamera->getProjectionMatrixWithRSDepth();
            }
            if (mCurrentRenderTarget && mCurrentRenderTarget->requiresTextureFlipping())
            {
                // Because we're not using setProjectionMatrix, this needs to be done here
                // Invert transformed y
                mProjectionMatrix[1][0] = -mProjectionMatrix[1][0];
                mProjectionMatrix[1][1] = -mProjectionMatrix[1][1];
                mProjectionMatrix[1][2] = -mProjectionMatrix[1][2];
                mProjectionMatrix[1][3] = -mProjectionMatrix[1][3];
            }
            mProjMatrixDirty = false;
        }
        return mProjectionMatrix;
    }

貌似是跟左右手这个恶心的东西有关系

回看DirectXSDK中提供的BasicHLSL例子

        mWorld = g_mCenterWorld * *g_Camera.GetWorldMatrix();
        mProj = *g_Camera.GetProjMatrix();
        mView = *g_Camera.GetViewMatrix();
 
        mWorldViewProjection = mWorld * mView * mProj;
 
        V( g_pEffect->SetMatrix( "g_mWorldViewProjection", &mWorldViewProjection ) );

shader:

Output.Position = mul(vAnimatedPos, g_mWorldViewProjection);

丝毫无需转置矩阵,Effect接口中也提供有SetMatrixTranspose这类方法。所以排除内部有自动转置的嫌疑。

询问过野猪这个问题,野猪答曰:"转置后传输至需要传3个vector, 最后一个是[0 0 0 1]”

有达人知道的,可以指点下迷津 :)

posted @ 2010-03-17 11:08 战魂小筑 阅读(2675) | 评论 (2)编辑 收藏

自己保留这篇文章:

http://static.icybear.net/[CN]Programmer%20competency%20matrix.htm

 

很好的程序员自测的文章

posted @ 2010-03-12 22:22 战魂小筑 阅读(366) | 评论 (0)编辑 收藏

仅列出标题
共26页: First 14 15 16 17 18 19 20 21 22 Last