软光 – the visibility problem

软光 – the visibility problem

In the second chapter of this lesson, we learned that in the third coordinate of the projected point (the point in screen space) we store the original vertex z-coordinate (the z-coordinate of the point in camera space):【从第二章我们知道,我们存储了额外的z值】         Finding the z-coordinate of a point on the surface of the triangle is useful
Read More

软光 – the projection stage

Quick Review     In the previous chapter, we gave a high-level overview of the rasterization rendering technique. It can be decomposed into two main stages: first, the projection of the triangle’s vertices onto the canvas, then the rasterization of the triangle itself. Rasterization really means in this case, “breaking apart” the triangle’s shape into
Read More

软光 – An Overview of the Rasterization Algorithm

各种教程: OpenGL https://github.com/ssloy/tinyrenderer/wiki OpenGL http://www.3dcpptutorials.sk/index.php?id=15 Opengl ES 2.0 https://github.com/hmwill/GLESv20     我这里需要的软光栅是不需要OpenGL,DirectX的     Rasterization: a Practical Implementation https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation     代码: https://www.scratchapixel.com/code.php?id=26&origin=/lessons/3d-basic-rendering/rasterization-practical-implementation     An Overview of the Rasterization Algorithm     The rasterization rendering technique is surely the most commonly used technique to render images of 3D scenes, and yet, that is probably
Read More

Software Occlusion Culling – intel

https://software.intel.com/en-us/articles/software-occlusion-culling https://software.intel.com/en-us/blogs/2013/03/22/software-occlusion-culling-update https://software.intel.com/en-us/blogs/2013/09/06/software-occlusion-culling-update-2     Abstract: The technique divides scene objects into occluders and occludees and culls occludees based on a depth comparison with the occluders that are software rasterized to the depth buffer. 【做法】 The sample code uses frustum culling and is optimized with Streaming SIMD Extensions (SSE) instruction set and multi-threading to achieve
Read More

Occlusion Culling – oxel

全局讲述: http://www.nickdarnell.com/oxel/     Hierarchical Z-Buffer Occlusion Culling http://www.nickdarnell.com/hierarchical-z-buffer-occlusion-culling/     Hierarchical Z-Buffer Culling Steps: Bake step – Have your artists prepare occlusion geometry for things in the world that make sense as occluders, buildings, walls…etc. They should all be super cheap to render, boxes/planes. I actually ran across this paper, Geometric Simplification For Efficient
Read More

Android Terrain Rendering

从这篇开始讲起: http://galfar.vevb.net/wp/2013/android-terrain-rendering-vertex-texture-fetch-part-1/     To my surprise, I found out that GPU (PowerVR SGX 540) in my venerable Nexus S (2010) supports vertex texture fetch (VTF). That is, accessing texture pixels in vertex shader — a very useful feature for terrain rendering. About a year ago, when I started investigating terrain rendering on Android devices,
Read More

Phase-Functioned Neural Networks for Character Control

理论部分:     http://theorangeduck.com/page/phase-functioned-neural-networks-character-control     视频内容: 讲者背景:角色动画机器学习方向的博士毕业, 动画系统,中间的就是黑盒,就是动画系统 用户输入动画系统的是按钮的指向信息,如图所示的平面的指向,是比较高级的指令,比如我们想走向哪个方向。 动画系统则像是巨大的状态机,不同的状态对应不同的动画,之间会有动画混合。这个复杂的系统直接写代码比较复杂,很难维护, 因此我们重新考虑能不能用一个简单的算法来实现这个复杂的动画交互系统。 我们希望动画系统的输入输出就变成一些参数而已。 我们再来看原来的复杂的动画系统,如果把输入输出看作是动画模型的参数,那么也是可以做到的,就像是在一个巨大的数据库里面挑东西输出。 因此我们希望做到的第二点就是直接输出下一个pose 当然可以,基本思想就是把动画系统当作是黑盒,我们给一些输入就有想要的输出,后面具体讲做法。 输入x:Trajectory Positions, Directions, Heights;Previous Joint Position, Velocities… 输出y:各关节的transform信息 要做训练我们首先需要数据,采用的是动作捕捉,每一段约十分钟,一共约两小时的非结构化的数据。 高度匹配的问题,我们捕捉的数据默认脚就是完全贴合地面的,以此来训练,我们是了大量的各种不同的地面来获得相关的数据。 然后我们来看怎么学习 一个神经网络事实上就是一个函数, 比如这个函数就可以让输入得到相应的输出 我们的函数的输入输出如图所示 而这个可以量化为vectors作为输入输出 如果是单层的最简单的NN举个例子可以像是这样,wb这两个参数就是我们需要学习得到的结果。 输入就是已知的xy 输出就是学习得到的结果wb,如这里所示 最终我们得到的这个函数叫做行为函数 这里可能涉及各种不同的函数,比如这个是非线性混合函数 这两个就是很类似的 如果是深度学习的多层的函数,其表现就是这样 这个例子就是一个三层的神经网络公式 训练的做法就是每次输入值,然后跟据得到的结果衡量错误,然后在调整网络的参数,这就是基本的思路 我们采用了GPU运算节省时间 Phase-functioned NN意思就是我们采用了一种特殊的NN方法,对于不同的motion采用不同的网络权重,避免混合motions,细节请看paper 这是我们最终获得的,简单的动画驱动模型来替代state machineg和blend tree 然后展示demo 性能展示 结论     首先完整看一遍PPT: SIGGRAPH上面的演讲PPT 目标:游戏中的角色控制做到快速紧凑的表现力 最终结果展示
Read More

AIAnimation使用代码分析

历尽艰难跑起来了,问题是没有办法操作,猜测Ubuntu和windows的操作代码不兼容,代码分析部分的主要目标之一就是把操作改掉:     代码结构分析 一切从main函数开始: 首先是SDL初始化,Simple DirectMedia Layer(SDL) is a cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware via OpenGL and Direct3D. 可以说是一个常用的跨平台opengl支持库。 这边就是想到应该不会是操作兼容性的问题导致不能动,一看代码原来是只支持手柄。 可惜的是,windows平台上面跑起来好卡,感觉帧率小于10帧! GLEW初始化 资源加载 Options 里面定义的是一些我们可以修改的设置选项: CameraOrbit 则是相机初始化设置 LightDirectional 场景光照初始化设置 这里就是一堆GL设置 Character 角色初始化设置 这部分是这里的角色的定义信息和加载,这部分很重要! 首先我们来看一下存储的角色数据的文件包涵下面四个,坑爹的采用了二进制存储: 顶点,三角形,父子关系,xforms信息分别四个文件。 读文件的函数这边也很简单,将数据直接存进对应的容器,角色数据结构信息如下: 这部分最后就是一个前向动力学的实现,这个很简单,就是子类跟着父类运动。 Trajectory 路径初始化设置 这里就是定义了运动路径的数据结构,如下所示: IK 初始化设置
Read More

AI4Animation 工程

这里尝试非常多次还是没有办法对于里面的demo信息完整打开且没有报错,可以跑的demo。 因此我们在AIAnimation的基础上首先来看看这个工程怎么使用起来。     首先来看重点在角色,我们来看其角色的构造: 上面是两个demo的使用结构,可以看到就一个重要的csharp文件,我们来对比分析。 Original对应的是Siggraph17的内容,Adam对应的是Siggraph18的内容,我们先来看17。     首先看大的结构: 第二个类继承Editor对象,作用是在editor里面形成层级菜单Animation,其余的三个则是分别由另外的三个类来完成。 这三个对象也分别形成了三个子标签菜单项,如上面所示的图。 NeuralNetwork 这个类,里面只做了一件事情,就是让用户选择NN模型,也就是说这个类处理的是交互UI表现和逻辑,没有其他。NN里面应该包含的信息都在Model这个类里面。下图就是model里面存储的数据结构: 然后我们来看接口函数: 这边是为了兼容和扩展多种的NN方法设置的接口。 剩下的就是一些Tensor相关的函数,Tensor是对Eigen数据的封装,其真实的计算实现都是由Eigen实现的,这边同时提供了一堆的数据结构关联操作的方法。 最后model里面涉及的比较重要的内容就是Parameters,这边unity里面主要做的就是加载读取和存储方法。 Controller 这个类,处理的是Input,主要就是WSADQE. 还有一个很重要的变量是Styles数组,记录的应该是状态权重。 Character 这里做的就是驱动骨架运动。 而作为核心的中介数据 Trajectory 这个类,其就是一组数据点数组,并且包含对这个数组,单个点的操作方法。单个点的数据内容很丰富,包括各种变换和状态等:     所有的核心使用方法就是在Update函数里面,这边的做法应该是和AIAnimation里面是一模一样的,我们可以对比一下: 只有存在NN模型的情况下,才会执行下面的所有内容。 Update Target Direction / Velocity 这里做的就是: TargetDirection = TargetDirection 与 Trajectory定义的当前位置 跟据 TargetBlending 权重混合。 TargetVelocity = TargetVelocity 与 Controller输入速度 跟据 TargetBlending 权重混合。 Update Gait Trajectory.Points[RootPointIndex]
Read More