web-dev-qa-db-ja.com

OpenGL ES2.0シェーダーのベストプラクティス

私は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で推奨される方法は何ですか?ベストプラクティスガイドはありますか?誰かが「何をすべきか」の輝かしい例である頂点とフラグメントシェーダーの例を提供できますか?

ありがとう。

15
MarkP
  1. 「ES2.0」にはgl_Vertexはありません。あなたが提供するすべての属性はカスタムです。
  2. gl_PositionはES2のオプションではなく、要件です。理由を理解するためにOpenGLパイプラインについて学びます。ヒント:ラスタライザーが無効になっている場合(たとえば、変換フィードバック)にのみオプションである可能性がありますが、これはESではサポートされていません。
  3. ES 2.0では、頂点属性は「属性」値を持っている必要があり、変化は「変化」として宣言されている必要があります。代わりに「in」と「out」を使用することは、OpenGL 3+で開発された習慣であり、ESには適用できません。

最後に、あなたにとって最良のオプションは、Nicol Bolasによって提案された OpenGL ES 2.0仕様 を読むことです。最初にルール、ベストプラクティス-後で。幸運を!

22
kvark

最大の問題は、デスクトップ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アプリケーションを作成している場合は、構文ではなくアルゴリズムを確認することをお勧めします。

22
Nicol Bolas

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リファレンスページを参照する方が簡単な場合があります。

2
Matt J.