月別アーカイブ: 2014年4月

Intel HD Graphics 4000 GPU と OpenGL

Intel HD 4000 は環境によって使用できる OpenGL Version に差があります。

Intel HD 4000       OpenGL      ES2   ES3   Driver
-----------------------------------------------------------
Windows 8.1 x64     OpenGL 4.0   Y     N    (10.18.10.3496)
Mac OS X 10.9       OpenGL 4.1   Y     N
Ubuntu 14.04 x64    OpenGL 3.3   Y     Y

詳細は下記ページに追加しました。

Desktop GPU Extensions

Linux では OpenGL 3.3 止まりで Tessellator が使用できません。
その代わり Linux だけ GL_ARB_ES3_compatibility に対応しており OpenGL ES 3.0 命令が通ります。
libgles2-mesa-dev でも OpenGL ES 3.0 の DRI に対応していました。

EGL_CLIENT_APIS: OpenGL OpenGL_ES OpenGL_ES2 OpenGL_ES3 
GL_VERSION: OpenGL ES 3.0 Mesa 10.1.0
GL_RENDERER: Mesa DRI Intel(R) Ivybridge Mobile 
GL_VENDOR: Intel Open Source Technology Center
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.0

Desktop 向け OpenGL ES 2.0 / OpenGL ES 3.0 / OpenGL ES 3.1 実行環境

Windows 版ドライバも細かくアップデートされており、
10.18.10.3496 では GL_FRAMEHBUFFER_SRGB が有効になっていました。
以前は問題があった部分です。

GeForce/RADEON と比べると環境によって機能差が大きかったり、
いろいろ問題も多かったのですが、少しずつ改良が進んでいることがわかります。

関連エントリ
Mac OS X 10.9 Mavericks の OpenGL 4.1 対応と Windows 8.1 Intel HD 4000 Driver
OpenGL と sRGB
OpenGL の各バージョンと GLSL の互換性

Maya 2015 ShaderFX のノード情報を読みだしてみる

ShaderFX は Plugin で実現されており、shaderfx コマンドを介して情報にアクセスできます。
内部の Node 構造は予想以上に複雑で、初期状態のデフォルトでも 1244個。
普段は Group 化されているため表に出てきませんが、
Group をすべて展開していくとこれだけの数になるようです。

以下、すべて読みだしてみるスクリプト。

// mel
global proc a7ListShaderFx()
{
    string  $node_name= "ShaderfxShader1"; // 展開する Node 名


    int $count= `shaderfx -sfxnode $node_name -getNodeCount`;
    int $root= `shaderfx -sfxnode $node_name -getHwShaderNodeRootGrpID`;
    int $hwnode= `shaderfx -sfxnode $node_name -getHwShaderNodeID`;
    print ( "count=" + $count + "\n" );
    print ( "root=" + $root + "\n" );
    print ( "hwnode=" + $hwnode + "\n" );

    string  $indent= "";
    int $ni;
    for( $ni= 0 ; $ni< $count ; $ni++ ){
        int $uid= `shaderfx -sfxnode $node_name -getNodeUIDFromIndex $ni`;
        string  $class_name= `shaderfx -sfxnode $node_name -getNodeClassName $uid`;
        string  $name= `shaderfx -sfxnode $node_name -getPropertyValue $uid "name"`;
        string  $flag= "";
        if( `shaderfx -sfxnode $node_name -isGroupStart $uid` ){
            int $gend_uid= `shaderfx -sfxnode $node_name -getGroupEndUID $uid`;
            $flag+= "* Group START from " + $uid + " to " + $gend_uid;
            print "group start {\n";
            $indent= "  ";
        }
        if( `shaderfx -sfxnode $node_name -isGroupEnd $uid` ){
            $flag+= "* Group END";
        }
        if( `shaderfx -sfxnode $node_name -isGroupFromDisk $uid` ){
            int $value= `shaderfx -sfxnode $node_name -isGroupFromDisk $uid`;
            $flag+= "* Group FROM DISK (" + $value + ")";
        }
        print ( $indent + $uid + ": <" + $class_name + "> " + $name + " " + $flag +  "\n" );

        // Properties
        string  $prop_list[]= `shaderfx -sfxnode $node_name -listProperties $uid`;
        for( $prop_name in $prop_list ){
            string  $prop_type= `shaderfx -sfxnode $node_name -getPropertyType $uid $prop_name`;
            switch( $prop_type ){
            case "float4":
                print ( $indent + "  " + $prop_name + " <" + $prop_type + ">=   skip...\n" );
                break;
            case "stringlist": {
                    string  $prop_value[]= `shaderfx -sfxnode $node_name -getPropertyValue $uid $prop_name`;
                    print ( $indent + "  " + $prop_name + " <" + $prop_type + ">=\n" );
                    for( $si in $prop_value ){
                        print ( $indent + "     [" + $si + "]\n" );
                    }
                }
                break;
            default: {
                    string  $prop_value= `shaderfx -sfxnode $node_name -getPropertyValue $uid $prop_name`;
                    print ( $indent + "  " + $prop_name + " <" + $prop_type + ">= [" + $prop_value + "]\n" );
                }
                break;
            }
        }

        // Sockets
        int $socket_type;
        for( $socket_type= 0 ; $socket_type < 2 ; $socket_type++ ){
            int $socket_count= `shaderfx -sfxnode $node_name -getSocketCount $uid $socket_type`;
            int $si;
            if( $socket_count != 0 ){
                switch( $socket_type ){
                case 0: print ( $indent + "  ** input socket\n" ); break;
                case 1: print ( $indent + "  ** output socket\n" ); break;
                }
            }
            for( $si= 0 ; $si < $socket_count ; $si++ ){
                string $socket_name= `shaderfx -sfxnode $node_name -getSocketName $uid $socket_type $si`;
                string $socket_stype= `shaderfx -sfxnode $node_name -getSocketType $uid $socket_type $si`;
                int $connected_count= `shaderfx -sfxnode $node_name -getConnectedSocketCount $uid $socket_type $si`;
                print ( $indent + "    socket("+ $si + "): " + $socket_name + " <" + $socket_stype + "> c:" + $connected_count + "\n" );
                int $ci;
                for( $ci= 0 ; $ci < $connected_count ; $ci++ ){
                    string $connected_node= `shaderfx -sfxnode $node_name -getConnectedNodeID $uid $socket_type $si $ci false`;
                    string $connected_id= `shaderfx -sfxnode $node_name -getConnectedSocketIndex $uid $socket_type $si $ci false`;
                    print ( $indent + "      connected: uid=" + $connected_node + "  socket(" + $connected_id + ")\n" );
                }
            }
        }

        if( `shaderfx -sfxnode $node_name -isGroupEnd $uid` ){
            $indent= "";
            print "}\n";
        }
    }
}

HLSL/GLSL 等のシェーダー命令を 1つ 1つ Node 化しているようなイメージです。

関連エントリ
Maya 2014 の Output Window と stderr
Maya ShaderFX

iOS7 対応 SteelSeries Stratus ワイヤレスゲームコントローラー

iOS7 対応のゲームコントローラを購入してみました。
SteelSeries Stratus ワイヤレスゲームコントローラーです。
小型ですがボタン配列は標準的なもの。

stratus01.png

↑大きさ比較 (下が Stratus)

steelseries STRATUS

アナログスティックと L2/R2 が付いたタイプで、
GameController Framework からは ExtendedGamepad として認識されます。

接続は Bluetooth によるワイヤレスです。
指で画面が見えなくなってしまうこともなく、小さいながらも快適に操作できます。

左右2本のスティック (Thumbstick) はもちろんアナログ値ですが、
他のボタンも感圧式になっており、押した強さを受け取ることが可能です。
これはちょうど PS2 の DUALSHOCK2 や PS3 の SIXAXIS/DUALSHOCK3 のボタンと
同じ仕様になります。

十字キー (Directional Pad) や A/B/X/Y などの各ボタン、L1/L2/R1/R2 は
デジタルな ON/OFF と同時に API からは 0〜1.0 の値も得られます。

中央にある丸いボタンは Pause で、押した時のトリガのみ検出できます。
その上の 4 つの LED はプレイヤーの識別に用いられます。
つまり 4個のコントローラを接続したマルチプレイも考慮されているということ。

プレイヤー番号はコントローラ認識時にアプリケーションが割り当てる必要があります。
ゲームによっては認識したのに 4 つの LED が点滅したままになっている場合がありますが、
おそらくアプリが GCController の playerIndex を設定していないことが原因と思われます。

PC や Android では接続するコントローラによってボタンやスティックのマッピングが
異なっており、個別に対応したりカスタマイズ機能を設ける等の対策が必要でした。
iOS7 では仕様が決められているため、ボタン配列がずれることもなく読み出し方も一定で、非常に扱いやすくなっています。

なお Android 3.1 以降は Xbox360 USB Controller と PS3 (SIXAXIS/DUALSHOCK3)
Controller の有線 (USB) 接続に対応しています。
この両者を使う限りは、ボタンマッピングの食い違いもあまり考慮しなくて
済むようになっています。

Stratus は PC/Android でも HID としてペアリングは出来ますが、
ゲームコントローラとしては利用できませんでした。

関連エントリ
Linux で Gamepad の値を読み込む & デバイスの判定
Android 3.1 と GamePad のイベントの詳細 (2)
Android 3.1 と GamePad のイベントコード

Amazon Fire TV の性能

Amazon Fire TV は Qualcomm Snapdragon 600 APQ8064 搭載。
Kindle Fire HDX の Snapdragon 800 には及ばないものの、
Nexus 7 2013 の Adreno 320 より 1.5 倍高速です。

Amazon Fire TV

Console     SoC            CPU      clock core GPU        GPU性能比予想
-----------------------------------------------------------------------
OUYA        Tegra3 T33     Cortex-A9 1.7GHz 4  ULP GeForce(12)    1
Fire TV     S600 APQ8064T  Krait 300 1.7GHz 4  Adreno 320         6倍
Vita TV                    Cortex-A9   ?GHz 4  PVR SGX543MP4+     ?

Nexus7 2012 Tegra3 T30L    Cortex-A9 1.2GHz 4  ULP GeForce(12)    1 
Nexus7 2013 S4 APQ8064     Krait     1.5GHz 4  Adreno 320         4倍 
Kindle HDX7 S800 MSM8974   Krait 400 2.2GHz 4  Adreno 330         8倍 

より詳細な比較表は下記にまとめました。

Game Console スペック

Google によると Nexus 7 (2012) Tegra3 と Nexus 7 (2013) は CPU で 1.8倍、GPU で 4倍差があるとのこと。(Impress 新型 Nexus 7)
また旧 S4 Pro の Adreno 320 と Snapdragon 800 Adreno 330 は演算能力で2倍の差となっています。(Qualcomm Snapdragon blog)
Snapdragon 600 の Adreno 320 はちょうどこの中間の性能。
さらに Snapdragon 600 Adreno 320 は Adreno 305 の 3倍以上の性能。(Snapdragon 600)

                  GPU         比率  ALU  ALU比
----------------------------------------------
Snapdragon 400    Adreno 305   2    6     1.5
Snapdragon S4 Pro Adreno 320   4    16     4
Snapdragon 600    Adreno 320   6    24     6
Snapdragon 800    Adreno 330   8    32     8

Amazon の新しい世代のデバイスは Snapdragon Adreno 3×0 で統一されています。
FireTV, Kindle HDX 向けアプリは Adreno 3×0 向けに最適化していくことになるでしょう。
ただし Fire OS は Android 4.2 (API Level 17) なので OpenGL ES 3.0 未対応。

Qualcomm New Amazon Fire TV powered by Snapdragon 600 processor

関連ページ
Game Console スペック一覧
Mobile GPU bench mark
CPU FLOPS