1

OpenGL ES フラグメント シェーダーに、次のようなマクロがあります。

#define CHECK(x, DELTA, outColor, c1, c2) \
  if (x < (delta + (DELTA))) { \
    outColor = mix(c1, c2, smoothstep(delta, min(1.0, delta + (DELTA)), x)); \
    x = 10.0; /*skip all subsequent CHECKs */ \
  } \
  delta += DELTA; 

これは、私のデスクトップやさまざまな Android デバイスで問題なく動作します。(ええ、明示的なフロー制御から離れる必要がありますが、今のところ必要な出力が得られます。) 問題は、いくつかのデバイスがこのシェーダーのコンパイルに失敗し、次のようなエラーが発生することです。

 0:257: L0002: Undeclared variable 'DELTA'
,0:260: L0001: Expected literal or '(', got '\'
,0:263: L0001: Expected literal or '('...

(ライン 257 は"if ( x"ライン、ライン 260 は"} \"ラインであり、263 はここには示されていませんCHECK。マクロの最初の使用です。シェーダーの他の場所には、すべて大文字の「DELTA」の他のインスタンスはありません。)

このエラーは、行継続文字でつまずいていることを意味していると思いますか? これは本当に一部の GLSL コンパイラだけがサポートするものですか?

#version 100デスクトップと Android の間で可能な限り互換性を持たせるために、シェーダーを構築しています。

4

1 に答える 1

1

OpenGL

いいえ

v1.20.8 OpenGL GLSL 仕様には「いいえ」と書かれています。セクション 3.1「基本文字セット」には以下が含まれます。

行継続文字はありません。

参照: http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdfまたは http://www.opengl.org/registry/doc/GLSLangSpec.1.50.09.pdf

はい、そうです

仕様の以降のバージョン (v4.30.6) では、行継続文字のサポートが追加されました。http://www.opengl.org/registry/doc/GLSLangSpec.4.30.6.pdfを参照して ください。これがいつ追加されたのかはわかりません。

( ) のような古い「#version」ディレクティブ#version 100は、行の継続を無効にしていないようです (少なくとも、私の Nvidia デスクトップ ドライバーでは)。

OpenGLES

いいえ、多分

セクション1.5「互換性」には次のように記載されています。

GLSL ES 1.00 で OpenGL ES 2.0 API を使用する場合、行継続のサポートとコメント内の UTF-8 文字のサポートはオプションです。ただし、OpenGL ES 3.0 API で GLSL ES 1.00 シェーダーを使用する場合は、これらの両方のサポートが義務付けられています。

http://www.khronos.org/registry/gles/specs/3.0/GLSL_ES_Specification_3.00.3.pdfを参照してください。

概要

新しい GLSL 仕様には行継続文字のサポートが含まれていますが、実際には、このサポートは明示的にバージョン管理されたシェーダーでは無効になっていません。古い GLSL コンパイラは行継続文字をサポートしていない可能性があるため、最大限の互換性を得るためには行継続文字を避ける必要があります。

于 2013-05-07T18:31:59.367 に答える