Heres 私の頂点シェーダー コード:
#version 330
layout(location = 0) in vec3 vertex_position;
layout(location = 0) in vec3 vertex_normal;
//model space
uniform vec3 toLight;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
smooth out vec3 color;
void main()
{
gl_Position = projection * view * model * vec4(vertex_position, 1.0f);
vec3 normal = normalize(vertex_normal);
float intensity = dot(normal, toLight);
intensity = clamp(intensity, 0, 1);
color = vec3(intensity);
}
このコードでは、Learning Modern 3D Graphics Programming サイトのチュートリアルを使用して照明を計算しようとしています。ところで、これは素晴らしい本ですが、ここにあるコードは基本的にリストされたコードと同じですが、いくつかの名前が変更されていますが、いくつかの実験を通じて、非常に独特なものを発見しました. セグメンテーション違反は、
色 = vec3(強度);
行、その行を削除するとプログラムが正常に実行されるため、それはわかっています(もちろん、照明なしを除く)
ただし、行を置き換えると
float 強度 = dot(normal, toLight);
と:
フロート強度 = 3.14159;
それは 1.0f にクランプされ、すべて正常に動作します。立方体は白です。負の数を入力すると同じことが起こります。数値はゼロに固定され、立方体は黒です...
これは奇妙なことです。事実は次のとおりです。
- 出力ベクトルを要求された色に設定する行を削除すると、セグメンテーション違反はなくなります。
- 内積の計算を削除すると、セグメンテーション違反も消えます
- 強度が一定のフロートである場合、すべてが正常に機能します。
- 色を強度を含まないものに設定するとうまくいきます。
- 編集:強度変数を使用して色変数以外の変数を設定すると、たとえば
vec3 temp = vec3(intensity);
セグメンテーション違反が発生しないなど、興味深い情報が見つかりましたが、強度変数に関連しないものに色を設定しても問題なく動作しますcolor = vec3(1.0f);
が、色を設定temp
するとクラッシュしますが、これは非常に奇妙です。
どんな提案でも大歓迎です。ありがとう
また、opengl、c++ コードを含めますが、必要ではないと思います。間違っている場合は修正してください。