规范化webGL中的函数不工作(THREE.js)
我目前正致力于在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() {",
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法线向量的验证范围是多少。