posts - 59,  comments - 4,  trackbacks - 0
  2015年10月9日
突然想起以前喜欢玩的盟军敢死队,它的视野测试印象深刻,尝试试了下,感觉还行,留图:


动态图效果:
posted @ 2015-10-09 11:33 flipcode 阅读(147) | 评论 (1)编辑 收藏
u3d的arpg测试:

posted @ 2015-10-09 11:29 flipcode 阅读(104) | 评论 (0)编辑 收藏
横版2d测试, u3d作2d非常简单,没什么好说的,留图记念:

posted @ 2015-10-09 11:21 flipcode 阅读(42) | 评论 (0)编辑 收藏
以前dota测试留图:


war3资源:
posted @ 2015-10-09 11:18 flipcode 阅读(84) | 评论 (2)编辑 收藏
在使用unity3d后再去研究虚幻3引擎,感觉真的是不好用,胡搞了两个月,载图以留念:
posted @ 2015-10-09 10:44 flipcode 阅读(85) | 评论 (0)编辑 收藏
  2014年9月19日
见图



地表法线高光
posted @ 2014-09-19 17:24 flipcode 阅读(108) | 评论 (0)编辑 收藏
  2014年9月9日
前向渲染全屏泛光效果


这张地表法线较明显
posted @ 2014-09-09 16:42 flipcode 阅读(146) | 评论 (0)编辑 收藏
  2014年8月20日
块,路点按坡度以及静态物件自动生成,主要思想是参考了火炬之光的作法,看起来效果还不错,载图留念:
posted @ 2014-08-20 17:03 flipcode 阅读(46) | 评论 (0)编辑 收藏
  2014年3月21日

unigine多线程处理系统:

一。 更新系统:

主线程World::update_multiple()中:
1. 清空update_threads[]中每一个thread的所有结点

2. 处理所有node,将node.frame==engine.frame + 1的结点均衡地分配给update_threads[](即每个updatethread尽量拥有数量相同的node, 以便线程处理时间平衡), 同时设置分配后的node.frame=engine.frame(防止更新重入时再次加入此结点)

3. 接着通过update_shader->runSync(size);函数同步更新上述加入的所有结点:
遍历所有存有node的update_threads[],将它们与cpu工作线程关联(这样他们的线程run时会转调转回调用world中的update_threads[id].update(ifps);, 而update_threads[id]能遍历所有加入的node->update()函数同时重置node.frame=engine.frame + 1;
最后等待线程同步执行完所有更新再返回.

【注意】上述第3点的runSync()中对应cpu工作线程数为实际cpu-1个,当cpu为1个时就不用线程而是直接运行完所有结点更新,而如果是
有超过一个cpu的则本地和cpu线程同时进行更新工作。虽然在主线程中同步等待完成,但这样如果有多核则能并发同时处理。

另外还有异步runAsync()函数,分别在PathFind和Physics的更新函数中调用。这个runAsync()函数功能和runSync()差不多,只是它的工作线程为实际cpu个数,然后将任务均衡交给各线程处理,并且不会同步等待完成就返回了。所以是异步并发的。

二。渲染系统:
   1.收集可视surfaces(scene intersection): 
     在RenderRenderer::render_world()中调用scene::getIntersection(bound_frustum,occluder,exclude)中:

       a. render world occluders得到所有被occluders排除的nodes;

       b. 判断node是否被occluder所排除(exclude),没有则add visible nodes.

       c. objects_shader->runSync(RENDER_SCENE_NUM_THREADS);同步等待8线程并发处理所有没被occulude排除的
       visible node将它置为visible并将它们在bound_frustum中的surface(submesh)加入surfaces中.

       c. 在update_intersection()函数中遍历各线程所加入的surfaces[iThread].size, 将其按材质是否透明收集
       到opacity_surfaces和transparent_surfaces中。

   2. 反射渲染(render reflections):
      render reflections中遍历opacity_surfaces和transparent_surfaces处理收集reflection_2d_surfaces和   reflection_cube_surfaces.并进行反射渲染.

   3. update scene:
      分别UpdateSurface了opacity_surfaces和transparent_surfaces两种surface,
    内部好像只是针对OpctitySurfacefade state和tessellation state设置了对应的材质,并将surface链接起来遍历调用
    它们的create(),而create()内部只调用了create(ObjectSurface *surface), 这个好像只有skinmesh重载进行了处理。

   4. sort scene:
      按照type、mask、center.x顺序分别对Lights、defferredLights、forwardLights进行排序
      按照material、resource顺序对opacity_surfaces进行排序
      按照order、sequence、distance、blending顺序对transparent_surfaces进行了排序。
      在scene->optimize()中将opacity_surfaces和transparent_surfaces统一收集到optimized_surfaces中,然后让      opacity_surfaces和transparent_surfaces重新指向对应的optimized_surfaces中元素。(这是为了让surface更紧凑达到优化效果?)

   5. deferred textures:
      a. 先得到
    deferred->depth_texture、
    deferred->color_texture、
    deferred->normal_texture、
    deferred->parallax_texture、
    deferred->texturerender

      b. render deferred surfaces:
    render_deferred_surfaces(scene->getOpacitySurfaces(),0)
    render_deferred_surfaces(scene-getTransparentSurfaces(),0)
 

   6. occlusion queries:
     这个是使用dx9的硬件查询进行occulsion的culling.

 

 

http://frustum.org/
http://www.humus.name/index.php?page=3D
https://www.assembla.com/code/scavenger/subversion/nodes/692/Scavenger
http://www.hmrengine.com/blog/?cat=5

 


 

posted @ 2014-03-21 16:01 flipcode 阅读(181) | 评论 (0)编辑 收藏
  2013年12月27日
秦坦之旅的模型显示, 上个女主角祼模:

还有招唤出来的死灵:

通过pixwin分析模拟出来的对应的shader:
uniform matrix wvp;
uniform texture BaseTexture;
uniform texture BumpTexture;
sampler t = sampler_state
{
Texture = <BaseTexture>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
};
sampler b = sampler_state
{
Texture = <BumpTexture>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
};
static const int MAX_MATRICES = 48;
float4x4 g_boneMatrices[MAX_MATRICES] : WORLDMATRIXARRAY;
struct VS_IN
{   
float4 pos   : POSITION;
float2 tex : TEXCOORD0;
float3 Normal : NORMAL;
float4  BlendIndices : BLENDINDICES;
float4  BlendWeights : BLENDWEIGHT;
};
struct VS_OUT
{
    float4 pos : POSITION;
    float2 tex : TEXCOORD0;
};
//----------------------------------------------------------------------
VS_OUT VS( VS_IN vsIn )
{
VS_OUT vsOut;
int indices[4] = (int[4])vsIn.BlendIndices;
indices[0] = vsIn.BlendIndices.z*255;//vsIn.BlendIndices[2]*255;
indices[1] = vsIn.BlendIndices.y*255;//vsIn.BlendIndices[1]*255;
indices[2] = vsIn.BlendIndices.x*255;//vsIn.BlendIndices[0]*255;
indices[3] = vsIn.BlendIndices.w*255;//vsIn.BlendIndices[3]*255;
float weights[4] = (float[4])vsIn.BlendWeights;
float4 pos = 0.0f;
float4 bonepos = vsIn.pos;
bonepos.w = 1;
for ( int i = 0; i < 4; i++ )
{
pos += mul( bonepos, g_boneMatrices[indices[i]]) * weights[i];
  }
vsOut.pos = mul( pos, wvp );
vsOut.tex = vsIn.tex;
return vsOut;
}
struct PS_OUT
{
    float4 color : COLOR;
};
//----------------------------------------------------------------------
PS_OUT PS( VS_OUT psIn )
{
PS_OUT psOut;
  psOut.color = tex2D(t, psIn.tex);
//psOut.color = float4(1,1,1,1);
return psOut;
}
//----------------------------------------------------------------------
technique RenderMsh
{
    pass P0
    {
        VertexShader = compile vs_2_0 VS();
        PixelShader  = compile ps_2_0 PS();        
    } 
}
posted @ 2013-12-27 17:58 flipcode 阅读(191) | 评论 (0)编辑 收藏
仅列出标题  下一页