【问题标题】:Fragment world position with scale用比例尺分割世界位置
【发布时间】:2023-03-13 14:37:01
【问题描述】:

我正在尝试在片段着色器中获取世界位置。我目前在顶点着色器中使用它:

"varying vec3 vPosition;",

...

"vPosition = modelViewMatrix * position;",

编辑

变量 vPosition 被传递到片段着色器中。本质上,我试图在鼠标所在的地方用红色圆圈绘制网格。然后在片段着色器中使用 vPosition 来确定是否需要绘制网格。

这很好用,但当我缩放网格时就不行了。请看下面的图片:

没有缩放:

使用 2X 缩放:

我并不完全了解整个流程。我了解了大部分内容 - 但我猜我尝试的内容不正确......?

编辑 这是片段着色器中网格绘制代码的样子:

// Draw the ring and grid on the terrain for when we are editing it.
"if (show_ring == true){",
   "float distance = sqrt((vPosition.x - ring_center.x) * (vPosition.x - ring_center.x) + (vPosition.z - ring_center.z) * (vPosition.z - ring_center.z));",
   "if (distance < ring_radius + ring_width / 2.0 && distance > ring_radius - ring_width / 2.0) {",
   "gl_FragColor.r += ring_color.r;",
   "gl_FragColor.b += ring_color.b;",
   "gl_FragColor.g += ring_color.g;",
   "gl_FragColor.a += ring_color.a;",
   "gl_FragColor *= 2.0;",
   "gl_FragColor = normalize(gl_FragColor);",                   
"}",

// Grid overlay
"float gridDist = ring_radius / 4.0 * 3.0;",
"if (distance < gridDist ) {",
   "float tiles = 1.0 / 100.0;",
   "float val = mod(vUv.y, tiles);",
   "if (mod(vUv.x, tiles) < .001 || mod(vUv.y, tiles) < .001) {",
   "gl_FragColor = gl_FragColor * (distance / gridDist);",
   "gl_FragColor.a = 1.0;",
"}",

感谢您对此的任何帮助。

【问题讨论】:

    标签: three.js


    【解决方案1】:

    我能够通过使用“worldPosition”来实现它:

    "vec4 worldPosition = modelMatrix * vec4( position, 1.0 );",

    【讨论】:

    • 这个好像没有考虑翻译
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多