0

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++ コードを含めますが、必要ではないと思います。間違っている場合は修正してください。

4

2 に答える 2

2

最良の推測:toLightユニフォームを設定するコードにバグがあります -- のように見えますがglUniform3fv(toLight_location, 3, pointer)pointer偽物 (NULL または無効) です。GL ドライバー コードは、このポインターを参照解除しようとし、クラッシュします。シェーダーでのすべての使用を削除すると、非アクティブとして -1 になり、呼び出しが noop になるtoLightため、クラッシュしません。toLight_locationglUniform3fv

于 2013-01-14T23:25:52.220 に答える
0

なんてこった!私はここで大きな間違いを犯しました:

layout(location = 0) in vec3 vertex_position;
layout(location = 0) in vec3 vertex_normal;

vertex_position方法に気付きvertex_normal、同じ場所にいるのに、私も知りませんでした。場所を 1 に設定すると、vertex_normalすべてが修正されました。申し訳ありませんが、ほとんどの時間を無駄にしましたが、提案してくれた皆さんと、通常の状態でセグメンテーション違反が発生していることに気付き、ソースのトップに導いてくれたティムに感謝します。皆さん、同じようにありがとう... =D

于 2013-01-15T00:07:41.190 に答える