如何计算opengl中一个点周围的一个圆圈(纹素)

时间:2012-08-24 10:38:46

标签: math opengl opengl-es

我在片段着色器中计算一个圆周围的圆。问题是变化的纹理部分不是圆形,而是椭圆形。形式实际上取决于纹理的形状。如果纹理是一个完美的正方形,我会得到一个完美的圆形但是当它是一个矩形时我得到一个椭圆形。这是当前的片段着色器:

varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;

uniform highp vec2 center;
uniform highp float radius;
uniform highp float scale;


void main()
{
   highp vec2 textureCoordinateToUse = textureCoordinate;
   highp float dist = distance(center, textureCoordinate);
   textureCoordinateToUse -= center;
   if (dist < radius)
   {
     highp float percent = 1.0 - ((radius - dist) / radius) * scale;
     percent = percent * percent;

     textureCoordinateToUse = textureCoordinateToUse * percent;
     textureCoordinateToUse += center;

     gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse );
   }

   textureCoordinateToUse += center;
   gl_FragColor = texture2D(inputImageTexture,textureCoordinate);   
}

更新SHADER代码:

highp float aspectRatio = 854.0 / 480.0;
     //highp vec2 textureCoordinateToUse = textureCoordinate;
     highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y *    aspectRatio + 0.5 - 0.5 * aspectRatio));
   highp float dist = distance(center, textureCoordinateToUse);
   textureCoordinateToUse -= center;
   if (dist < radius)
   {
     highp float percent = 1.0 - ((radius - dist) / radius) * scale;
     percent = percent * percent;

     textureCoordinateToUse = textureCoordinateToUse * percent;
     textureCoordinateToUse += center;

     gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse );
     return;
   }

   textureCoordinateToUse += center;
   gl_FragColor = texture2D(inputImageTexture,textureCoordinate); 

1 个答案:

答案 0 :(得分:1)

我看到你正试图使用​​我的凸起失真片段着色器。虽然你实际上没有问过问题,但我想我可能知道你想要什么。

如果为矩形输入纹理提供标准化0.0 - 1.0范围内的纹理坐标,则上述操作将在椭圆区域而不是圆形区域上运行。这是因为上述计算在纹理坐标空间中起作用,而不是在图像坐标空间中起作用。

要纠正此问题,您可以执行以下两项操作之一。首先,您可以提供考虑图像宽高比的纹理坐标(其中一个不是最大值为1.0)。

其次,您可以在this answer中执行操作,并将图像的纵横比作为制服输入,并使用它来校正图像的矩形特性。如果您为着色器提供了aspectRatio制服,并且图像的宽度和高度之间的比例,则可以使用

替换着色器正文中的第一行。
 highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio));

它会在一个圆形区域内运作。