私は現在、通常のシェーダーのように動作する THREE.JS でシェーダーの作成に取り組んでいますが、入力として色を使用してシェーディング方法を定義しています。
以下は問題の原因となっているコードです。その後に、私がそれを行っている理由と、問題の原因と思われるものについてのより長い説明があります。
fragmentShader: [
"uniform float opacity;",
"varying vec3 vNormal;",
"uniform vec3 color;",
"void main() {",
//THIS IS WHAT I THINK IS SCREWING UP EVERYTHING
//Can I not call normalize with that complex
//of equations within a normalize function?
"gl_FragColor = vec4( normalize(color.r + (vNormal.x*color.r)*.5, color.g + (vNormal.y*color.g)*.5, color.b + (vNormal.z*color.b)*.5), opacity );",
"}"
].join("\n")
より長い説明:
基本的に、THREE.shaderLib の通常のシェーダーと同じコードを使用しています。これは次のとおりです。
'normal': {
uniforms: {
"opacity" : { type: "f", value: 1.0 }
},
vertexShader: [
"varying vec3 vNormal;",
"void main() {",
"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
"vNormal = normalize( normalMatrix * normal );",
"gl_Position = projectionMatrix * mvPosition;",
"}"
].join("\n"),
fragmentShader: [
"uniform float opacity;",
"varying vec3 vNormal;",
"void main() {",
"gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );",
"}"
].join("\n")
},
私が使用しているのは基本的にこれですが、色の側面が追加されており、次のように新しいシェーダーを定義する関数内で呼び出されます。
function assignNewShader(color){
var colorAssign = new THREE.Color(color)
THREE.ShaderLib[color] = {
uniforms: {
"opacity" : { type: "f", value: 1.0 },
"color" : { type: "c", value: colorAssign },
},
vertexShader: [
"varying vec3 vNormal;",
"void main() {",
"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
"vNormal = normalMatrix * normal;",
"gl_Position = projectionMatrix * mvPosition;",
"}"
].join("\n"),
fragmentShader: [
"uniform float opacity;",
"varying vec3 vNormal;",
"uniform vec3 color;",
"void main() {",
"gl_FragColor = vec4(color.r + (vNormal.x*color.r)*.5, color.g + (vNormal.y*color.g)*.5, color.b + (vNormal.z*color.b)*.5, opacity );",
"}"
].join("\n")
}
}
最大の違いは「fragmentShader」セクション内にあることがわかります。ここでは、vNormal を使用して gl_FragColor を関数で指定された色と似た (ただし完全に同じではない) ようにしています。
私の問題は次のとおりです。オブジェクトが「スケーリング」されると、この色の違いはますます劇的になり、すべての色が可能な限り明るくなります。そのため、コードの「fragementShader」セクションに次のことを試みました。
fragmentShader: [
"uniform float opacity;",
"varying vec3 vNormal;",
"uniform vec3 color;",
"void main() {",
"gl_FragColor = vec4( normalize(color.r + (vNormal.x*color.r)*.5, color.g + (vNormal.y*color.g)*.5, color.b + (vNormal.z*color.b)*.5), opacity );",
"}"
].join("\n")
これを行うと、次のような大量のエラーが表示されます。
エラー: 0:37: 'normalize': 一致するオーバーロードされた関数が見つかりません エラー: 0:37: 'constructor': 構築に十分なデータが提供されていません
WebGL: INVALID_VALUE: attachShader: オブジェクトがないか、オブジェクトが削除されました
シェーダ VALIDATE_STATUS を初期化できませんでした: false、gl エラー [1281]
WebGL: INVALID_OPERATION: getUniformLocation: プログラムがリンクされていません
私は間違いなく、THREE の webGL 部分に頭を悩ませていますが、フラグメント シェーダーを変更するこのモードは機能するはずです。なぜそれができないのかについて誰か考えがありますか?