上周我一直在试验 Three.js 和 WebRTC,感觉我已经用尽了关于这个主题的文档。我正在尝试映射uniform sampler2D tDiffuse;
到这个顶点着色器。tDiffuse 中每个像素的亮度应该映射到输出的每个顶点上的顶点位移。但我收到以下错误:ERROR: 0:80: 'constructor' : not enough data provided for construction
现在,这个着色器在模型渲染后就在效果管道中。我需要指定宽度和高度还是我遗漏了什么?我从几个不同的来源拼凑而成的代码有问题吗?我什至可以在此效果管道中进行顶点置换,还是需要以不同的方式将着色器应用于场景中的网格?我了解我需要做的事情背后的理论,但是 GLSL 以及这个 three.js 管道对我来说是新的,尽管我在类似的图形应用程序方面有很多经验。
THREE.RuttEtraShader = {
uniforms: {
"tDiffuse": { type: "t", value: null },
"opacity": { type: "f", value: 1.0 }
},
vertexShader: [
'uniform sampler2D tDiffuse;',
'varying vec3 vColor;',
"varying vec2 vUv;",
'void main() {',
'vec4 newVertexPos;',
'vec4 dv;',
'float df;',
"vUv = uv;",
'dv = texture2D( tDiffuse, vUv.xy );',
'df = 0.30*dv.x + 0.59*dv.y + 0.11*dv.z;',
'newVertexPos = vec4( normalize( position ) * df * 10.0 ) + vec4( position, 1.0 );',
'vColor = vec3( dv.x, dv.y, dv.z );',
'gl_Position = projectionMatrix * modelViewMatrix * newVertexPos;',
'}'
].join("\n"),
fragmentShader: [
"uniform float opacity;",
"uniform sampler2D tDiffuse;",
"varying vec2 vUv;",
"void main() {",
"vec4 texel = texture2D( tDiffuse, vUv );",
"gl_FragColor = opacity * texel;",
"}"
].join("\n")
};