战魂小筑

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

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

#

先测试:https://www.google.com

如果无法打开,尝试访问

http://www.google.com/ncr

然后再打开

https://www.google.com

就不会转向香港首页

 

Chrome中添加网址https://www.google.com/search?hl=zh-CN&q=%s

不过SSL貌似不支持图片搜搜,因此香港版的最好保留

posted @ 2010-06-05 09:49 战魂小筑 阅读(673) | 评论 (0)编辑 收藏

原文地址:http://zhaiyx.com/2010/06/ghost-fighter/

一段类似于火柴人格斗的Flash动画,不过华丽度却绝非火柴人系列可以相比。更牛逼的是,动画还支持镜头缩放和视角切换。

         动画很简短,但值得一看。

控制说明:
右边数字键盘1、2、3、4:切换镜头视角
鼠标滚轮:放大/缩小镜头
上下:控制播放速度
左右:逐帧查看
空格:播放/暂停
S:打开/关闭音乐
F:显示/隐藏FPS
Q:切换影片质量

http://www.wacoool.com/up_files/flash/ghostfight.swf

posted @ 2010-06-03 20:00 战魂小筑 阅读(533) | 评论 (0)编辑 收藏

原文 http://www.cnblogs.com/cocoaleaves/archive/2009/09/25/1573683.html

XNA里的很多例子提供了光照最基础的教学,可惜XNA不是谁都喜欢, RenderMonkey才是Shader研究的王道工具, 链接里提供了例子下载,非常经典,不可不看

posted @ 2010-06-03 11:57 战魂小筑 阅读(2661) | 评论 (0)编辑 收藏

朋友给我了一个VS2010的一个BUG: 任意位置, CTRL+F打开搜索窗口,ESC关闭,不停的重复以上过程, 窗口将会不断变大,关闭VS2010后再次打开依然保持大小.

已经有人报过这个BUG, http://connect.microsoft.com/VisualStudio/feedback/details/555385/find-and-replace-window-changes-size-and-location

posted @ 2010-06-02 22:55 战魂小筑 阅读(2258) | 评论 (3)编辑 收藏

昨天研究了下Node Based Material System, 虚幻3的材质系统是没戏了,还没用会呢. 不过Max的一个插件: ShaderFX倒是给我很大的启发,这东西就是结点型材质系统, 而且能生成真正的FX. 不像虚幻3那么不厚道,只是局部显示HLSL.

image

经过分析ShaderFX导出的Shader文件, 发现其标准材质系统使用的就是逐像素光照模型, 而不同的Materials对应的就是一种Shader处理管线, 分别可以处理各种光照,甚至达到Compositor的混合效果. 而Shader Code Generation这个环节,也远没有虚幻3那样复杂(虚幻是神,咱们不评论神到底如何),只是将光照需要的各种分量,例如Emissive, Ambient, Diffuse, Specular等根据各分量提供的计算因子直接嵌入到Pixel Shader主函数体即可.

逐顶点光照在前面的文章已经有介绍,代码相对简单, 因此以后在材质系统中准备直接上逐像素光照. 因此,需要在我的模型插件中加入Tangent及Binormal支持.

这里是一篇很不错的讲解Tangent Space Vector的文章. 文中有贴过OGRE的Tangent计算代码,不过查阅OGRE 1.65代码后发现,OGRE现在根本就不用这个函数计算Tangent,而是更为复杂的一个类.

最终,我还是使用了大野猪的ev3d的max插件代码, 如果需要的话,可以去他博客找svn下载

 

bool CMaxMesh::__cacl_tbn(sFace_t& face,bool isSkin)
{
    Point3  normal[3];
    Point3  Tangent; 
    Point3  p[3];
 
    assign(normal[0],m_MeshData.m_VertexData.m_Normals[face.vert[0]]);
    assign(normal[1],m_MeshData.m_VertexData.m_Normals[face.vert[1]]);
    assign(normal[2],m_MeshData.m_VertexData.m_Normals[face.vert[2]]);
 
    if(isSkin == false)
    {
        assign(p[0],m_MeshData.m_VertexData.m_Positons[face.vert[0]]);
        assign(p[1],m_MeshData.m_VertexData.m_Positons[face.vert[1]]);
        assign(p[2],m_MeshData.m_VertexData.m_Positons[face.vert[2]]);
    }
    else
    {
        assign(p[0],m_MeshData.m_VertexData.m_VertexWeights[face.vert[0]].m_InitPos);
        assign(p[1],m_MeshData.m_VertexData.m_VertexWeights[face.vert[1]].m_InitPos);
        assign(p[2],m_MeshData.m_VertexData.m_VertexWeights[face.vert[2]].m_InitPos);
    }
 
 
    sUVCoord_t uv[3];
    uv[0] = m_MeshData.m_VertexData.m_UVChannels[0][face.vert[0]];
    uv[1] = m_MeshData.m_VertexData.m_UVChannels[0][face.vert[1]];
    uv[2] = m_MeshData.m_VertexData.m_UVChannels[0][face.vert[2]];
 
    Point3  e1 = p[1] - p[0];
    Point3  e2 = p[2] - p[0];
    sUVCoord_t u1 = { uv[1].u - uv[0].u , uv[1].v - uv[0].v};
    sUVCoord_t u2 = { uv[2].u - uv[0].u , uv[2].v - uv[0].v};
 
    float det =  ( u1.u * u2.v - u2.u * u1.v);
    if(det == 0.0f)
    {
        Tangent = e1;
    }
    else
    {
        Tangent = u2.v * e1 - u1.v * e2;
    }
 
    //从Normal 和 Tangent里重新计算出Tangent,因为面的Tangent和顶点的Normal可能不垂直
    Point3 final_tangent;
    for(int i = 0 ;i < 3 ; ++i)
    {
        Point3 binormal  = CrossProd(normal[i],Tangent);
        final_tangent = CrossProd(binormal,normal[i]);
        final_tangent.Normalize();
        m_MeshData.m_VertexData.m_Tangents[face.vert[i]].x += final_tangent.x;
        m_MeshData.m_VertexData.m_Tangents[face.vert[i]].y += final_tangent.y;
        m_MeshData.m_VertexData.m_Tangents[face.vert[i]].z += final_tangent.z;
 
    }
    return true;
}

 

感谢大野猪友情出演,正片开始:)

image

posted @ 2010-06-02 15:55 战魂小筑 阅读(2100) | 评论 (2)编辑 收藏

在Notepad++官网的User DefinedLanguage files下载一种你需要的自定义语言文件,例如HLSL

将这个文件命名为userDefineLang.xml,并拷贝进以下目录:

XP: C:\Documents and Settings\[username]\Application Data\Notepad++

Vista/Win7  C:\Users\[username]\AppData\Roaming\Notepad++

如果已经有这种文件,将下载的文件内容手动添加到原文件

这里推荐下OGRE官网的Cg自定义语言模板,这个标色比较不错

posted @ 2010-06-02 10:37 战魂小筑 阅读(6275) | 评论 (5)编辑 收藏

DXSDK里光照模型的讲解依然停留在DX9的固定管线时代; DX10及DX11的文档里只是API文档,居然一点基于Shader的光照模型讲解文章都未见,失望.

无奈, 打开NV官网,找到这样一篇文章, 基于Cg语言的Shader标准光照模型讲解, Bingo!

了解标准光照基础知识后,就不会面对MAX的材质系统, Maya的Node Based Material System感到陌生.

这里贴下这组光照模型的Cg代码

 

float4x4 matViewProjection;
 
 
float3 GlobalAmbient;
float3 LightColor;
float3 LightPosition;
float4 EyePosition;
float3 Ke;
float3 Ka;
float3 Kd;
float3 Ks;
float Shininess;
 
 
void vs_main( 
   in float4 InPosition : POSITION,
   in float3 InNormal : NORMAL,
   out float4 OutPosition : POSITION,
   out float4 OutColor : COLOR0
 )
 
{
 
   OutPosition = mul( InPosition, matViewProjection );
   
   float3 P = InPosition.xyz;
   float3 N = InNormal;
   
   // Compute the emissive term
   float3 Emissive = Ke;
   
    // Compute the ambient term
   float3 Ambient = Ka * GlobalAmbient;
   
   
   // Compute the diffuse term
   float3 L = normalize( LightPosition - P );
   float DiffuseLight = max( dot( N, L ), 0 );
   float3 Diffuse = Kd * LightColor * DiffuseLight;
   
   // Compute the specular term
   float3 V = normalize( EyePosition - P );
   float3 H = normalize( L + V );
   float SpecularLight = pow( max( dot( N, H ), 0 ), Shininess );
   
   if ( DiffuseLight <= 0 )  SpecularLight = 0;
   
   float3 Specular = Ks * LightColor * SpecularLight;
   OutColor.xyz = Emissive +  Ambient + Diffuse + Specular;
   OutColor.w = 1;   
}
 
float4 ps_main( float4 OutColor : COLOR0 ) : COLOR0
{   
   return( OutColor );
   
}
posted @ 2010-06-01 14:51 战魂小筑 阅读(3415) | 评论 (1)编辑 收藏

今天顺利显示静态模型, 加上纹理后,发现ZBuffer好像有点不对劲

image

于是检查D3DRS_ZENABLE,D3DRS_ZWRITEENABLE, 结果都是TRUE

无奈,只有与我以前正确的Demo对比210个渲染状态. 有部分渲染不同的,使用硬代码强行纠正,结果: 无效

怀疑顶点格式破损, 重新使用以前的模型格式,排除这个可能性, 结果:失败

无奈中,检查设备选项, 突然注意到D3DPRESENT_PARAMETERS 结构体中的EnableAutoDepthStencil 设置是FALSE

因为这次设备类是重写的,对比以前正确代码, 有差异,将其改为

PresentParameters.EnableAutoDepthStencil    = TRUE;
    PresentParameters.AutoDepthStencilFormat    = D3DFMT_D16;

以前翻阅SDK时,注意过这个选项, 这是由D3D帮你管理ZBuffer.

测试, 问题解决.

 

分析: 如果EnableAutoDepthStencil  = FALSE, 意味着连ZBuffer都没有,那更不要说渲染状态.

image 正确结果

posted @ 2010-05-26 17:01 战魂小筑 阅读(1956) | 评论 (5)编辑 收藏

DXpipeline-9.0

posted @ 2010-05-26 11:35 战魂小筑 阅读(4750) | 评论 (2)编辑 收藏

转载请注明: 战魂小筑

本文翻译整理总结自http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter05.html

如果喜欢,请购买正版

多流技术在渲染时能对性能和结构有一定好处.但是怎样将模型数据分配到各顶点数据流进行渲染就是一个学问.

 

05_multistreaming_1

对于顶点数据可以分为这么几个大类:

G: 多边形数据, 包含vertex position, normal, and vertex color(s).

T: 纹理映射, 包含多层纹理坐标及tangent vectors等

A: 动画数据, 骨骼动画中的骨骼权重及骨骼索引

I: 用于Instance绘制的用户数据

 

以下是对一些常用渲染的流搭配:

静态模型

   可以是: G or G + T

骨骼动画模型

   可以是:G + A or G + T + A

Instance绘制的骨骼动画模型

   可以是:G + I or G + T + I 或者动画类型的G + A + I or G + T + A + I

渲染Z-Pass物件

  可以是G, 或者动画类型的G + A or G + I or G + A + I

posted @ 2010-05-26 11:19 战魂小筑 阅读(1476) | 评论 (0)编辑 收藏

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