【问题标题】:Vertex Displacement Doesn't Work in Three.js顶点置换在 Three.js 中不起作用
【发布时间】:2013-09-13 08:01:15
【问题描述】:

上周我一直在试验 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")

};

【问题讨论】:

  • 将行 'newVertexPos = vec4( normalize( position ) * df * 10.0 ) + vec4( position, 1.0 );',' 改为 ''newVertexPos = vec4( normalize( position ) * df * 10.0 , 1.0 ) + vec4( position, 1.0 );',' 没有更多错误

标签: opengl-es three.js webgl glsl


【解决方案1】:

实际上,您的 GLSL 编译器是脑死的。

这行有问题:normalize (position) ...,因为您尚未声明职位。它没有给你一个有用的信息来解释这一点,而是抱怨position 没有合适的尺寸。

这当然假设您实际上已经粘贴了正确的顶点/片段着色器。我不相信,因为这些着色器都没有 80 行代码。

【讨论】:

  • 那会是正确的吗? 'position = vUv.xy' 我认为 position 是 Three.js 使用的默认变量。我已经看到它在许多示例中使用而没有明确声明。
  • 你说得对,Three.js 使用position 作为保留字(实际上是vec3)。 Tsk tsk,为了清楚起见,库应该为保留字加上前缀(例如,gl_ 用于 OpenGL,tjs_ 用于 Three.js)。归一化(位置)的结果为您提供了一个 3 分量向量,您正在尝试使用它来构造一个 4 分量向量。根据所需的结果,您可以将vec4( normalize( position ) * df * 10.0 ) 替换为vec4( normalize( position ) * df * 10.0, 1.0 )... 我不知道第四个组件的正确值——它可能应该是0.0 或1.0。
  • 太棒了,清除了错误并感谢您的解释。我同意,文档还有很长的路要走。现在,当我将顶点着色器放入效果链('composer.addPass(effectRuttEtra)')时,它会使整个场景变暗,不再有网格。我有一个非常简单的场景设置,网格由视频纹理化,着色器通过效果链运行,如示例中所示。我删除了通行证,它很好,我得到了我的网格。有什么想法吗?
  • 我想我可能错误地解释了newVertexPos 解决方案。如果将 vec4 (..., 1.0) 添加到 vec4 (..., 1.0) 中,您将得到 vec4 (..., 2.0)。 W分量用于透视分割。这里真正发生的事情可能与透视后深度值有关,它们比应有的更接近。您是否尝试过使用vec4( normalize( position ) * df * 10.0, 0.0 ) 会产生不同的结果?
  • 是的,我尝试了 'vec4( normalize( position ) * df * 10.0, 0.0 )' 和 'vec4( normalize( position ) * df * 10.0, 1.0 )' 和相同的结果。跨度>
猜你喜欢
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2013-07-13
  • 2017-10-17
  • 2015-08-21
  • 1970-01-01
相关资源
最近更新 更多