私はOpenGLでシェーダーの例を探していて、いくつかのさまざまなスタイルを見てきました。一部のシェーダーは、特に組み込み型(gl_Vertexなど)を使用して、アプリケーションコードとシェーダーとの間でデータを転送します。
一部のシェーダーは、gl_Positionおよびgl_FragColorの代わりに、さまざまなタイプを使用して頂点からフラグメントシェーダーにデータを転送します。
一部のシェーダーは、接頭辞「in」および「out」を使用してデータ転送を指定します。
in vec3 vertex;
void main() {
gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0);
}
...他の人が属性を使用している間:
attribute vec4 vertex_attrib;
attribute vec4 tex_coord_attrib;
attribute vec4 color_attrib;
uniform mat4 mvp_matrix;
uniform mat4 texture_matrix;
varying vec4 frag_color;
varying vec2 tex_coord;
void main(void)
{
gl_Position = mvp_matrix * vertex_attrib;
vec4 transformed_tex_coord = texture_matrix * tex_coord_attrib;
tex_coord = transformed_tex_coord.st / transformed_tex_coord.q;
frag_color = color_attrib;
}
私の質問は、シェーダーを作成するためにGLES 2.0で推奨される方法は何ですか?ベストプラクティスガイドはありますか?誰かが「何をすべきか」の輝かしい例である頂点とフラグメントシェーダーの例を提供できますか?
ありがとう。
最後に、あなたにとって最良のオプションは、Nicol Bolasによって提案された OpenGL ES 2.0仕様 を読むことです。最初にルール、ベストプラクティス-後で。幸運を!
最大の問題は、デスクトップGLSLシェーダーを調べて、それがGLSL-ESにとって何を意味するのかを理解しようとしていることです。
OpenGL ESがOpenGLと同じものではないように、GLSL-ESはGLSLと同じものではありません。 GLSL-ESが分割されて以来、GLSLは長年にわたってかなり進歩してきました。したがって、GLSL-ESシェーダーを実装するための大まかなガイド以上のものとしてデスクトップGLSLシェーダーを使用することはできませんできません。 CのガイドとしてC++テキストを使用できる以上のものです。
言語は非常に似ていますが、デスクトップGLSLは、GLSL-ESがまだ捨てていない多くのキーワードを放棄しなければなりませんでした。同様に、旧式のGLSL(1.20)は、組み込みの入力や出力など、GLSL-ES以降のバージョンのGLSLから削除された多くの機能を実装しました。したがって、GLSL-ESでは機能しないデスクトップGLSLシェーダーのlotが表示されます。確かに、あなたがそうするものを見つけた場合、それはまったくの偶然によるものです。
GLSL-ESのガイドについてはよくわかりませんが、見つけて使用するのが最も簡単なのは、究極のソースです: OpenGL ESシェーディング言語仕様(PDF) 。拡張機能は機能を積み重ねることができますが、そのPDFはコア言語を定義します。次の賭けは、OpenGL ES2.0固有として明示的にマークされたマテリアルです。
基本的に、デスクトップGLSLシェーダーが何をしているのかは理解できますが、OpenGL ES 2.0アプリケーションを作成している場合は、構文ではなくアルゴリズムを確認することをお勧めします。
Android Developer OpenGL ES 2.0チュートリアルとsdkサンプルコードには、OpenGL ES 2.0のサンプルコードがあります。ただし、人々が言及し続けるのとまったく同じ参照ファイルが必要です。OpenGL ES Shading Language Specification」を参照して、そのサンプルコードを理解してください。これは、Googleが何をしているのかを説明することがあまりないためです。説明する場合、標準のOpenGL用語に常に準拠しているとは限りません。
そうは言っても、コードを読んでいる間は、 http://www.khronos.org/opengles/sdk/docs/man/ のOpenGL ES2.0リファレンスページを参照する方が簡単な場合があります。