GLSL遭遇したエラーとwarning

本物のページはこちら→error-i-met

Included page "glsl:error-i-met" does not exist (create it now)

遭遇したエラー

error C0204: version directive must be first statement and may not be repeated

#version 130

とかいう記述はシェーダファイルの冒頭に書かなければならない。

error C1068: too much data in type constructor

vec3なのに引数に4個も渡していたり,またはドットとカンマを間違えて書いてしまったり。した時に起きる。
✖vec3(0.0,0,0,0,0);
○vec3(0.0,0.0,0.0); or vec4(0.0,0.0,0.0,0.0)

out can't be used with non-varying texCoord

outにはvarying修飾子をつけないとだめ。

一字一句間違えてないのにユニフォーム変数が取得できない!!??

uniform vec3 cam;
のように宣言していても、main()の中で使用してなければ、取得できなくなる。
たとえ、main()の中で書いてあっても、最終的な出力にその変数が反映されていなければ、取得できなくなる。
コンパイラ賢すぎ?

assignment of incompatible type

vec3とvec4をごっちゃにしてるとこうなる。明示的にvec4(vec3,1.0);という風に書くこと。

error C7549: OpenGL does not allow C style initializers

これはエラーに成った

vec2 edges[12]={
    {0,1},
    {1,2},
    {2,3},
    {3,0},
    {0,4},
    {1,5},
    {2,6},
    {3,7},
    {4,5},
    {5,6},
    {6,7},
    {7,4}
};

こっちならok
vec2 edges[12]=vec2[](
    vec2(0,1),
    vec2(1,2),
    vec2(2,3),
    vec2(3,0),
    vec2(0,4),
    vec2(1,5),
    vec2(2,6),
    vec2(3,7),
    vec2(4,5),
    vec2(5,6),
    vec2(6,7),
    vec2(7,4)
);

遭遇したWarning

warning C7502: OpenGL does not allow type suffix 'f' on constant literals

0.0fはダメ。0.0と書く。

warning C7503: OpenGL does not allow C-style casts

Cスタイルのキャストはダメ
ダメなコード

int n=1;
float f=(int)n;

良いコード
int n=1;
float f=int(n);

warning C7533: global variable gl_ is deprecated after version 120

じゃあ何を使えっていうの?なんで、不便化してるのだーー ES対応ってわけ?
これで遭遇した組み込みのユニフォーム変数は以下になる

  • gl_FrontLightProduct
  • gl_FrontMaterial
  • gl_LightSource
  • gl_FragColor

warning C7548: '&' requires "#extension GL_EXT_gpu_shader4 : enable" before use

&演算子を用いるには#extension GL_EXT_gpu_shader4 : enableする必要がある
なので、シェーダの冒頭に次の1行を加えよう

#extension GL_EXT_gpu_shader4 : enable

冒頭といっても#versionより前に書いてはならない。

warning C7549: OpenGL does not allow C style initializers

こんなふうに書いたらでた。

int edge_idx[6*4] = {
    0,1,3,-1,
    2,0,1,3,
    4,5,7,-1,
    6,4,5,7,
    8,9,11,-1,
    10,8,9,11
};

正しくはこう書く
int edge_idx[6*4] = int[](
    0,1,3,-1,
    2,0,1,3,
    4,5,7,-1,
    6,4,5,7,
    8,9,11,-1,
    10,8,9,11
);

warning C7551:OpenGL first class arrays require #version 120

こういうエラーが出たときは、シェーダファイルの先頭に #version 120と書くと、この手のエラーは消える

 #version 120 //GLSL1.2を使用しますよ
void main(){....

#versionとは?GLSLのバージョン
文頭に #version 120
GLSL 1.20 を使用する場合は #version 120 が必要です。#version を指定しない場合は GLSL 1.10 とみなします。

warning C7555: 'varying' is deprecated, use 'in/out' instead

Cgみたいだなぁ。

サポートサイト Wikidot.com glsl-array