月別アーカイブ: 2012年8月

サンコー Androidスティック with DUALCORE の GPU

サンコーの Android スティック ANDHDM2S を触る機会がありました。

Androidスティック with DUALCORE

とりあえず dual core であることを確認。
CPU は NEON 使用可能で GPU は PowerVR SGX530 でした。

-------------------
CPU
-------------------
Processor	: ARMv7 Processor rev 2 (v7l)
processor	: 0
BogoMIPS	: 1061.68

processor	: 1
BogoMIPS	: 1064.96

Features	: swp half thumb fastmult vfp edsp neon vfpv3 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x1
CPU part	: 0xc09
CPU revision	: 2

Hardware	: EMXX
Revision	: 0420
Serial		: 0000000000000000


-------------------
GPU
-------------------
GL_VERSION: OpenGL ES 2.0
GL_RENDERER: PowerVR SGX 530
GL_VENDOR: Imagination Technologies
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00

pconst=64 vconst=128 vin=16 vout=8 ptex=8 vtex=8 combotex=8 maxrender=2048 maxtexsize=2048 cubetexsize=2048 viewdims=2048

Extension:
GL_OES_rgb8_rgba8
GL_OES_depth24
GL_OES_vertex_half_float
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_element_index_uint
GL_OES_mapbuffer
GL_OES_fragment_precision_high
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_EGL_image
GL_OES_required_internalformat
GL_OES_depth_texture
GL_OES_get_program_binary
GL_OES_packed_depth_stencil
GL_OES_standard_derivatives
GL_OES_vertex_array_object
GL_OES_egl_sync
GL_EXT_multi_draw_arrays
GL_EXT_texture_format_BGRA8888
GL_EXT_discard_framebuffer
GL_EXT_shader_texture_lod
GL_IMG_shader_binary
GL_IMG_texture_compression_pvrtc
GL_IMG_texture_stream2
GL_IMG_texture_npot
GL_IMG_texture_format_BGRA8888
GL_IMG_read_format
GL_IMG_program_binary
GL_IMG_multisampled_render_to_texture

adb の usb ドライバは android_winusb.inf の書き換えだけで
つながりました。

%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_0002
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_0002&MI_01

関連ページ
日本で発売された端末全リスト

OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較

新しい ASTC 形式で圧縮したテクスチャ画像を比べてみました。
「ETC2 の比較」 と同じ画像をエンコードして一部を切り出し 4倍に拡大しています。

↓ASTC 4×4 (8.0 bpp)
astc_4x4_ex_z0.png astc_4x4_ex_z1.png

↓ASTC 5×4 (6.5 bpp)
astc_5x4_ex_z0.png astc_5x4_ex_z1.png

↓ASTC 5×5 (5.3 bpp)
astc_5x5_ex_z0.png astc_5x5_ex_z1.png

↓ASTC 6×5 (4.4 bpp)
astc_6x5_ex_z0.png astc_6x5_ex_z1.png

↓ASTC 6×6 (3.6 bpp)
astc_6x6_ex_z0.png astc_6x6_ex_z1.png

↓ASTC 8×5 (3.3 bpp)
astc_8x5_ex_z0.png astc_8x5_ex_z1.png

↓ASTC 8×6 (2.7 bpp)
astc_8x6_ex_z0.png astc_8x6_ex_z1.png

↓ASTC 10×5 (2.6 bpp)
astc_10x5_ex_z0.png astc_10x5_ex_z1.png

↓ASTC 10×6 (2.2 bpp)
astc_10x6_ex_z0.png astc_10x6_ex_z1.png

↓ASTC 8×8 (2.0 bpp)
astc_8x8_ex_z0.png astc_8x8_ex_z1.png

↓ASTC 10×8 (1.6 bpp)
astc_10x8_ex_z0.png astc_10x8_ex_z1.png

↓ASTC 10×10 (1.3 bpp)
astc_10x10_ex_z0.png astc_10x10_ex_z1.png

↓ASTC 12×10 (1.1 bpp)
astc_12x10_ex_z0.png astc_12x10_ex_z1.png

↓ASTC 12×12 (0.9 bpp)
astc_12x12_ex_z0.png astc_12x12_ex_z1.png

ASTC 4×4 は画質がよく見えるかもしれませんが当然です。
8bpp なので DXT1/ETC1/ETC2 の半分の圧縮率です。
データサイズも 2倍になっています。

圧縮率を高めると徐々にブロックが目立ちますが、
それなりに階調は保っていることがわかります。
特に右の画像は 12×12 の 0.9bpp でも劣化が目立ちません。

下記の表を見て分かる通り、12×12 の場合わずか 7.6KB しか
ありません。

format       size     (byte)    bpp
--------------------------------------
ASTC 4x4     64.0KB   (65536)   8.0bpp
ASTC 5x4     52.0KB   (53248)   6.5bpp
ASTC 5x5     42.2KB   (43264)   5.3bpp
ASTC 6x5     34.9KB   (35776)   4.4bpp
ASTC 6x6     28.9KB   (29584)   3.6bpp
ASTC 8x5     26.0KB   (26624)   3.3bpp
ASTC 8x6     21.5KB   (22016)   2.7bpp
ASTC 10x5    21.1KB   (21632)   2.6bpp
ASTC 10x6    17.4KB   (17888)   2.2bpp
ASTC 8x8     16.0KB   (16384)   2.0bpp
ASTC 10x8    13.0KB   (13312)   1.6bpp
ASTC 10x10   10.5KB   (10816)   1.3bpp
ASTC 12x10    9.0KB   ( 9152)   1.1bpp
ASTC 12x12    7.6KB   ( 7744)   0.9bpp

ETC1/2 RGB   32.0KB   (32768)   4.0bpp
元画像      192.0KB  (196608)  24.0bpp  (256x256)

使用したコマンド

astcenc src dest 4x4 -exhaustive

関連エントリ
OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
OpenGL ES 3.0 / OpenGL 4.3 ETC2 テクスチャ圧縮の比較

OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC

DXTC(S3TC)/PVRTC/ETC1/ETC2 など、4×4 block を 64bit 単位で
変換する圧縮テクスチャフォーマットが第一世代なら、
128bit 単位で処理する BC6H/BC7 (BPTC) は第二世代の新しい
圧縮テクスチャフォーマットと言えます。

64bit の枠を超えた余剰 bit を、モード分岐やパーティション分割等
画質を向上させるための様々な情報として用います。

ASTC も同様で、BC6H/BC7(BPTC) と同じように 128bit 単位で圧縮を
行います。その仕組はさらに複雑でより踏み込んだ内容でした。

 ・128bit 単位
 ・複雑なモード分岐
 ・Dual Plane 機能 (Index を 2セット持つ)
 ・Partition 分割 (カラーセット Endpoint を複数持つ)

これらの特徴は BC6H/BC7(BPTC) と共通のものです。
ASTC にはさらに独自の仕様が多数含まれています。

 ・可変 Block サイズ (4×4 ~ 12×12)
 ・最大 4分割 の Partition (BPTC は 3分割まで)
 ・2,3,5 の 3種類の基数選択
 ・1~4 component の自由なフォーマット (R,RG,RGB,RGBA)

Khronos の仕様では LDR モードのみ定義されていますが、
ARM のドキュメントでは 3D texture や HDR まで言及されており
より幅広い用途が想定されていたことがわかります。

KHR_texture_compression_astc_ldr
ARM Mali developer Center: ASTC Evaluation Codec

bit field は非常に自由で、モードと Endpoint (代表カラー値) が
下位 bit から、Index (Texel Weight) が上位 bit から必要個数並ぶという
可変フォーマットです。
そのため組み合わせ数は膨大で単純なモード数では表現できません。

また 2進数からくる制約が少ないのも大きな特徴の一つです。
例えば block サイズも 5×5 , 6×6 , 10×8 など中途半端なサイズを
選ぶことができます。
Index によるカラーの補間も、DXT 等では 2bit なので 4段階ですが、
ASTC では 3値や 5値等の任意の段階を選ぶことができます。

DXT では 2色の代表カラーを選んでも、4階調だとちょうど中間の値を
生成することができません。画像によっては都合が悪く、敢えて
DXT1 の 3色モード (Alpha 1bit) を用いることがありました。

ASTC は 3 と 5 の基数を用いることができます。
5つの 3階調値を 8bit (3^5 = 243) に格納し、同様に 3つの 5階調値を
7bit (5^3 = 125) に収めます。
これに任意ビット数のスケール値を掛けることで、2 の n 乗に制限されず
下記の値の範囲を格納することができます。

 3 (0-2) =  3  + 0bit
 4 (0-3) =       2bit
 5 (0-4) =  5  + 0bit
 6 (0-5) =  3  + 1bit = 3 * 2
 8 (0-7) =       3bit
10 (0-9) =  5  + 1bit = 5 * 2
12 (0-11)=  3  + 2bit = 3 * 4
 :

例えば 12 (0~11) 段階をエンコードするなら 5個単位で格納します。
それぞれが 2bit のスケールを持つので、8bit + 5*2bit = 18bit (5個分)
となります。

このようにより自由なエンコードアルゴリズムを用いつつ、かつハードウエアで
実装しやすいようさまざまな工夫が施されています。

関連エントリ
OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (2)
Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (1)
OpenGL の圧縮テクスチャ (3) BPTC, BC6H/BC7
OpenGL の圧縮テクスチャ (2) 法線圧縮
Android OpenGL ES 2.0 の圧縮テクスチャ

OpenGL ES 3.0 / OpenGL 4.3 ETC2 テクスチャ圧縮の比較

比べてみました。

↓元 (4倍に拡大したものです)
orig_enc0z.png orig_enc1z.png

↓DXT1 (S3TC)
dxt1b_enc0z.png dxt1b_enc1z.png

↓ETC1 (RGB8)
etc1_enc0z.png etc1_enc1z.png

↓ETC2 (RGB8)
etc2_enc0z.png etc2_enc1z.png

結果はエンコーダーの能力にも依存します。
おそらくもっと良い圧縮ツールもあると思います。
特に DXT (S3TC) はツールが豊富なので、上の例よりも良い結果に
なるかもしれません。

ETC1 しか使えない Mali-400 等の GPU では、今までテクスチャの
圧縮方法が限られていました。

・RGB8 のみで Alpha がない
・4×2 単位で 1色しか選択できない

ひとつは Alpha が使えないなど機能的な問題ですが、もうひとつは
画質の問題です。上の例のように 4×2 の大きなブロックが生じ、
DXT1 よりも著しく劣化するケースがありました。

結果を見ても、ETC2 ではこの問題が解消されていることがわかります。

・Alpha や 1-2 component などバリエーションが豊富
・DXT のように 4×4 単位で 2色使える mode が追加された
・GPU 間で共通のフォーマットとして使える (ようになるはず、将来は)

(注意: 手元に手頃なサンプル画像がなかっただけで、決して法線圧縮に
利用しているわけではありません。)

関連エントリ
OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)

OpenGL 4.3 / OpenGL ES 3.0 ETC2 のエンコード

ARM Mali Developer Center で ETC2 に対応した Texture Compression Tool
が公開されています。

Mali GPU Texture Compression Tool v4.0

ところが自分の環境 (Windows 7 x64) では画像変換時にエラーとなり
今まで正しく動いていませんでした。

GUI を使わずにコマンドラインで変換すれば動作することがわかりました。
Program Files の install フォルダ↓にパスを通しておきます。

「 ARM\Mali Developer Tools\Mali Texture Compression Tool v4.0.0\bin 」

etcpack.exe を直接実行します。

etcpack  INPUTFILE.tga  outputdir  -ktx -c etc2 -s slow

これで outputdir に ktx 形式でファイルが作られます。
ktx から ppm への逆変換もできます。

ktx 形式は OpenGL 版の dds のようなものです。
OpenGL の GLenum をそのまま用いるため、どんなフォーマットも格納できます。
詳しくは下記エントリ参照。

Android OpenGL ES 2.0 の圧縮テクスチャ

環境を整えたら実際の変換結果なども比べてみたいと思います。

関連エントリ
OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
Android OpenGL ES 2.0 の圧縮テクスチャ