Glsl 在球体上画圆

Glsl 在球体上画圆,glsl,shader,Glsl,Shader,我正在尝试使用着色器在球体上绘制许多圆。基本原则如下: 计算碎片(使用其纹理坐标)到圆中心位置的距离(圆的中心也在纹理坐标中指定) 计算从fragent到圆心的角度 基于角度,访问纹理(其中有360个像素,红色通道指定半径距离)并检索给定角度的半径 如果碎片到圆中心的距离小于检索到的半径,则碎片的颜色为红色,否则为蓝色 我想画。。。在蓝色球体上画60个红色圆圈。我用y着色器处理一个圆,但如何处理60?这是我到目前为止尝试过的 我传入了一个数据纹理,该纹理指定给定角度的半径,但我注意到伪影逐渐出现

我正在尝试使用着色器在球体上绘制许多圆。基本原则如下:

  • 计算碎片(使用其纹理坐标)到圆中心位置的距离(圆的中心也在纹理坐标中指定)
  • 计算从fragent到圆心的角度
  • 基于角度,访问纹理(其中有360个像素,红色通道指定半径距离)并检索给定角度的半径
  • 如果碎片到圆中心的距离小于检索到的半径,则碎片的颜色为红色,否则为蓝色
  • 我想画。。。在蓝色球体上画60个红色圆圈。我用y着色器处理一个圆,但如何处理60?这是我到目前为止尝试过的

  • 我传入了一个数据纹理,该纹理指定给定角度的半径,但我注意到伪影逐渐出现。我相信这是由于当我尝试使用以下方法从数据纹理检索信息时使用线性插值造成的:

    float returnV = texture2D(angles, vec2(x, y)).r; 
    
    其中,角度是包含给定角度半径的数据纹理(Sampler2D),x=角度/360.0(角度为0到360),y=0到60(y是圆编号)

  • 我试着通过一个统一的浮动半径[360],但我无法通过动态索引访问半径。我甚至试过这个烂摊子

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

  • 如果我创建一个纹理并将所有的圆放置在该纹理上,然后将蓝色球体与包含其工作圆的球体进行多重纹理,但正如您所料,我的锯齿非常糟糕。我喜欢根据片段和圆的位置按程序生成圆的想法,因为实际上没有锯齿。然而,我做的不止一件吗

    谢谢


    ~Bolt

    我有一个着色器,可以在地形上画圆。它通过鼠标移动。 也许你得到了灵感

    这是一个片段程序。它不是主程序,但您可以将其添加到程序中。 试试这个

    现在,您可以在硬代码中给出一些统一的参数

    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);
        }               
    }   
    }
    
    ,如果你用矩阵的逆矩阵来表示矩阵,你就得到了恒等式。
    你的

    vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
    vertexCoord = vec3(gl_ModelViewMatrixInverse * v);
    
    因此相当于

    vertexCoord = vec3(gl_Vertex);
    

    非常感谢。我想它很可能需要在vertex程序中做一些工作。Thx的灵感!我对这个答案加了一条评论。(由于格式和大小的限制,下面给出了答案)。事实上,您对第一条注释的看法是正确的,即关于Vertecord=vec3(gl_Vertex);但第二个不是。我使用dist作为dist^2,因此我将其与半径^2进行比较。我不想计算sqrt,所以使用了dist^2。不管怎样,你可以按照你说的改变函数。(两个都是真的)啊,很好。Ty表示澄清=)。我明白我的错误;我将编辑我的答案。
    vertexCoord = vec3(gl_Vertex);