2009-06-30 223 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);