下一代图像接口-Vulkan教程

Vulkan发布有段时间,经过搜索,暂未发现有用的引导性文章,C++ 版demo教程、例子,我也找了很长的一段时间包括官方的教程,可惜官方的教程有短板。

系统要求

建议winX64 vs2015,作者自述支持Linux android,编译器必须支持c++11,笔者只在win系统做过试验,建议更新最新的显卡驱动。近两年的显卡支持上没问题。

源代码下载

github的下载地址,建议用git 检出,以后方便升级

https://github.com/SaschaWillems/Vulkan/archive/master.zip

游戏引擎支持

unity3d 、Unreal Engine 4、OGRE(图形引擎计划),Urho3D(以后支持)

编译

打开vulkanExamples.sln,设置项目triangle为启动项,按F5,经典三角形渲染

源代码简单解析

分辨率设置

    VulkanExample() : VulkanExampleBase(ENABLE_VALIDATION)
    {
        width = 1280;
        height = 720;
        zoom = -2.5f;
        title = "Vulkan Example - Basic indexed triangle";
        // Values not set here are initialized in the base class constructor
    }

矩阵变换,和GL一样,用了GLM的数学库, MVP(模型矩阵 视图矩阵 投影矩阵)

	void updateUniformBuffers()
	{
		// Update matrices
		uboVS.projectionMatrix = glm::perspective(glm::radians(60.0f), (float)width / (float)height, 0.1f, 256.0f);

		uboVS.viewMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, zoom));

		uboVS.modelMatrix = glm::mat4();
		uboVS.modelMatrix = glm::rotate(uboVS.modelMatrix, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f));
		uboVS.modelMatrix = glm::rotate(uboVS.modelMatrix, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f));
		uboVS.modelMatrix = glm::rotate(uboVS.modelMatrix, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f));

		// Map uniform buffer and update it
		uint8_t *pData;
		VK_CHECK_RESULT(vkMapMemory(device, uniformDataVS.memory, 0, sizeof(uboVS), 0, (void **)&pData));
		memcpy(pData, &uboVS, sizeof(uboVS));
		vkUnmapMemory(device, uniformDataVS.memory);
	}

渲染

	virtual void render()
	{
		if (!prepared)
			return;
		draw();
	}

triangle

Urho3D游戏引擎搭建

Urho3D是一个轻量级、跨平台的2D和3D渲染的c++实现开源游戏引擎,在MIT许可协议下发布。利用OpenGL渲染或是3D9(Shader Model 2和OpenGL 2),是受到OGRE 和horde3d极大的鼓舞而延生。本文只是描述Urho3D在win32和android搭建。

适用版本

Urho3D1.4 Urho3D1.5 Urho3D1.6 Urho3d1.7

构建的系统说明

操作系统,cmake.org下载最新版

  • Windows系统,下载安装DirectX SDK ,也可不装,cmake配置时去掉dx ,勾选OpenGL,。
  • Linux系统,安装libx11-dev,libxrandr-dev,
  • 树莓派系统
  • Mac OS X系统,Xcode开发工具包
  • Android系统,安装Android SDK和NDK的Android(API最低12),至于无法下载请百度。
  • Emscripten系统

构建

推荐使用方法二

方法一:使用脚本构建

win用bat
linux用sh
基本的使用命令是:

<script-name> /path/to/build-tree [build-options]

方法二:使用cmake构建

Urho3D使用CMake(http://www.cmake.org)来搭建。该过程有两个步骤:

  • 你可以用界面或者脚本生成解决方案。执行命令cmake_vs2013.bat build_vs2013 -DURHO3D_OPENGL=1。
    • Windows:cmake_vs20xx.bat,cmake_mingw.bat,cmake_codeblock.bat,cmake_ninja.bat,或cmake_generic.bat
    • Mac OS X的:cmake_macosx.sh,cmake_codeblocks.sh,cmake_ninja.sh,或cmake_generic.sh
    • Linux:cmake_eclipse.sh,cmake_codeblocks.sh,cmake_ninja.sh,或cmake_generic.sh
    • 树莓派:cmake_rpi.sh,cmake_eclipse.sh,cmake_codeblocks.sh,cmake_ninja.sh,或cmake_generic.sh
  • 利用的CMake的生成的项目文件或解决方案文件。
    • Visual Studio:打开Urho3D.sln
    • Xcode:打开Urho3D.xcodeproj
    • CodeBlocks:打开Urho3D.cbp
    • Eclipse:使用文件|导入 导入项目“存在项目到工作区”

安卓版本编译

笔者环境:win7 x64 win10 x64
1、新建环境变量:ANDROID_NDK D:/Android/android-ndk-r9d
2、添加到Path变量(需要自己去下载android-ndk android-sdk apache-ant):D:\Android\android-ndk-r9d\prebuilt\windows-x86_64\bin;D:\Android\android-sdk\tools;D:Android\apache-ant-1.9.4\bin
3、到Urho3D-1.5 执行 cmake_android.bat build_android -DURHO3D_LUA=0
Urho3d-1.7 执行cmake_android.bat build_android -DURHO3D_LUA=0   -DURHO3D_PCH=0
//1.7的错误提示 Source/Urho3D/Container/Str.cpp:1081:14: error: non-const lvalue reference to type ‘__builtin_va_list’ cannot bind to a value of unrelated type ‘va_list’ (aka ‘__builtin_va_list’
4、进入到build_android目录依次执行

android list target //查询 <target-id> 数字对应的版本
android update project -p . -t <target-id>
make -j <num_jobs>
ant debug

5、target-id是android list target可以查询,num_jobs 是参与并行make数量。
建议参考这里的https://github.com/299299/Urho3D已经提供了ANDROID_NDK下载。备注如果无法make –j 4
出错:
make interrupt/exception caught (code = 0xc00000fd , addr = 0000000000420386,
sdl redefinition of ‘struct mallinfo’
检查是否有D:/Program Files (x86)/Git/bin从系统环境变量Path移除。或者放到NDK后面!

HelloWorld截图

Urho3DHelloWorld.jpg

下载及参考链接

https://github.com/urho3d/Urho3D/releases
http://urho3d.github.io/documentation/1.4/_building.html