そこで、クリスタルの色を時間の経過とともに少しずつ変化させるシェーダーを作成しようとしていましたが、光源から離れても暗くならないことに気付くまで、すべてうまくいきました (デフォルトの opengl ライトの今! )。そのため、光からの距離によって色の値をトーンダウンしようとしましたが、うまくいきませんでした。後で、(ワールド座標の頂点の x 位置が特定の値よりも大きい場合に色を赤に設定することにより)、vertex.x 値が約 0 であることを発見しました。
void main()
{
vec3 vertexPosition = vec3(gl_ModelViewMatrix * vertexPos);
vec3 surfaceNormal = (gl_NormalMatrix * normals).xyz;
vec3 lightDirection = normalize(gl_LightSource[0].position.xyz - vertexPosition);
float diffuseLI = max(0.0, dot(surfaceNormal, lightDirection));
vec4 texture = texture2D(textureSample, gl_TexCoord[0]);
if(vertexPosition.x > 0)gl_FragColor.rgba = vec4(1, 0, 0, 1);
/*And so on....*/
}
私が知る限り、 gl_ModelViewMatrix * gl_Vertex は頂点の世界座標を与えるはずです。私はただ愚かですか、それとも何ですか?(私も正しいライト位置でif文をやろうとしました!)