- 博客(37)
- 收藏
- 关注
原创 DirectX11,DirectX12,OpenGL,Vulkan学习资料
因为考虑到DirectX11和DirectX12的编程思路差异过大,所以分开归类DirectX113d_game_programming_with_DirectX11.pdf4-Introduction to Multithreaded rendering and the usage of Deferred Contexts in DirectX 11.pdfDirect3D_Progra...
2020-03-04 19:25:48
1459
1
原创 UV常用操作
1.UV旋转 float2 rotate(float degree, float2 coord) { float theta = radians(degree); float2 offset = float2(_OffsetX, _OffsetY); ...
2019-06-01 16:13:08
541
原创 Vertex常用操作
1.缩放顶点位置,原位置+ Normal向量*变量实现。v.vertex.xyz += v.normal * _Extrusion * abs(_SinTime.w);可用于双Pass实现基本的Outline功能,但是需要注意将Outline的Pass设为透明且不写入深度2....
2019-06-01 16:11:27
3252
转载 已知父物体位置和子节点相对位置,计算子节点世界位置
//父结点Transform parent = gameobj1.transform.parent;//结点偏差Vector3 offset = new Vector3(gameobj1.transform.localPosition.x * parent.transform.localScale.x, gameobj...
2019-06-01 14:24:12
1199
原创 Shader算法之Rim
获取观察方向和物体Normal的夹角这样可以获取到边缘的值float rim = 1.0 - saturate(dot(IN.viewDir, o.Normal));o.Emission = _Color * pow(rim, _RimPow); dot(IN.viewDir, o.Normal)//获取观察方向对Normal方向的差异如果差异越小则返回值越大。1-之后则是差异...
2019-06-01 13:54:28
702
原创 Unity 调用NativeDLL 依赖的加载顺序问题
最近在破解游戏适配到自家公司的SDK和SteamVR,在适配OpenVR的时候遇到一个问题,就是后面添加的Plugins顺序是无法被控制的,导致Compositor对openvr_api.dll产生依赖,但是这个游戏默认先加载Compositor,于是不停的显示Fallback handler could not load library错误,查了很多移动dll路径添加环境变量都没有效果,最后发现...
2019-03-22 18:06:18
1706
原创 Quaternion基于角度的相加
差异的角度转成quat 可以通过Quat::Identity().Slerp(angular)获取差异quat原始Quat =差异quat* 原始Quat就得到了相加后的quat了
2019-03-14 14:36:59
1270
原创 C++中va_list 实现动态变长变量输入
Text(const char* fmt, ...){ va_list args; va_start(args, fmt); TextV(fmt, args); va_end(args);}
2019-01-30 15:52:18
960
原创 HLSL中Texture的操作函数
最常用的一个函数是SampleSample( sampler_state S, float Location [, int Offset] );sampler_state 可以从外部的buffer传过来,也可以是hlsl内定义,一般情况下都选择从外部设置进行共享。Location应该穿入的是uv数据,不同的图片类型有不同的uv类型Texture-Object Type Parameter ...
2019-01-30 15:48:53
4078
原创 Unity3D调试Native Dll
unity工程如果已经打开,附加这儿为:是,如果unity工程是关着的,则应该是把附加设置为:否这时运行vs则会像3一样自动打开unity.如果一般应该等Unity运行起来再设置断点,否则可能会遭遇错误并且找不到源的问题...
2019-01-30 15:47:15
1682
1
原创 UnityNative Plugin 导出时遇到的坑
必须要在链接的输入里面添加模块定义文件文件大概是这样,就是为了阻止名称混淆,否则UnityPluginLoad,UnityPluginUnload这两个函数无法自动被Unity加载; file used by Visual Studio plugin builds, mostly for 32-bit; to stop mangling our exported function names...
2019-01-15 15:06:35
3135
原创 SampleState 的坑
在开发VR畸变的时候发现无论如何修改代码,判断超出uv边界discard,总是会残留边角,最后尝试修改下 D3D11_SAMPLER_DESC sampDesc = {};sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_BORDER;sampDesc.Ad...
2019-01-08 15:49:07
600
原创 高通Vr源代码分析[4] svrBeginVr,svrEndVr所做的工作
svrBeginVr()这个函数只在开始渲染的时候调用一下。1.初始化定时器2.MotionVector检测和参数初始化3.HeuristicPredictedTime分配存储4.获取Vr工作模式5.获取track工作模式6.创建并赋值modeContext7.warp和vsync的线程锁创建8.warp frame param 创建以及recenter rotation9.创建...
2019-01-02 11:04:04
564
原创 高通VR源代码分析[三]- Unity插件的工作原理
打开Unity文件夹 svrPlugin.cs是插件的基类SvrPluginAndroid 才是真正的实现,里面包含了一系列的导入方法,导出方法的cpp文件是放在svrUnity文件夹里SvrManager是插件启动的入口,其中Start被写成了IEnumerator的形式,这样可以进行延迟的加载操作。SvrEye是绑在相机上并获取输入画面的,其中包含两个回调函数 public deleg...
2019-01-02 10:46:58
1154
原创 高通VR源代码分析[二] SvrApplication应用管理类
SrvApplication找到SimpleVR可以发现jni下有个c++类叫app.点开发现这个类继承了Srv::SrvApplication类在高通提供的 SDK 中,所有的类都在Srv命名空间下,这个类就是程序启动需要重写的基类。需要重写的函数大概有以下几个, virtual void LoadConfiguration() = 0; virtual v...
2018-12-29 10:36:58
1072
原创 高通VR源代码分析[一] 程序的启动入口
从Android端利用jni调用C++代码AndroidMainSvrAndroidMain.cppSrvApplicationInitialize()AndroidMain找到Android端运行的Java文件可以发现只有loadlibrary相关,所以在载入library后应该会自动执行一系列的初始化执行动作static{ System.loadLibrary( "svrapi" ...
2018-12-28 19:26:01
981
原创 DirectX中不同的Device或者Context使用共享资源
在游戏中,经常都提供我们可以切换DirectX版本的,而且在编写一些渲染插件的时候,也会遇到不同的Device或者Context使用相同的资源,这种情况下,如果不将资源设为共享而直接调用,就会因为抢占资源而导致Crash。使用资源的方法//创建共享资源并设置MiscFlags=D3D11_RESOURCE_MISC_SHARED,然后获取SharedHandle.D3D11_TEXTURE2...
2018-12-10 11:10:06
3255
2
原创 顶点数和基本几何体的数量关系
UINT32 RenderAPI::vertexCountToPrimCount(DrawOperationType type, UINT32 elementCount) { UINT32 primCount = 0; switch (type) { case DOT_POINT_LIST: primCount = elementCount; break; c...
2018-12-05 18:08:57
775
原创 operator[] 运算符返回引用和返回值得不同const修饰
对于返回值的,一般作为右值进行获取,所以这个过程中应该是不变动内部的值对于返回引用的,一般作为左值进行赋值,所以不能采用const修饰float operator[] (const size_t i) const{ return *(&x+i);}float& operator[] (const size_t i){ return *(&x+i);}...
2018-12-03 15:46:51
562
1
原创 不设置静态变量判断一个静态类是否已经初始化
不用静态变量的话可以增加代码的简洁度,采用静态函数代替,由于返回的是引用,所以该函数可以直接赋值,isStartedUp()=true;其次由于静态变量在函数块内部只初始化一次并存在,所以可以一直使用/** Checks has the Module been started up. */static bool& isStartedUp(){ static bool inst =...
2018-12-03 10:20:22
371
原创 Perspective的矩阵计算方法
高通VR里面的通用透视矩阵计算方法 static public Matrix4x4 Perspective(float left, float right, float bottom, float top, float near, float far) { float x = 2.0F * near / (right - left); float y = 2.0F * ne...
2018-11-28 18:13:11
979
原创 限制一个类只可以在栈或者堆上创建
//只可以在栈上创建 ,删除 new 重载方法void * operator new(size_t Size) = delete;//只在堆上 ,删除默认构造和析构函数class heaponly {private: heaponly(); ~heaponly(); };...
2018-11-28 17:56:15
125
原创 引用限定符 reference qualifiers
新功能:引用限定符 reference qualifiers这样子玩:class A {public:…void doWork() &; // this version of doWork applies// only when *this is an lvaluevoid doWork() &&; // this version of doWork appl...
2018-11-27 13:48:06
274
原创 C++11 新添加的变量定义后缀支持
Standard user-defined literals[edit]C++11 defined the syntax for user-defined literal suffixes, but the standard library did not use any of them. C++14 adds the following standard literals:[16]“s”, ...
2018-11-27 13:45:59
923
原创 std::variant代替union
std::variant<int, double, std::wstring> var1{ 1.0 };std::variant<int, double, std::wstring> var2{ L"2" };std::variant<int, std::wstring> var3{ 3 };//assignvar2 = L"abc";var1 = ...
2018-11-27 13:44:16
1187
原创 std::lock_guard对整个函数加锁访问
std::lock_guard<std::mutex> lock(mutex_);性能优化是最小使用原则,那么将需要使用的代码块单独拿出来作为函数mutex_将会自动release 当超出作用范围的时候。lock_guard 对象的拷贝构造和移动构造(move construction)均被禁用,因此 lock_guard 对象不可被拷贝构造或移动构造。void safe_in...
2018-11-27 13:41:20
1044
原创 std::enable_if<bool>::type 限定模板传递的类型
类似于C#中可以指定泛型的父类,在C++编译期间强行报错通过enable_if 实现如果std::is_arithmetic::value ||std::is_convertible<T, string>::value的值为false,则会提示type 找不到,进而无法通过编译struct Initializer { template <typename T, ty...
2018-11-27 13:37:46
1478
原创 偏特化模板
std::is_integral 实现原理 // TEMPLATE CLASS _Is_integraltemplate<class _Ty> struct _Is_integral : false_type { // determine whether _Ty is integral };//有偏特化版本的类型继承的是true_type,即std::bool_co...
2018-11-27 13:32:39
311
原创 链式三元运算符
value = sizeof(v) == 1 ? static_cast<uint8>(v) : sizeof(v) == 2 ? static_cast<uint16>(v) : sizeof(v) == 4 ? static_cast...
2018-11-27 13:30:46
743
原创 添加Tags决定构造函数的分发
这个是从TensorFlow的源码中看到的用于区分同参数下不同类型的构造函数通过添加一个class ,里面添加不同的enum class 实现编译期间自动选择合适的构造 struct Tags { enum class ScopeName; enum class OpName; enum class ControlDeps; enum class Device;...
2018-11-27 13:28:07
132
原创 std::bind 函数参数绑定
std::bind 可以将一个多参数的函数转化为一个少参数 或者无参数函数,上面的bind之后变为func(int value,1,5),函数签名是bool (int)了 而非 bool(int,int,int)1.如果需要把一个类中的函数转换为全局函数签名,则std::bind(func,this);2.静态函数可以直接绑定bool fun(int value, int min, int ...
2018-11-27 13:25:13
2876
原创 DirectX编程中常见崩溃总结
1.在该传入非空的地方传入了空指针。通常是因为视图调用某个函数,但是Buffer或者资源没有初始化。2.在该传入空指针的地方传入了已经存在资源的指针。一般常见于各种Create函数3.释放资源的时候该资源其实已经被其他地方释放了,可能并非是该资源本身,而是已经被其他的资源给释放了。例如VRWorks里面的 ID3DLateLatchObject就会自动释放对应的所有Buffer资源,试图释放其...
2018-11-27 11:04:45
773
原创 3D空间中的视野,世界,视图,投影,World,View,Projection的作用和区别
D3D11_VIEWPORT vp; vp.Width = (FLOAT)m_bufferWidth; vp.Height = (FLOAT)m_bufferHeight; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = 0; vp.TopLeftY = 0; m_context-&amp;amp;gt;RSSetView...
2018-11-23 10:44:16
1985
原创 DirectX和D3DX的区别
“Direct3D”和“D3DX”之间的区别一直有,但它一直比较模糊。 D3DX从Windows8 SDK开始就已经被弃用,可以视为DirectX 的一个扩展包。D3DX的主要替代库DirectXTK,DirectXTex,DirectXMesh。 这些都支持Direct3D 11.x.平台包括Windows 8.0,Windows 8.1,Windows phone 8.x,Xbox,Win3...
2018-11-16 18:00:24
2118
原创 从零开始开发3D游戏引擎 - 在QtWidget中进行Direct3D11渲染,并捕捉Windows消息
DirectX 渲染创建一个继承QWidget的类,重写paintEvent,resizeEvent但是仅仅这样还不够,画面会一直闪烁,需要重写以下函数virtual QPaintEngine paintEngine() const { return NULL; }*并设置窗口属性this->setAttribute(Qt::WA_PaintOnScreen, true);thi...
2018-11-16 17:01:12
2352
原创 在C++中调用Unity3D中的托管方法
假设我们要调用一个C#中的静态方法,如Debug.Log方法 public static void DebugCallback(int mode, string text) { UnityEngine.Debug.Log(text); } public delegate void CSDebugCallback(int debugMode,string...
2018-11-16 13:54:29
834
原创 hlsl着色器的结构
HLSL从入门到精通第一节,hlsl的结构一般情况下需要写的Shader分为VertexShader,PixelShader两种,可以写到一个fx文件里面单独的hlsl文件以hlsl为后缀,添加到VS工程后,默认就会进行编译,如果不想每次编译工程的时候都编译生成,可以右击属性配置,在常规中选择 从生成中排除注意,选择对应的着色器类型和入口点名称,否则编译会报错其次在输出文件一栏可以...
2018-11-14 12:00:20
756
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人