簡體   English   中英

片段着色器中的狀態依賴渲染

[英]State dependant rendering in fragment shader

我目前正在研究我的學士論文,該論文是關於使用GWT插件gwt-g3d創建倉庫的3D可視化。

我能夠非常有效地顯示結構布局。 以合適的幀速率渲染200萬個頂點,因為我在着色器中保留所有渲染並最小化我的gl.draw()調用。 但是,我認為我使用這種技術已經走到了盡頭,因為它非常靜態。 我需要的是一種使我的應用程序更具動態性的方法。 由於我習慣於在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;
  }
}

我知道這不會像現在這樣工作,因為數組需要一個恆定的大小並且存在轉換問題 - 現在試着忽略它,因為這不會起作用,因為着色器語言不支持動態大小的數組。

我需要的是這個問題的某種解決方法。 有任何想法嗎?

這是我的布局目前的樣子截圖:

請注意,我已經為單個區域(灰色方塊)實現了我的想法 - 我只需要通過某種方式動態渲染多個區域。

以下是在片段着色器中獲取動態大小的數組的典型解決方法:

紋理!

更具體地說,您可以傳入一個n x m像素紋理(使用最近鄰重新采樣),並將值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數組

為了進一步擴展,假設您的架子排列在規則網格中,您可以非常輕松地創建一個映射函數,該函數獲取當前片段的世界坐標並將其映射到您傳入的紋理中的特定像素,然后使用紋理的值來選擇如何渲染所述片段。

由於有關您想要繪制的內容的信息與頂點相關聯,您最好使用頂點屬性將信息與這些頂點一起傳輸到管道。 我不是這方面的專家,但我認為其他任何東西都可能比這更貴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM