3

私は現在、GWT プラグイン gwt-g3d を使用して倉庫の 3D ビジュアライゼーションを作成することに関する学士論文に取り組んでいます。

構造レイアウトをかなり効率的に表示できるところまで来ました。すべてのレンダリングをシェーダー内に保持し、gl.draw()呼び出しを最小限に抑えるため、適切なフレームレートで 200 万以上の頂点をレンダリングします。ただし、この手法は非常に静的であるため、この手法を使用して行き止まりになったと思います。私が必要としているのは、アプリケーションをより動的にする方法です。私は Java でのオブジェクト指向プログラミングに慣れているため、シェーダー言語を理解するのは非常に困難です。これが私が話していることです...

ビジュアライゼーションの複数の領域 (これらの領域の数は初期化時に不明です) を別の方法 (別の色で開始) でレンダリングしようとしています。したがって、フラグメントシェーダー内で次のようなことを試しました。

...
uniform vec3 alteredCoords[]; //a coordArray of positions that i want to render alternatively
...

// color each of these coords in grey
for (int i = 0; i < alteredCoords.length(); i++) {
  if ( position.x == alteredCoords[i].x && position.y == alteredCoords[i].y && position.z == alteredCoords[i].z) {
    gl_FragColor = vec4(100.0/255.0, 100.0/255.0, 100.0/255.0, 1.0);
    return;
  }
}

配列には一定のサイズが必要であり、キャストの問題があるため、これがそのまま機能しないことはわかっています。シェーダー言語は動的にサイズ変更された配列をサポートしていないため、これはとにかく機能しないため、今のところ無視してみてください。

私が必要としているのは、この問題に対するある種の回避策です。何か案は?

現時点で私のレイアウトがどのように見えるかのスクリーンショットは次のとおりです。

単一の領域 (灰色の四角形) のアイデアを既に実装していることに注意してください。必要なのは、複数の領域をそのように動的にレンダリングする方法だけです。

4

2 に答える 2

1

フラグメント シェーダーで動的にサイズ変更された配列を取得するための一般的な回避策を次に示します。

テクスチャー!

より具体的には、nxmピクセル テクスチャを (最近傍のリサンプリングを使用して) 渡し、値nmユニフォームとして渡すことができます。テクスチャ サンプラーは正規化されたuv座標を使用するため、次のようにマッピング関数を構築できます。

uniform sampler2D sampler;
uniform float n;
uniform float m;

vec4 get_texel(float idx) {
    vec2 idx2d = vec2(
        (mod(idx, n) + 0.5) / n,
        (floor(idx / n) + 0.5) / m);
    return texture2D(sampler, idx2d);
}

vec4これで、 s の可変サイズの配列ができました

これをさらに拡張するには、シェルフが規則的なグリッドに配置されていると仮定すると、現在のフラグメントのワールド座標を取得して、渡したテクスチャの特定のピクセルにマップするマッピング関数を非常に簡単に作成できます。テクスチャの値を使用して、フラグメントのレンダリング方法を選択します。

于 2012-09-18T01:45:25.357 に答える
0

異なる方法で描画したいものに関する情報は頂点に関連付けられているため、頂点属性を使用して、これらの頂点と共に情報をパイプラインに転送するのが最善の方法です。私はこれについて専門家ではありませんが、他のものはこれよりも高価になる可能性が高いと思います.

于 2012-08-01T20:37:39.110 に答える