2017-10-14 15 views
2

フラグメントシェーダのコンパイルに問題があります。私はこのエラーを取得しておいてください。gl_FragDataはゼロにする必要があります

Uncaught Error: Fragment Shader Compiler Error: ERROR: 0:21: '[' : 
array index for gl_FragData must be constant zero ERROR: 0:21: '[' : 
array index for gl_FragData must be constant zero ERROR: 0:21: '[' : 
array index for gl_FragData must be constant zero 

これはコードです:

#ifdef GL_EXT_draw_buffers 
#extension GL_EXT_draw_buffers : require 
#endif 
#ifdef GL_ES 
precision highp float; 
#endif 
void main() { 
    gl_FragData[0] = vec4(1.,2.,3.,4.); 
    gl_FragData[1] = vec4(1.,2.,3.,4.); 
    gl_FragData[2] = vec4(1.,2.,3.,4.); 
    gl_FragData[3] = vec4(1.,2.,3.,4.); 
} 

私は(フレームバッファに取り付けた4つのテクスチャ付き)gl_FragColorを設定するが、しようとしている場合は、全体のセットアップが正常に動作します上のコードを実行すると(出力先にバッファをインデックスする)、コンパイルされないようです。私は拡張機能を使用してWebGL1でうまく動作するのを見てきました。私はWebGL2を使用しているので、多分この文脈では何かが違うでしょうか? (私はそれをChromeの最新バージョンで試しています)。

+1

WebGL2を使用している場合は、GLSL 3.3標準に合わせて構文を根本的に変更する必要があると思います。ここを見てください:http://io7m.com/documents/fso-tta/ 'GLSL 3.30 「OpenGL [3.3,4.4]およびOpenGL ES 3.0では、名前付き出力をレイアウト修飾子を使用して番号付き描画バッファに関連付ける、名前付きフラグメントシェーダ出力に割り当てます」と説明しています。 –

+2

WebGL2はGLSL 3.3をサポートしていません。 [GLSL ES 3.0](https://www.khronos.org/registry/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf)をサポートしています。 GLSL 3.3仕様を参照するのは非常に混乱します。なぜなら、それは間違った仕様であるため、何も動作しないことが分かります。 – gman

答えて

1

WebGL1からWebGL2に移行することを検討するにはいくつかの変更があるようです。 @ gmanのコメントがあれば、私は彼が本当にここの専門家であることを知っているので、彼の記事にリンクするのが最善だと思った。私はまた、それが人バージョンdifferences覚えることが見出さhttps://webgl2fundamentals.org/webgl/lessons/webgl1-to-webgl2.html

:; WebGLの2への変換)

WebGLの1

一言で言えば

WebGL 1.0 is based on OpenGL ES 2.0 and provides an API for 3D graphics. It uses the HTML5 canvas element and is accessed using Document Object Model (DOM) interfaces.

WebGL 2.0 is based on OpenGL ES 3.0 and made guaranteed availability of many optional extensions of WebGL 1.0 and exposes new APIs.

を()歴史上の最初のリンクも参照:

  1. シェーダコードは、拡張機能を使用してWebGL 1(OpenGL ES 2)で見た例で設計されています。これは、OpenGL 2.0が複数のカラー値をgl_FragDataでサポートしていたためうまく機能しました。

  2. WebGL 2(OpenGL ES 3)に切り替えると、別の方法で償却されます。今度はoutの宣言が必要です(out vec4 out_0; main(void) { out_0 = vec4(1.0, 0.0, 0.0, 1.0); }など)。しかし、私はまだいくつかの問題を抱えていました。私はバッファの場所を指定する必要があるようです。また、私はこのエラーを取得しました。

    #version 300 es 
    layout(location = 0) out vec4 out_0; 
    layout(location = 1) out vec4 out_1; 
    main(void) { 
        out_0 = vec4(1.0, 0.0, 0.0, 1.0); 
        out_1 = vec4(1.0, 0.0, 0.0, 1.0); 
    } 
    

    時:私は私のプログラムの先頭に#version 300 esを追加するために必要なので、WebGLの2のための正しいコードをよりこのようになっていることを意味し

    ERROR: must explicitly specify all locations when using multiple fragment outputs

    私はこのエラーの原因間違ったバージョン、持っていたワンポイント:

    invalid version directive ERROR: 0:24: 'out' : storage qualifier supported in GLSL ES 3.00 and above only

    をしかし、私はWebGLの2のバージョンは、特に#version 300 esであることが判明(に気付きます部分)、これはうまくいった!

    注:バージョン指定子はFIRST行に指定する必要があります。残念ながら、プリプロセッサーディレクティブ(つまり#ifdef)に入れることはできません。したがって、コンパイルする前に動的に文字列を変更する必要がありました。 WebGLの2(ES 3)のためにコンパイルされた場合、頂点シェーダで

    #version directive must occur before anything else, except for comments and white space

  3. attributeではなく、今inであることに注意してください。そうでない場合、あなたはこれを取得します。頂点シェーダのバージョンもコンパイルされるフラグメントのそれと一致している必要があり、さもなければ、あなたは、この取得します:私は一緒にすべてのこの混乱を糊付けすることは、他の誰か多くの時間を節約することができます願ってい

    ERROR: Shader Linking Error: Versions of linked shaders have to match.

を。 ;)

+0

ここに*変更を破る*の歴史はありません。リンク先のドキュメントは、WebGLまたはWebGL2とはまったく関係ありません。それはOpenGLに関するもので、同じものでもWebGLに関連するものでもありません。 WebGLとWebGL2はOpenGL ** ES **に関連しています。 Sedenionは正しい方向にあなたを指差していませんでした。彼は間違った方向にあなたを指摘した。あなたは幸運にも、あなたの問題を理解するのに役立ちました。答えの最初のリンクは、OpenGL ESではなくOpenGLに関するものです。 OpenGLはWebGLとは何の関係もありません。それを参照すると、混乱の原因となります。あなたの答えは、さまざまなOpenGL関連のバージョンを試した場所を示しています。 – gman

+0

OpenGL ES変換記事にもリンクしていますが、OpenGL ESではなくWebGL2を使用していますので、[WebGL2変換記事](https:// webgl2fundamentals) org/webgl/lessons/webgl1-to-webgl2.html) – gman

+0

ありがとうございます。私はそれから離れすぎてしまった後、すべてに戻ってきました。そして、それはすべてあふれています。これらの答えを書いていると(私はすでに良いものが見つからない)、私も学ぶのに役立ちます。私があなたの記事を早く見つけたなら、私は笑っていると思う。 ;) –

関連する問題