2009-06-30 191 views
1

我試圖在使用着色器的球體上繪製大量的圓。基本alogrith是這樣的:球體上的繪製圓圈

  1. 從所述片段計算的距離(使用它的紋理座標),以圓的中心的位置(圓的中心也是在紋理座標指定)
  2. 從計算角度朝向圓心的尖銳。基於角度,訪問紋理(其中具有360個像素並且紅色通道指定半徑距離),並且如果從片段到圓心的距離較小,則檢索給定角度的半徑
  3. 比檢索的半徑大,則片段的顏色是紅色的,否則是藍色的。

我想畫...說60藍色球體上的紅色圓圈。我有着色器工作了一個循環,但如何做60?這是我到目前爲止已經試過....

  1. 我在數據紋理指定給定角半徑過去了,但我發現文物在蠕動,我相信這是由於線性插值時我嘗試使用檢索來自數據紋理信息:

    float returnV = texture2D(angles, vec2(x, y)).r; 
    

    其中角是數據的紋理(Sampler2D),其包含對於給定的角度的半徑,並且x =角/ 360.0(角度爲0至360)和y = 0至60(y是圓圈編號)

  2. 我試過p分配統一的浮動半徑[360],但我無法通過動態索引訪問半徑。我甚至試過這個爛攤子......

    getArrayValue(int index) { 
        if (index == 0) { 
        return radii[0]; 
        } 
        else if (index == 1) { 
        return radii[1]; 
        } 
    

    等等...

如果我創建一個紋理,並把各界對紋理,然後多紋理藍色球與包含它的圓圈的工作,但正如你所期望的,我有非常糟糕的別名。我喜歡根據片段的位置和圈的順序生成圓的想法,因爲實際上沒有混疊。但是,我是否比一個人做礦石?

Thx !!!

〜博爾特

回答

1

我有一個着色器,使得對地形圈。它通過鼠標移動而移動。 也許你會得到靈感?

這是一個片段程序。它不是主程序,但可以將它添加到程序中。 試試這個......

現在你可以給硬編碼一些統一的參數。

uniform float showCircle; 
uniform float radius; 
uniform vec4 mousePosition; 

varying vec3 vertexCoord; 

void calculateTerrainCircle(inout vec4 pixelColor) 
{ 
if(showCircle == 1) 
{ 
    float xDist = vertexCoord.x - mousePosition.x; 
    float yDist = vertexCoord.y - mousePosition.y; 

    float dist = xDist * xDist + yDist * yDist; 
    float radius2 = radius * radius; 

    if (dist < radius2 * 1.44f && dist > radius2 * 0.64f) 
    { 
     vec4 temp = pixelColor; 

     float diff; 
     if (dist < radius2) 
      diff = (radius2 - dist)/(0.36f * radius2); 
     else 
      diff = (dist - radius2)/(0.44f * radius2); 

     pixelColor = vec4(1, 0, 0, 1.0) * (1 - diff) + pixelColor * diff; 

     pixelColor = mix(pixelColor, temp, diff); 
    }    
} 
} 

和頂點着色器添加:

varying vec3 vertexCoord; 

void main() 
{ 
    gl_Position = ftransform(); 

    vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex); 
    vertexCoord = vec3(gl_ModelViewMatrixInverse * v); 
} 
+0

謝謝!我認爲它很可能必須在頂點程序中做一些工作。 Thx爲靈感! – Boltimuss 2009-07-15 12:34:55

+0

我已在此答案中添加了評論。 (由於格式和大小的限制,它在下面顯示爲答案)。 – RJFalconer 2009-12-31 15:31:48

0

ufukgun,如果你multuiply它的逆矩陣你的身份。
你的;

vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex); 
vertexCoord = vec3(gl_ModelViewMatrixInverse * v); 

因此相當於

vertexCoord = vec3(gl_Vertex);