我在片段着色器中计算一个圆周围的圆。问题是变化的纹理部分不是圆形,而是椭圆形。形式实际上取决于纹理的形状。如果纹理是一个完美的正方形,我会得到一个完美的圆形但是当它是一个矩形时我得到一个椭圆形。这是当前的片段着色器:
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);
答案 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));
它会在一个圆形区域内运作。