规范化webGL中的函数不工作(THREE.js)

规范化webGL中的函数不工作(THREE.js),three.js,webgl,fragment-shader,normalize,Three.js,Webgl,Fragment Shader,Normalize,我目前正致力于在THREE.JS中创建一个着色器,它的作用类似于普通着色器,但使用颜色作为输入来定义着色方式 下面是导致问题的代码,之后是对我为什么这样做以及我认为导致问题的原因的详细解释: fragmentShader: [ "uniform float opacity;", "varying vec3 vNormal;", "uniform vec3 color;", "void main() {",

我目前正致力于在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:“规格化”:未找到匹配的重载函数 错误:0:37:“构造函数”:没有为构造提供足够的数据

WebGL:无效的_值:attachShader:没有对象或对象已删除

无法初始化着色器 验证_状态:错误,总账错误[1281]

WebGL:无效的\u操作:getUniformLocation:程序未链接


我肯定是在我的头进入webGL的第三部分,但在我看来,这种改变片段着色器的模式应该是可行的。有人知道为什么不可以吗?

Normalize接受的是vec3而不是vec4。

Normalize(color.r+(vNormal.xcolor.r).5,color.g+(vNormal.ycolor.g).5,color.b+(vNormal.zcolor.b).5)这不是vec3吗?我可能计算错了parensI假设你试着用vec4(1,1,1)替换那一行,看看是否成功了。是的,我不使用normalize的那个也很好。这似乎只是正常化函数把它搞砸了…你能把不透明度设为1看看会发生什么吗。否则,颜色和V法线向量的验证范围是多少。