C-LegacyGL: ANGLEのGLES1Shaders.incを眺める会
だいたいWindowsNTのOpenGL1.0くらいの仕様で良いかなと思ったけど、結構良いスペックしてんだよな。。
----------------------------------------------------
toglinfo : Version 1.01 T.Teranishi
----------------------------------------------------
GL_VERSION: 1.01
GL_RENDERER: GDI Generic
GL_VENDOR: Microsoft Corporation
GL_EXTENSIONS: GL_EXT_vertex_array GL_WIN_swap_hint
----------------------------------------------------
GL_MAX_ATTRIB_STACK_DEPTH: 16
GL_MAX_CLIP_PLANES: 6
GL_MAX_EVAL_ORDER: 30
GL_MAX_LIGHTS: 8
GL_MAX_LIST_NESTING: 64
GL_MAX_MODELVIEW_STACK_DEPTH: 32
GL_MAX_NAME_STACK_DEPTH: 128
GL_MAX_PIXEL_MAP_TABLE: 65536
GL_MAX_PROJECTION_STACK_DEPTH: 10
GL_MAX_TEXTURE_SIZE: 1024
GL_MAX_TEXTURE_STACK_DEPTH: 10
GL_MAX_VIEWPORT_DIMS: 4096 4096
----------------------------------------------------
GL_SUBPIXEL_BITS: 3
GL_POINT_SIZE_RANGE: 0.500000 10.000000
GL_POINT_GRANULARITY: 0.125000
GL_LINE_WIDTH_RANGE: 0.500000 10.000000
GL_LINE_WIDTH_GRANULARITY: 0.125000
----------------------------------------------------
というか日立GIGALIZEとかあったな。。
というわけで、ANGLEのGLES1実装のシェーダー https://github.com/google/angle/blob/main/src/libANGLE/GLES1Shaders.inc を眺めつつ、どこを削れるのかを考える。シリアスなOpenGL ES1実装を作りたいのではなくて、あくまでWinNTとかGLIDEみたいな過去の3Dハードウェアでも動作するglueとしてC-WebGLを活用する方向性を考えたい(要は既存のアプリが存在しないのでやりたい放題)。
アトリビュート
数が少いんで、まずアトリビュートから。
頂点アトリビュート
in vec4 pos;
in vec3 normal;
in mediump vec4 color;
in float pointsize;
in mediump vec4 texcoord0;
in mediump vec4 texcoord1;
in mediump vec4 texcoord2;
in mediump vec4 texcoord3;
対応するvaryingもある。また、flat shadingのサポートのために color_varying_flat
もある。
flat out mediump vec4 color_varying_flat;
... まぁ常識的な内容しかないな。。
削れるとしたら pointsize
だろうか。そもそもpointsizeはGPUによってサイズが違うから使いづらいんだよな。。
フラグメントシェーダ出力
out mediump vec4 frag_color;
... 普通。
定数
GLステートに合わせて以下はシェーダーの定数として初期化される。
よってシェーダーのパラメタではない。 ... そうかシェーダーコンパイラ側の最適化に期待すれば頑張ってシェーダーを都度生成する必要が無くなるのか。。
Uniform類
Uniformはいくつかのセクションに分けられている。
(一般)
普通。Model view行列の逆行列って明示的に居るの。。?法線の導出に使っているようだ。
Point rasterization
いらない。
ライティング
ライティング関連はたぶん実装した方が良いよな。。
GL_OES_draw_texture
... って何だよ。。
矩形を描画するための拡張があるのか。まぁ無くて良いな。
あまり数は無い
ライティング と テクスチャに分けてそれぞれESSL1で実装していって必要なパラメタを規定していくのが良いかな。固定パイプラインのライティングモデルって全然理解してなくて、特にtwo sided lightingとかどうしたもんか。。
... ってANGLEのソース探しても light_model_two_sided
を実装している箇所がみあたらない。。