2012-03-05 9 views
2

ChromeのGLSLコンパイラを使用すると面白い効果があります。声明WebGLは同じグラフィックススタック上のOpenGLプリプロセッサとは異なります

#define addf(index) if(weights[i+index]>0.) r+=weights[i+index]*f##index(p); 

は、##構文がサポートされていないようです

preprocessor command must not be preceded by any other statement in that line 

述べコンパイルされません。 しかし、同じプラットフォーム(Linux 64ビット、Nvidia GPUなど)では、同じシェーダがコンパイルされて正常に動作します。なぜこれ?私は、シェーダコンパイラがGPUドライバスタックの一部であり、どちらの場合でも使用されると考えました。なぜこの別の経験ですか?

+0

実際には標準に正しく従っていることを知っているので、これはChromeのGLSLコンパイラのバグであると誤解されています。それとは別に、私はこの質問をupvoteします。 – LarsH

+0

これは誤解されていますが、GPUベンダーのドライバスタック内にコンパイラが1つしかないと思っていたので、ChromeのGLSLコンパイラにバグがあるとは思いません。しかし、1つ以上のプロファイルがあるようですが、ベンダースタックにまだ残っているかもしれません。私が直面していた問題は、WebGLの仕様によって '## '演算子が明示的に禁止されているため、WebGLのバグは全くありません。しかし、私はまだ他のGLアプリがそれを引き起こさない間にこのエラーがどのように起こるかをまだわかっていないので、この異なる挙動がどのように起こるのか不思議です。 – dronus

+0

OK、「Chromeで使用されているWebGL GLSLコンパイラのバグ」が「ChromeのGLSLコンパイラ」の「バグ」を意味しているとは思いません。コンパイラーがクロムかどうかという疑問があるのでしょうか?しかし、とにかく言葉を削除しました...ありがとう。 +1 – LarsH

答えて

1

WebGLの実装は、WebGLの仕様に準拠する必要があります。セキュリティ問題には多くの制限が必要です。 ##の問題はありませんが、とにかくWebGL仕様では正しくありません。

準拠するには、完全に適合するグラフィックススタックを使用するか(ドライバが表示している場合は、非拡張OpenGL ESプロファイルにラッパーを提供するなど)、GLSLシェーダコードとWebGL状態自体を事前にチェックしてcomamndsをいくつかの完全なOpenGL実装に渡す前に。

WebGLの動作は、同じマシン上のネイティブOpenGLの動作と異なる場合があります。

+0

これは実際にTobias Schlegelの答えとgmanのコメントをマージします。あなたがた両方に感謝します! – dronus

11

実際にWebGLは「OpenGL ES 2.0 for the Web」としても引用されているため、OpenGLにはいくつかの違いがあります。

WebGL仕様(https://www.khronos.org/registry/webgl/specs/1.0/)は次のように説明しています。 "WebGL実装では、OpenGL ESシェーディング言語バージョン1.00に準拠するシェーダのみを受け入れる必要があります。 GLSL ES 1.0仕様(https://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf)私が見つけたに探し

3.4節は、プリプロセッサを定義しても何の番号記号基づき事業者(なし#、#を@には、##など)がありません」と述べまた、sizeof演算子もありません。 "

だから、どんなブラウザの実装では、内部で行い、それが標準に従っ:)

+0

'それは標準に従う' ..私は同意する。まだそれはどういう奇妙な...そして、これらの演算子は除外されています。特に '## '演算子は実装が簡単ですが、利用できない場合は回避するのが難しいです。 – dronus

+0

おそらく答えは、Nvidiaのドライバが実際にデスクトッププラットフォームでもOpenGL ESを実装していて、Chromeが実際のOpenGL ESスタックを利用できるのであれば? – dronus

1

Windowsでは、デフォルトでOpenGLドライバが使用されていないためです。それはDirect3Dを使用し、OpenGLからDirect3Dへの変換はANGLEプロジェクトによって行われます。

ANGLEには、独自のシェーダバリデータとプリプロセッサがあります。したがって、同じハードウェアを使用していても、Windowsと他のオペレーティングシステムの違いを見ることができます。 ANGLEが作成されたのは、WindowsではDirect3Dのサポートが一般的にOpenGLサポートよりもはるかに優れており、実装とその適合性をより詳細に制御できるからです。

+0

これはWindowsプラットフォームでのそのような経験を説明するかもしれませんが、私は完全にOpenGL対応のLinuxマシンでこの効果に直面しました。 – dronus

関連する問題