OpenGL ES 3.2 が登場しました。OpenGL ES 3.1 AEP (Android Extension Pack) の機能が取り込まれています。これまで ES にはなかった GeometryShader や Tessellator などに対応しており、機能面では OpenGL 4.x/Direct3D 11 と完全に並ぶことになります。
おそらく AEP 対応 GPU がそのまま OpenGL ES 3.2 になるのではないかと思われます。
現在発売されている端末で AEP (GL_ANDROID_extension_pack_es31a) が含まれている GPU は下記の通り。
Intel HD Graphics Gen8 も対応しているので、Cherry Trail 搭載 Android 端末が出ればこの一覧に入ることになるでしょう。
シェーダーのバージョンも 3.2 (320 es) です。Version 番号の空きを使い尽くしたので、もし次があるなら番号が飛ぶことになるかもしれません。(GLSL Version 一覧)
NVIDIA の Beta Driver がすでに使えるようになっているので試してみました。
GL_ARB_ES3_2_compatibility で実際に Context を作ることができます。
↓詳細はこちら
・Desktop GPU Extensions
OpenGL ES 3.2 は ASTC 対応ですが、やはり OpenGL 4.5 context のまま Texture を読むとパフォーマンスの警告が出るようです。
また OpenGL 4.5 の方にはかなり気になる Extension が増えています。スレッドを使ったシェーダーのコンパイルが可能になるとのこと。
なお Android もついに低レベル API である Vulkan 対応を発表しています。予想されてきたことではありますが、低レベル API はプラットフォームごとに完全に分かれることになりました。
パフォーマンスだけでなく Mobile / Desktop API の統合や、レガシーな OpenGL API からの脱却などさまざまなメリットもありますが、開発者にとっては悩ましいところです。
関連エントリ
・Desktop GPU と OpenGL ES 3.1 API
・Android 5.x OpenGL ES 3.1 と対応 GPU
・OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応
・3D 低レベル API の現状 Direct3D 12/Metal
おそらく AEP 対応 GPU がそのまま OpenGL ES 3.2 になるのではないかと思われます。
現在発売されている端末で AEP (GL_ANDROID_extension_pack_es31a) が含まれている GPU は下記の通り。
Tegra K1 Keper (192) SHIELD Tablet / Nexus 9 Tegra X1 Maxwell (256) SHIELD Adreno 4xx Snapdragon 805/808/810 等
Intel HD Graphics Gen8 も対応しているので、Cherry Trail 搭載 Android 端末が出ればこの一覧に入ることになるでしょう。
シェーダーのバージョンも 3.2 (320 es) です。Version 番号の空きを使い尽くしたので、もし次があるなら番号が飛ぶことになるかもしれません。(GLSL Version 一覧)
NVIDIA の Beta Driver がすでに使えるようになっているので試してみました。
GL_ARB_ES3_2_compatibility で実際に Context を作ることができます。
GL_VERSION: OpenGL ES 3.2 NVIDIA 355.58 GL_RENDERER: GeForce GTX 760/PCIe/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.20
↓詳細はこちら
・Desktop GPU Extensions
OpenGL ES 3.2 は ASTC 対応ですが、やはり OpenGL 4.5 context のまま Texture を読むとパフォーマンスの警告が出るようです。
また OpenGL 4.5 の方にはかなり気になる Extension が増えています。スレッドを使ったシェーダーのコンパイルが可能になるとのこと。
GL_ARB_parallel_shader_compile
なお Android もついに低レベル API である Vulkan 対応を発表しています。予想されてきたことではありますが、低レベル API はプラットフォームごとに完全に分かれることになりました。
API Platform ------------------------------------------ Direct3D 12 Windows Desktop / Mobile Metal iOS / Mac OS X Vulkan Android
パフォーマンスだけでなく Mobile / Desktop API の統合や、レガシーな OpenGL API からの脱却などさまざまなメリットもありますが、開発者にとっては悩ましいところです。
関連エントリ
・Desktop GPU と OpenGL ES 3.1 API
・Android 5.x OpenGL ES 3.1 と対応 GPU
・OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応
・3D 低レベル API の現状 Direct3D 12/Metal
2015/08/09
Metal iOS 半透明ソート (PowerVR GX6450)
ROV のテストで用いたシェーダーはそのまま Metal でも動きました。

↑上記は iPod touch 6 (A8) の結果です。
左が DepthTest 無しの通常の RenderTarget の内容、
右がバッファをソートした結果。
iOS のみです。Metal というより PowerVR の機能です。
関連エントリ
・Direct3D12 ROV を試してみる (3) 半透明ソートと Intel HD Graphics
・Direct3D12 ROV を試してみる (2) Depth Test と半透明ソート
・Direct3D12 ROV (Rasterizer Order View) を試してみる
・3D 低レベル API の違い Direct3D 12/Metal
・Direct3D 12 GeForce GTX970 は FeatureLevel 12_1 対応、Resource Bind/Heap Tier は低い
・3D 低レベル API の現状 Direct3D 12/Metal

↑上記は iPod touch 6 (A8) の結果です。
左が DepthTest 無しの通常の RenderTarget の内容、
右がバッファをソートした結果。
iOS のみです。Metal というより PowerVR の機能です。
fragment PS_OUT pmain(
VS_OUT pin [[stage_in]],
constant GeometryBuffer& geometry [[buffer(1)]],
half4 rcolor [[color(0)]],
float4 zstack [[color(1)]],
uint4 stack [[color(2)]]
)
{
PS_OUT pout;
half3 Light= normalize( half3( 0.0h, -0.5h, -1.0h ) );
half3 normal= normalize( half3(pin.Normal) );
half3 eyevec= normalize( half3( 0.0h, 0.0h, -120.0h ) - half3(pin.WPos.xyz) );
half3 hvect= normalize( eyevec.xyz + Light.xyz );
half3 spec= pow( saturate( dot( hvect, normal ) ), 82.0h ) * saturate( half3(geometry.Color.xyz) + half3( 0.6h, 0.6h, 0.6h ) );
half diffuse= saturate( max( dot( normal, Light ), 0.0h ) + 0.2h );
half4 color;
color.xyz= half3(geometry.Color.xyz) * diffuse + spec;
color.w= half(geometry.Color.w);
uint color_enc= EncodeColor( color );
float pz= pin.Position.z;
if( pz < zstack.w ){
zstack.w= pz;
stack.w= color_enc;
}
if( pz < zstack.z ){
zstack.w= zstack.z;
stack.w= stack.z;
zstack.z= pz;
stack.z= color_enc;
}
if( pz < zstack.y ){
zstack.z= zstack.y;
stack.z= stack.y;
zstack.y= pz;
stack.y= color_enc;
}
if( pz < zstack.x ){
zstack.y= zstack.x;
stack.y= stack.x;
zstack.x= pz;
stack.x= color_enc;
}
pout.Color= color;
pout.Color1= zstack;
pout.Color2= stack;
return pout;
}
VS_OUT pin [[stage_in]],
constant GeometryBuffer& geometry [[buffer(1)]],
half4 rcolor [[color(0)]],
float4 zstack [[color(1)]],
uint4 stack [[color(2)]]
)
{
PS_OUT pout;
half3 Light= normalize( half3( 0.0h, -0.5h, -1.0h ) );
half3 normal= normalize( half3(pin.Normal) );
half3 eyevec= normalize( half3( 0.0h, 0.0h, -120.0h ) - half3(pin.WPos.xyz) );
half3 hvect= normalize( eyevec.xyz + Light.xyz );
half3 spec= pow( saturate( dot( hvect, normal ) ), 82.0h ) * saturate( half3(geometry.Color.xyz) + half3( 0.6h, 0.6h, 0.6h ) );
half diffuse= saturate( max( dot( normal, Light ), 0.0h ) + 0.2h );
half4 color;
color.xyz= half3(geometry.Color.xyz) * diffuse + spec;
color.w= half(geometry.Color.w);
uint color_enc= EncodeColor( color );
float pz= pin.Position.z;
if( pz < zstack.w ){
zstack.w= pz;
stack.w= color_enc;
}
if( pz < zstack.z ){
zstack.w= zstack.z;
stack.w= stack.z;
zstack.z= pz;
stack.z= color_enc;
}
if( pz < zstack.y ){
zstack.z= zstack.y;
stack.z= stack.y;
zstack.y= pz;
stack.y= color_enc;
}
if( pz < zstack.x ){
zstack.y= zstack.x;
stack.y= stack.x;
zstack.x= pz;
stack.x= color_enc;
}
pout.Color= color;
pout.Color1= zstack;
pout.Color2= stack;
return pout;
}
関連エントリ
・Direct3D12 ROV を試してみる (3) 半透明ソートと Intel HD Graphics
・Direct3D12 ROV を試してみる (2) Depth Test と半透明ソート
・Direct3D12 ROV (Rasterizer Order View) を試してみる
・3D 低レベル API の違い Direct3D 12/Metal
・Direct3D 12 GeForce GTX970 は FeatureLevel 12_1 対応、Resource Bind/Heap Tier は低い
・3D 低レベル API の現状 Direct3D 12/Metal