3

フラグメント シェーダーでワールド位置を取得しようとしています。現在、頂点シェーダーでこれを使用しています。

"varying vec3 vPosition;",

...

"vPosition = modelViewMatrix * position;",

編集

変数 vPosition がフラグメント シェーダーに渡されます。基本的に、マウスがある場所に赤い円でグリッドを描画しようとしています。次に、vPosition をフラグメント シェーダーで使用して、グリッドを描画する必要があるかどうかを判断します。

これはうまく機能しますが、メッシュをスケーリングするときは機能しません。Pls は下の画像を参照してください:

スケーリングなし: ここに画像の説明を入力

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;",
"}",

これについて助けてくれてありがとう。

4

1 に答える 1

2

「worldPosition」を使用して、これを機能させることができました。

"vec4 worldPosition = modelMatrix * vec4( 位置, 1.0 );",

于 2013-02-16T12:52:27.250 に答える