|
关于量子力学和人工智能的几个想法 量子力学,光子,意识,智能
不以量子力学为基础的人工智能都是在吹牛逼,就经典计算机那点可怜的计算能力,也个全局实时光照都搞不定的,阴影锯齿满天飞,也配搞人工智能? 人类的认知和智能来自于大脑中的量子力学作用(量子纠缠,量子叠加,波函数的坍塌),真正的人工智能也必定根源于此。 AlphaGo?围棋的游戏输入规则实在简单地离谱,好意思说人工智能! 量子力学基础理论在最近几十年没有根本性进展,没有与相对论达成妥协,形成统一理论。实用领域科学家还在吃爱因斯坦的老本。 有了量子计算机(能出现吗),就终于可以验证薛定谔的猫的悖论了。 现有的以软件算法为主的VR技术方向是卡马克引导的错误方向,没有持续的创新的硬件发展,VR仍然是个玩具。 虚拟现实仍然跟人的意识有关,真正的虚拟现实必然也基于量子计算机的能力。 机器人研究本质是人工智能研究,机器人现在能像个正常人一样上台阶了吗?Siri和小娜还是在百度上给你搜索关键字么? 有种说法叫弱人工智能,丫的不就是个算法么!
综上,量子计算突破之前,VR和人工智能都是在作商业炒作,资本家和研究人员之间心照不宣。
星际争霸2 Beta测试开始了,下载下来,没有帐号玩不了,于是开始琢磨客户端资源.
又看到熟悉的MPQ打包文件,很顺利地打开Battle.net\Battle.net.MPQ. 里面是战网的界面资源,界面用的是Scaleform的gfx格式文件,在SWF目录下,显然StarCraft2采用了Scaleform的界面解决方案.接着用2.2版本的ScaleformSDK尝试打开,报告格式不兼容,失败. 配合Scaleform使用的是png格式的图像文件. 简体中文版的汉化文字已经做好了,在Battle.net.MPQ\i18n\zhCN\String\*.xml里面.
Mods目录下是主要的资源文件,除了MPQ出现了*.SC2Assets/*.SC2Data/*.SC2Locale文件. 其中*.SC2Locale是文本文件,直接用记事本打开. *.SC2Assets/*.SC2Data用UltraEdit打开后,发现还是MPQ文件,于是直接加个.mpq后缀就用MyWarCraftStudio打开看到里面的内容了. Core.SC2Mod\Base.SC2Data里有个Shaders目录,大量的.fx文件,嘿嘿,FX Shader! 比较眼熟的有HDR/DeferredLight/VSSkinning/VSShadow/PSShadow/PSSSAO/PSParallax/PSPostProcess等.嗯,那OpenGL也是用这些shader吗? Core.SC2Mod\Base.SC2Data]\UI里是游戏界面,用的Flash文件, 有一些*.galaxy文件,不知道做什么用的.
Mods\Liberty.SC2Mod\base.SC2Assets是最大的打包文件,打开后发现大量的*.m3格式文件,这就是星际2的模型文件了.纹理这次直接使用的DDS文件,直接看. 另外还有一种与m3共存的m3h格式的文件,是xml格式的文本文件,记录了那些可以灵活配置的模型数据,比如Socket绑点.
Mods\Liberty.SC2Mod\Base.SC2Data里的GameData目录是游戏逻辑相关大量配置文件.
Support/Version目录下是一些dll,看出星际2用VS2005开发的,用fmod音效底层,icudt42.dll/icuin42.dll/icuuc42.dll不知道是什么库.baselineCache.bin有几十兆,好像是预编译好的shader文件.
打开SC2.exe文件,找到几个hkpXXX,那就是使用了Havok物理引擎了.
看来只要把m3和m3h格式搞清楚,再用里面的Fx Shader一渲染就差不多了.
症状: 重装Office2007,安装条在滚动到一半左右的时候,报错“错误25004。Per-user install not supported.” 搜索网络后解决,方法为,打开注册表编辑器找到
HKEY_LOCAL_MACHINE\Software\Classes\Installer\Products\,删除所有000021打头的键值。
这些地方记录的是Office2007的安装源路径,卸载不干净会导致下次安装过程中出错.
D3D10_BLEND_DESC -> CreateBlendState -> ID3D10BlendState D3D10_DEPTH_STENCIL_DESC -> CreateDepthStencilState-> ID3D10DepthStencilState D3D10_RASTERIZER_DESC -> CreateRasterizerState -> ID3D10RasterizerState
struct D3D10_BLEND_DESC { BOOL AlphaToCoverageEnable; BOOL BlendEnable[8]; D3D10_BLEND SrcBlend; D3D10_BLEND DestBlend; D3D10_BLEND_OP BlendOp; D3D10_BLEND SrcBlendAlpha; D3D10_BLEND DestBlendAlpha; D3D10_BLEND_OP BlendOpAlpha; UINT8 RenderTargetWriteMask[8]; };
struct D3D10_DEPTH_STENCIL_DESC { BOOL DepthEnable; D3D10_DEPTH_WRITE_MASK DepthWriteMask; D3D10_COMPARISON_FUNC DepthFunc; BOOL StencilEnable; UINT8 StencilReadMask; UINT8 StencilWriteMask; D3D10_DEPTH_STENCILOP_DESC FrontFace; D3D10_DEPTH_STENCILOP_DESC BackFace; };
struct D3D10_RASTERIZER_DESC { D3D10_FILL_MODE FillMode; D3D10_CULL_MODE CullMode; BOOL FrontCounterClockwise; INT DepthBias; FLOAT DepthBiasClamp; FLOAT SlopeScaledDepthBias; BOOL DepthClipEnable; BOOL ScissorEnable; BOOL MultisampleEnable; BOOL AntialiasedLineEnable; };
要带着引擎系统所共有的问题去阅读,不要被具体引擎的实现思路牵着走,要思考这个引擎如何实现或绕过(如不考虑低端机)这些必然要面临的问题.
首先,最重要的必须,在Debug模式下调试起来一个主场景程序,然后沿着代码流走几遍,在代码里闲逛,生成第一印象,留意基础工具设施类(如字符串内存管理),大约3小时. 然后带着如下每一个问题(不分先后)去走流程,走逻辑,弄清引擎的业务处理方法.
1.SetStreamSource,SetIndices,DrawIndexedPrimitive的调用是在哪里(哪个cpp哪个类的哪个函数),整个工程有几个DrawIndexedPrimitve,DrawPrimitveUp,DrawXXX,被统一管理了吗,还是零零散散地分布在各个cpp各个类?
2.纹理资源是如何管理的?句柄,ID,指针? 按使用时间,按使用计数? 模型顶点资源是如何管理的,是否有Buffer分配上的优化(比如顶点缓冲整合)? 渲染的实例数据如何管理,如何与资源概念区分的? 纯3D资源如Shader/RenderTarget是如何管理的?
3.场景管理是怎样搭建的,如何包含区分节点实例数据和资源数据?镜头是如何被各模块访问的?剔除不可见物件的代码行在哪里?兼容各种算法吗,使用了具体的算法是什么?不论使用何种算法,场景管理模块是否提供了清晰的需求定义接口?
4.骨骼动画是在哪里计算的,具体到顶点乘以矩阵是在哪个cpp的哪个代码行里?Socket实现在哪里?如果有高级动画系统,骨架在哪里,有什么功能?动作融合的矩阵间过渡代码在哪一行?
5.异步数据加载是怎样做的,在哪个cpp里,由哪个模块管理?各个资源的加载读取cpp代码行在哪里?
6.渲染管线如何为ShadowMap提供深度图,如何为CubeMap,水面反射提供场景RenderTarget?如何管理固定流水线状态RasterState的?
7.材质管理系统是如何运作的(通常都是technique + multipass),如何并入管线的,如何从理论上保证可以实现各式各样的效果的?如何抽象兼容固定和可编程流水线的? 如果是抽象管理的,如何抽象掉不同的technique下的不同的数据?管线里是否有独立的后期效果,还是用材质表达出来?材质是否可以脚本化?材质是要分组的,排序的代码段在哪个cpp的哪里?
8.特效如粒子系统到最后是使用哪个DrawXXX画出来的? 粒子系统是动态公式计算(不要理会具体公式)还是帧动画?
9.界面2D Texture Draw是如何被支持的?文字渲染是如何被支持的,特别是如何支持中文的,字体资源如何被管理?是否使用Freetype,是否支持东亚文字?
10.物理系统的接口是如何定义引擎的需求的?或者就是乱糟糟地直接用上.
http://theinstructionlimit.com/?p=14 这篇对高斯模糊的基本数学原理和实际实现讲解得非常清楚,应该算是对高斯模糊讲解最好的文章了.
如何上下颠倒一个场景的成像? 我的第一个念头是想把镜头上下颠倒(Up向量取负)即可,后来想想不对,镜头上下颠倒后,世界也左右颠倒了. 然后想可以在投影矩阵上搞鬼,因为经过正常投影矩阵作用后的顶点的y值分布在[-1,1]之间,所以对y取负,就可以使画面颠倒呈现(而且对上层毫无影响).如果使用可编程流水线,只要在VertexShader里将输出的gl_Position的y值取负即可.如果使用固定流水线,需要将正常的投影矩阵左乘(DX是右乘)一个Scale(1.0f, -1.0f, 1.0)矩阵即可,也可以直接将正常投影矩阵的第2行(DX是第2列)取负. 实作后,果然画面正确地上下颠倒了.但是发现,从VS到PS的法线的插值结果不对了,图像化PS中的法线值后呈现的颜色和无颠倒的图像颜色完全不同,似乎前后颠倒了,如下: void main() { gl_Position = ftransform(); gl_Position.y = -gl_Position.y; // 将顶点法线传入PS gl_TexCoord[0] = vec4(gl_Normal, 1.0); } void main() { // 将法线值显示出来 gl_FragData[0] = gl_TexCoord[0]; } 根据Perspective-Correct Interpolation的数学原理,深度值倒数是线性插值的,而从VS到PS的数值是根据深度值倒数做的插值: 研究公式后,觉得y值取负理应不会影响到z值的正确计算,z值不变,整个插值的结果应该是不变的,茫然不知所以. 今天突然想到,y值取负后,所有三角形成像颠倒了,三角形的顶点顺序也逆反了,原来逆时针的变成了顺时针,影响了GL_CULL_FACE,输出的画面会呈现前后颠倒的假象,实作下果然如此,修改了CULL_MODE后,终于得到想要的画面了. 其实,我想说,搞图形学,你不懂数学原理能行吗? Reference:Mathematics for 3D Game Programming and Computer Graphics
1.MSDN中给出的glOrtho矩阵数学表达式是不符合实践的,是误导的. 2.很多网站上的glOrtho数学表达式是错误的,查资料时要注意. 3.正确的表达式应该是 http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml 4.注意在传入参数时,far/near是正数,但实际的含义是指-far,-near,因为OpenGL是右手坐标系,镜头空间的+Z指向观察者,-Z才指向世界深处.
|