2015-01-09 86 views
0

當我從遠處觀察我的點雲時,所有點似乎都重疊,給人一種連續表面的印象,這是我試圖達到的效果。但是,當我接近雲時,可以看到各個點的平方以及它們之間的差距。我怎樣才能擺脫這些差距?例如,當相機變得更小時,讓點的尺寸更大?消除雲中點之間的差距 - 讓距離越近越大?

這是working example。如果按下向上箭頭放大,最終會看到單個點而不是連續的「雲」

順便說一句 - 如果您需要更多上下文,則此問題的詳細版本爲here

感謝

尼爾

回答

0

我在the particle vertex shader for my Cubes這樣做,很可能在不必要的冗長的方式。

// Compute pixel scale for points 
vec4 testPosition = eyePosition; 
testPosition.x = uPixelsPerClipUnit.x/uTileSize * 1.2/*appearance fudge factor*/; 
testPosition.y = 0.0; 
testPosition = uPMatrix * testPosition; 
gl_PointSize = testPosition.x/testPosition.w * animationScale; 

這些都是你需要提供變量(與u開始的那些我不得不制服):

  • eyePosition是之前只是在眼空間點的位置(即投影矩陣被應用,並且在模型/視圖矩陣/矩陣被應用之後)。它的唯一部分我們真正關心的是z軸。

  • uPixelsPerClipUnit是被設置爲視口像素尺寸半vec2 - 它只是從− 1對1的剪輯空間尺度的轉換因子爲像素。

  • uTileSizeanimationScale只是我的遊戲特定的參數,應該有多大。他們不需要在兩個不同的地方。

  • uPMatrix是投影矩陣。

我們實際上是在這裏做越來越的

  • 眼空間到剪輯空間比例由投影矩陣設置產品,在點的z深度和
  • 剪輯空間到像素規模

,並使用該設置點的大小。

(我想提供一個自包含的工作的例子,但我不認爲我會避開它,所以你得到的片段和半生不熟的解釋。)

+0

驚人的 - 感謝 - 我會給你一個去,讓我知道如果我得到它的工作。我在這裏處於WebGL的深層次,所以很高興得到一些建議。 – nrob

+0

我不明白eyePosition來自哪裏。它只是threejs/webgl爲您的便利創建的魔術變量之一,還是您已傳遞給着色器的某個變量?它似乎並不存在於我的着色器 – nrob

+0

我認爲'eyePosition'必須在我的three.js版本中預定義爲'cameraPosition'。順便說一下,如果任何人有一個鏈接到什麼'modelMatrix','modelViewMatrix','projectionMatrix','viewMatrix','normalMatrix'的定義是什麼,那會讓我的生活更加愉快。可以隨時隨地找到任何信息不知道爲什麼它似乎是這樣一個祕密! – nrob