1

このシェーダー プログラムは、Radeon 3450M、GT 550Ti、GT430 などでは正常に動作しますが、Intel HD4000 では失敗します。何が間違っている可能性があるか、またはシェーダーをより Intel に適したものにするための提案はありますか?

頂点シェーダー:

uniform mat4    uniform_Projection;
attribute vec4  attribute_Position;
attribute vec4  attribute_Color;
varying vec4    varying_Color;
vec4    varying_Color_Bak;

void main(void)
{
  varying_Color.x = clamp(abs((attribute_Position.x + 3.0f) / 5.0f), 0.1f, 1.0f);
  varying_Color.y = clamp(abs((attribute_Position.y + 3.0f) / 5.0f), 0.1f, 1.0f);
  varying_Color.z = 0.0f;//clamp(abs((attribute_Position.x + attribute_Position.y + 4.0f) / 7.0f), 0.1f, 1.0f);
  varying_Color.w = 0.9f;
  gl_Position = uniform_Projection * attribute_Position;
}

フラグメント シェーダー:

uniform mat4    uniform_Projection;
varying   vec4    varying_Color;
vec4    varying_Color_Bak;
void main (void)
{
   varying_Color_Bak = varying_Color;
   varying_Color = uniform_Projection * varying_Color;
   for (int i = 0; i < 3; i++) {
      varying_Color = sin(varying_Color);
      varying_Color = inversesqrt(abs(varying_Color));
      varying_Color = abs(log(varying_Color));
   }
   varying_Color = clamp(varying_Color, 0.1f, 1.0f);
   varying_Color = mix(varying_Color, varying_Color_Bak, 0.9f);
   gl_FragColor = sin(varying_Color);
}
4

2 に答える 2

3

これをポータブルにするためにできる#version 120一番のことは、シェーダーの上部に追加することです。コメントで説明されているように、オプションのf浮動小数点精度サフィックスは GLSL 1.2 の追加です。GLSL 1.1 の仕様にはこれが含まれておらず、厳密に準拠しているコンパイラは、GLSL 1.1 シェーダーでこれに遭遇すると解析エラーを発生させます。

ここでの根本的な問題は、シェーダーの先頭にディレクティブを含めない場合#version、対応する GLSL コンパイラは、シェーダーが GLSL 1.1 仕様に対して記述されていると想定することになっていることです。多くのコンパイラはこれらの規則を緩和し、GLSL 1.1 には存在しなかった構文を警告なしで使用できますが、他のコンパイラは非常に厳密です。GLSL コンパイラの実装が警告でより冗長になるように示唆する方法がないため、自分の時間で各 GLSL バージョンの違いに慣れる必要があります。ANGLE プロジェクトはポータブル シェーダー バリデーター (ほとんどの WebGL 実装で使用) を提供しますが、これは OpenGL ES 2.0 のバージョンの GLSL を対象としており、ここでは役に立ちません。

シェーダーの他のすべては、GLSL 1.1 に対して有効であるように見えます。ここでの重要なメッセージは#version、GLSL シェーダーの上部にあるディレクティブが、思っているよりも重要であるということです。glGetShaderInfoLog (...)そして、 andの出力を読まないと、シェーダーの問題を診断することは非常に困難ですglGetProgramInfoLog (...)- 各実装には異なるレベルの冗長性がありますが、一般に、それらはすべて、コンパイル/リンクの失敗時に役立つものを生成します;)

于 2013-10-31T21:12:05.977 に答える