开始使用Triton
Triton包括超过60,000行的代码,但只需要几行就可以将其集成到你的应用程序中。
下面是方法。
本文为如何开始使用 Triton 中文教程第一篇,点击此处进入第二篇>>
示例项目概述
检查SDK的 "样本 "目录是一个快速入门的方法。你会发现一些简单的应用程序,说明Triton在OpenGL、DirectX9、DirectX11、C#、OpenSceneGraph和Ogre应用程序中的使用,还有一些用于初始化、更新和关闭Triton的方便功能,你可以在自己的应用程序中使用。每个样本还包括一个天空盒类,它不仅用来使样本看起来更漂亮,而且还说明了环境立方体地图与Triton的整合,以获得更真实的天空反射。
你会发现使用Triton渲染无限大的海洋的例子,以及使用用户定义的几何体的小水体。
OpenGL样本是建立在OpenGL 2.0功能之上的。然而,OpenGL样本的核心代码避免了对固定函数管道的使用,对于在OpenGL 3、4和更高版本下工作的开发者来说,应该具有说明性意义。
将Triton与osgEarth一起使用
如果你正在使用osgEarth,开始使用就更容易了。osgEarth包括一个简单的Triton驱动,可以让你快速启动和运行。你所需要做的就是
在你的开发系统上安装Triton SDK。确保TRITON_PATH环境变量被设置为指向你的安装目录。
适当地运行cmake或vcpkg,重新生成包含Triton支持的osgEarth项目文件。
重新构建osgEarth并重新安装它。
参考osgearth/src/osgEarthTriton/Shaders/README.txt中关于将osgEarth的Triton着色器文件复制到Triton以完成集成的说明。
现在你可以使用随osgEarth提供的Triton.earth样本文件来测试集成。一旦相机接近地面,Triton就应该启动了。
如果你需要扩展内置Triton驱动的功能,底层的Triton::Ocean和Triton::Environment对象可以从osgEarth的TritonContext::getEnvironment()和TritonContext::getOcean()方法获得。从这些接口中,你应该可以做任何事情,比如加入唤醒器或其他效果。
配置你的项目
在C++和Windows下与Triton链接
Triton为使用Microsoft Visual Studio 2015、2017、2019或2022(应用了最新的服务包和安全补丁)创建的win32和x64应用程序提供每个运行时库的味道。你可以在SDK的lib目录下找到这些库。在你的项目属性中,将适当的库添加到你的链接器输入中。
Triton SDK安装程序定义了环境变量TRITON_PATH,当你在项目属性中引用Triton的库和头文件时,你可以使用它。
例如,对于一个用Visual Studio 2015开发的64位应用程序,并使用 "多线程DLL "运行时,你要根据以下内容进行链接
$(TRITON_PATH)/lib/vc14/x64/Triton-MT-DLL.lib.
Visual Studio 2015、2017或2019的库在 "lib/vc14",Visual Studio 2022的库在 "lib/vc143"。请参考下表,将适当的库文件与你的项目所使用的运行时间相匹配(你可以在项目中的 "C/C++/代码生成 "属性页下找到)。
我们的库是针对Windows SDK 10链接的,目前只支持桌面应用程序。
| Runtime flavor | Triton库 |
| Multi-threaded | Triton-MT.dll |
| Multi-threaded Debug | Triton-MTD.dll |
| Multi-threaded DLL | Triton-MT-DLL.dll |
| Multi-threaded Debug DLL | Triton-MTD-DLL.dll |
请注意,Visual Studio 2017和2019只有在您的应用程序在编译时禁用 "整个程序优化 "时才与VC14库向后兼容。如果你在Visual Studio 2017或2019下遇到Triton的链接器错误,请尝试禁用整个程序优化(在编译器/优化下),并将链接时代码生成设置为 "默认"(在链接器/优化下)。 另外,如果你有源代码许可证,你可以用你安装的VC141或142工具集重建Triton,这将允许使用整个程序优化。
尽管我们为各个编译器和运行时提供了特定的构建,但我们加入的一些第三方DLL却没有。如果你在使用多线程DLL以外的运行时遇到链接问题,可以尝试将MSVCRT添加到项目的 "链接器/输入 "属性页的 "忽略特定默认库 "字段中。
如果你的应用程序是用标准运行库的特殊标志建立的,如_SECURE_SCL或_HAS_ITERATOR_DEBUGGING = 0,你也可能遇到运行时的问题。如果你在编译或运行时链接有问题,请联系 https://www.dhorde.com/ 在线客服,电话 023-62585653,或邮箱 sales@dhorde.com。我们可以为你提供包括混淆源代码的SDK,允许你用任何你需要的开发环境和编译时标志构建Triton。
使用C#与Triton链接
在Samples/CSharpSample文件夹中,你会发现TritonDLL.dll。这是Triton的本地代码,被打包成一个DLL,可以从C#代码中调用。将这个DLL部署到你的C#应用程序的工作目录中。
在CSharpSample中,你会发现TritonClassLibrary项目。这是一个覆盖Triton的C++ API的C#封装,它将是你与Triton的接口。在你的解决方案中包括这个项目,并从你自己的应用程序的项目中引用它。
TritonXNA项目是一个示例,说明在一个C# XNA游戏框架4.0应用程序中使用Triton。请参考CSharpSample文件夹中的readme.txt文件,以了解更多关于它如何工作的细节,以及如何从你自己的C#项目中使用Triton。
TritonClassLibrary是由我们的C++ API自动生成的;你可以参考我们docs文件夹中的C++ API参考资料来了解C#类--它们的工作方式完全相同。
在Linux下与Triton链接
Triton for Linux的验证版本是以混淆的源代码形式发布的,你将在你自己的系统上构建它。授权用户收到的是未被混淆的源代码。
你将需要安装最新的图形驱动。值得注意的是,Ubuntu提供的开源ATI驱动,在本文写作时,已知不正确支持OpenCL/OpenGL互操作性,这将导致Triton在ATI卡上失败。如果发生这种情况,你需要卸载fglrx驱动并安装AMD网站上的最新驱动。
为Linux构建Triton需要先安装几个第三方开发包:
CMake: http://www.cmake.org/ FFTSS: http://www.ssisc.org/fftss/download.html clFFT (可选;需要在AMD和Intel的GPU上加速): https://github.com/clMathLibraries/clFFT NVidia的CUDA工具包(可选;需要在NVidia的GPU上加速): http://developer.nvidia.com/cuda-toolkit Intel的集成性能原件(可选;需要在Intel的CPU上加速): http://software.intel.com/en-us/articles/intel-ipp/#support
如果你使用的是NVidia显卡,安装CUDA工具包将带来巨大的性能提升。同样地,AMD/ATI的客户应该安装clFFT。
一旦先决条件安装完毕,以超级用户身份运行我们的安装脚本,在你的系统上构建Triton以及OpenGL示例应用程序。如果CMake给出的错误是缺少GLUT_Xi_LIBRARY或GLUT_Xmu_LIBRARY等变量,你可能需要先安装以下软件包:
sudo apt-get install libxmu-dev libxi-dev
如果你在你的系统上构建Triton时遇到问题,请不要犹豫,联系 https://www.dhorde.com/ 在线客服,电话 023-62585653,或邮箱 sales@dhorde.com。
使用Triton的头文件
在你的项目的 "C/C++"属性页的 "附加包含目录 "栏下,添加以下内容:
$(TRITON_PATH)/Public Headers
有了这个,你就可以简单地
#include "Triton.h"
来获得Triton的能力。
C#开发者只需在他们自己的项目中引用TritonClassLibrary项目,并将一个
using Triton;
在引用TritonClassLibrary中的类之前。
启动Triton
为了使用Triton,你需要在启动时创建三个主要对象。
首先,你需要一个Triton::ResourceLoader。这个类允许Triton访问其着色器、DLL和纹理资源,你将用它来告诉Triton这些资源的位置。SDK包括一个你可以重新发布的 "资源 "目录,你只需要在Triton::ResourceLoader的构造函数中提供一个绝对路径或相对路径,以确定你安装这个目录的位置。如果你对将Triton与你自己的资源管理器集成感兴趣,请参阅与你自己的资源管理器集成。
接下来,你需要创建并初始化一个Triton::Environment对象,使用你刚刚制作的Triton::ResourceLoader。Triton::Environment类让你指定影响Triton水的坐标系、渲染系统和环境条件。例如,要将Triton与一个基于DirectX11的模拟程序集成,在一个使用WGS84椭球体的地心坐标系中,Z轴指向两极,你将调用Triton::Environment::Initialize(),参数为Triton::WGS84_ZUP和Triton::DIRECTX_11,以及你创建的ResourceLoader。你会发现对平地坐标系和球面系统的支持,在Z轴或Y轴上有 "向上",以及对OpenGL 2.x、3.x、4.x、DirectX9和DirectX11的支持。一定要检查Triton::Environment::Initialize()的错误代码--最可能的问题是用于创建你的ResourceLoader的资源路径不太正确。
如果你已经购买了Triton的许可证,请调用Triton::Environment::SetLicenseCode()来取消对SDK的评估限制。
然后你需要在Triton的模拟中加入一些风,否则就不会有任何波浪。创建一个或多个Triton::WindFetch对象,并通过Triton::Environment::AddWindFetch()添加它们。一个风向标代表一个特定风速和风向的区域,它可以被定位到一个椭圆区域。如果一个地点有一个以上的风向标,它们将被加在一起。另外,你可以使用Triton::Environment::SimulateSeaState()方法来快速模拟蒲福尔尺度上的一个给定状态。
最后,你将使用你所创建的Triton::Environment来创建Triton::Ocean对象本身。在构建海洋时,有三种Triton::WaterModelTypes可以选择:TESSENDORF、JONSWAP和PIERSON-MOSKOWITZ。这三种类型都使用快速傅里叶变换来同时模拟成千上万的海浪。TESSENDORF使用的算法与故事片中使用的算法相同,而JONSWAP提供了一个更真实的波谱,更适合于海事培训应用。PIERSON-MOSKOWITZ与JONSWAP相似,但不能处理风的 "流长",或风走了多远的影响。通常情况下,我们建议从JONSWAP开始。
如果Triton::Ocean::Create返回一个空指针,请参见故障排除提示,以弄清发生了什么。
下面是一个完整的初始化Triton对象的例子。
// Create the Triton objects at startup, once we have a valid GL context in place
bool InitTriton()
{
// We use the default resource loader that just loads files from disk. You'll need
// to redistribute the resources folder if using this. You can also extend the
// ResourceLoader class to hook into your own resource manager if you wish.
resourceLoader = new Triton::ResourceLoader("..\\..\\resources\\");
// Create an environment for the water, with a flat-Earth coordinate system with Y
// pointing up and using an OpenGL 2.0 capable context.
environment = new Triton::Environment();
Triton::EnvironmentError err = environment->Initialize(Triton::FLAT_YUP,
Triton::OPENGL_2_0, resourceLoader);
if (err != Triton::SUCCEEDED) {
::MessageBoxA(NULL, "Failed to initialize Triton - is the resource path passed in to "
"the ResouceLoader constructor valid?", "Triton error", MB_OK | MB_ICONEXCLAMATION);
return false;
}
// Substitute your own license name and code, otherwise the app will terminate after
// 5 minutes. Visit www.sundog-soft.com to purchase a license if you're so inclined.
environment->SetLicenseCode("Your license name", "Your license code");
// Set up wind of 10 m/s blowing North
Triton::WindFetch wf;
wf.SetWind(10.0, 0.0);
environment->AddWindFetch(wf);
// Finally, create the Ocean object using the environment we've created.
// If NULL is returned, something's wrong - enable the enable-debug-messages option
// in resources/triton.config to get more details on the problem.
ocean = Triton::Ocean::Create(environment, Triton::TESSENDORF);
return (ocean != NULL);
}
本文为如何开始使用 Triton 中文教程第一篇,点击此处进入第二篇>>
渝公网安备50010702505508