@lijiang

Sculpting in time

Do one thing and do it well.
Every story has a beginning and an end.

Run renderman compatible render engine aqsis on armv6

在树莓派一代上运行Aqsis渲染引擎

2 分钟

reference

http://alvyray.com/Pixar/documents/Pixar_ImageComputer.pdf

https://ohiostate.pressbooks.pub/app/uploads/sites/45/2017/09/pixar-image-processor.pdf

Pixar Image Computer

启发我写这篇文章的原因是上个月也就是三月份我快速的看了一遍《The Renderman Companion A Program’s Guide To Realistic Computer Graphics》,书里面主要描述的是如何利用Renderman C API接口去实现3D图像的渲染,这本书是在1989年出版的,当时的Pixar已经开发了Renderman渲染接口标准,并且实现了目前电影工业广泛使用的PRMan(PhotoRealistic Renderman实现。其中有意思的是在1986年Pixar还开发了类似今天的Nvidia通用显卡的计算机图形学硬件系统—Pixar Image Computer

在没了解Pixar之前,我以为Nvidia是最早做显卡的,原来还有更早的Pixar Image Computer,它的使用方式类似现在Nvidia显卡,做为一个扩展卡与本地计算机进行通讯,本地CPU发送数据到Pixar Image Computer中进行计算,然后从Pixar Image Computer中取回计算好的数据。具体架构如下:

设计这样的架构优点就在于以下三点:

  1. 通用硬件设计的实现

  2. 并行执行图像处理操作

  3. 支持多个CHAPs系统

架构设计:

  • Pixel data structure: 所有的Pixar Image System组件都被设计成可以容纳"Pixel data structure"这样的数据结构,其中结构体当中包含RGBA(Red Green Blue Alpha)各个通道的存储信息。

  • Chap:Chap包含四个处理器,分别用来处理RGBA四个通道的数据,CHAP是一个单指令多数据处理的机器,四个核心处理器会分别在四个通道上执行相同的指令,每一个处理器分别处理对应通道的数据。

CHAP数据处理的循环过程:

ALU: 由AMD29116A芯片组成,所有的四个ALU在一个像素点的四个通道数据上执行相同的指令。

Multiplier: 数据由MBUS进入,通过乘法处理将结果输出到ABUS。

Pbus buffer: 像素数据在CHAP和image Memory之间的交换。

Yapbus buffer: 在CHAP与CHAP之间进行数据交换。

Scratchpad: 程序执行期间像素数据高速暂存存储器。

Write crossbar: ABUS的目的地,过滤控制哪些数据可以写入到Scratchpad。

Read crossbar: SBUS的源头,对读取到的数据进行分类。
  • Yapbus: CHAP与CHAP之间的数据交换。

  • Picture Memory: frame buffer,用于存储图像信息数据。

  • Video Board: 从Picture Memory读取数据发送Scan lines到Monitor。

  • Memory Controller: 协调数据的传输,当CHAP和Video Board发起内存请求时,根据先到先得的策略分配内存资源。

关于基础与高阶应用

说一个题外话,高科技领域最热门的话题就是人工智能和区块链两个领域,那么这两个领域在工业方面的落地项目,这个就需要开创者的努力了,大部分在工业领域的项目都是非常底层的,比如工厂内部产品的质量检测,零件的损坏情况,将人工智能应用到边缘领域是一个深度交叉学科,设计深度神经网络的开发者需要去理解零件的底层架构,需要去理解产品的具体质量属性,这些都不是光靠一个人工智能的口号可以解决的,同样区块链也不是说开发一条链就能叫区块链应用,要想实际与工业体系结合我们需要撤掉有炒作嫌疑的概念,具体的去研究一个事物,它的底层,它的核心,它与其他事物之间的相互关系,这样我们所谓的人工智能才能落地,就像DeepMind开发的AlphaGo和AlphaFold,他们就是一个工业产品用于解决工业领域的问题。

经过这番思考之后,我们就可以理解,古老的技术其实并没有过时,在追求新技术的时候也许我们遗忘了这项技术背后的基础是什么,在追求高性能的计算设备时,我们实际的运行是否能让这台机器的高性能完全发挥出来,在我们无法解答基础是什么,性能是否已经发挥到极致,那么就请放下所谓的潮流技术,开始去探索基础科学,这样当基础打扎实的时候,我们就有能力来回答上面的问题,做一个很确切的例子,国内有很多项目做人工智能研发的但是却没有MATLAB和Mathematica,因为前者是一个粗略的框架原型可以理解为空中楼阁,后两者是在各个工业领域的探索下发展起来的可以理解为拔地而起的高楼大厦。

Aqsis on armv6

经过前面对Pixar Image System的介绍,我好奇的是Pixar刚起步的时候他们能做出全世界最好的图像系统以及电影动画,那么在一台只有512M内存的Raspberry Pi 1B上能否安装Renderman实现的Aqsis渲染引擎呢?毕竟Pixar Image System最大内存也就192M。同时我可以使用Aqsis来完成The Renderman Companion这本书中的C语言实现。

我用的硬件是Raspberry Pi 1B armv6,下载官方的Raspberry Pi os 32bit系统Raspbian GNU/Linux 11 (bullseye)。

Qt4 Version

git clone git://aqsis.git.sourceforge.net/gitroot/aqsis/aqsis aqsis
git submodule update --init

Patch:

diff --git a/include/aqsis/core/ioptions.h b/include/aqsis/core/ioptions.h
index 44946092..944a335a 100644
--- a/include/aqsis/core/ioptions.h
+++ b/include/aqsis/core/ioptions.h
@@ -34,7 +34,7 @@
 #include <aqsis/riutil/primvartype.h>
 #include <aqsis/ri/ritypes.h>
 #include <aqsis/math/vecfwd.h>
-
+#include <boost/shared_ptr.hpp>
 namespace Aqsis {

 class CqImagersource;
diff --git a/libs/core/texturing_old/shadowmap_old.cpp b/libs/core/texturing_old/shadowmap_old.cpp
index 1a22491c..11a2febf 100644
--- a/libs/core/texturing_old/shadowmap_old.cpp
+++ b/libs/core/texturing_old/shadowmap_old.cpp
@@ -176,7 +176,7 @@ void CqShadowMapOld::LoadZFile()
 	{
 		std::ifstream file( m_strName.c_str(), std::ios::in | std::ios::binary );

-		if ( file != NULL )
+		if ( file )
 		{
 			// Save a file type and version marker
 			TqPchar origHeader = tokenCast(ZFILE_HEADER);
diff --git a/tools/displays/piqsl/piqsldisplay.cpp b/tools/displays/piqsl/piqsldisplay.cpp
index a4073902..3ae07741 100644
--- a/tools/displays/piqsl/piqsldisplay.cpp
+++ b/tools/displays/piqsl/piqsldisplay.cpp
@@ -37,7 +37,8 @@
 #include <boost/archive/iterators/transform_width.hpp>
 #include <boost/archive/iterators/insert_linebreaks.hpp>
 #include <boost/shared_ptr.hpp>
-
+#define BOOST_PFTO_WRAPPER(T) T
+#define BOOST_MAKE_PFTO_WRAPPER(t) t
 #ifdef AQSIS_SYSTEM_WIN32
 	#include <winsock2.h>
 	typedef	u_long in_addr_t;

Aqsis依赖安装以及编译: (由于apt源没有qt4支持,所以这里只安装qt5,无法启用piqsl),安装依赖可以在INSTALL中找到。

apt-get install build-essential make cmake wget zip unzip
apt install libboost-all-dev
apt install libtiff-dev libtiffxx5
apt install bison flex qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator qtdeclarative5-dev zlib1g-dev libjpeg-devel libpng++-dev libpng-dev libilmbase-dev
apt install openexr openexr-viewers openimageio-tools libopenexr-dev

mkdir build && cd build && cmake ../ && make

当然你也可以直接下载我编译好的版本,只有在Armv6 HardFloat平台上才能运行。

aqsis-cmd-1.9.0.tar.gz binary download

Qt5 Version

git clone https://github.com/aqsis/aqsis.git
git submodule update --init

Patch:

diff --git a/tools/ptview/ptview.cpp b/tools/ptview/ptview.cpp
index 4d5c73e..41065b6 100644
--- a/tools/ptview/ptview.cpp
+++ b/tools/ptview/ptview.cpp
@@ -43,7 +43,7 @@
 #define NOMINMAX
 #include <OpenEXR/ImathVec.h>
 #include <OpenEXR/ImathMatrix.h>
-
+#include <GL/gl.h>
 #include "ptview.h"
 #include <MicroBuf.h>
 #include <RadiosityIntegrator.h>

依赖安装以及编译: 与Qt4版本依赖一致

当然你也可以直接下载我编译好的版本,只有在Armv6 HardFloat平台上才能运行。

aqsis-qt5-1.8.3.tar.gz binary download

渲染测试

最新文章

分类

关于

Keep thinking, Stay curious
Always be sensitive to new things