2012-08-24 55 views
0

Im計算片段着色器中一個點周圍的圓。問題是紋理的變化部分不是圓,它是一個橢圓。形式實際上取決於紋理的形式。如果紋理是一個完美的正方形,我會得到一個完美的圓形,但當它的矩形我得到一個橢圓形。這是當前片段着色器:如何計算圍繞opengl中一個點的圓(紋素)

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); 
} 

UPDATE 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

而你的問題是? – Alexander

+0

你可以在你的代碼中加入一些註釋嗎?什麼是比例和百分比= 1.0 - ((半徑 - 距離)/半徑)*比例;應該代表? –

+0

問題是如何得到一個圓圈而不是橢圓。比例是1.百分比影響圓/橢圓的內容,但不是它的形式,所以不要注意它 – Sol

回答

1

我看你想用我的隆起變形片段着色器。雖然你實際上沒有問過問題,但我想我可能會在這裏知道你想要什麼。

如果您在矩形輸入紋理的規格化的0.0 - 1.0範圍內提供紋理座標,則上述操作將在橢圓區域而不是圓形區域上進行。這是因爲上述計算在紋理座標空間中工作,而不是圖像座標空間。

要糾正這個問題,你可以做兩件事之一。首先,您可以提供紋理座標來說明圖像的縱橫比(其中一個不是最大值爲1.0)。

其次,您可以按照我在this answer中所做的操作進行操作,並以圖像的縱橫比作爲均勻度,並使用它來校正圖像的矩形性質。如果提供了一種aspectRatio均勻與寬度和圖像高度之間的比率的着色,可以有

highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); 

替換在着色器的所述主體的第一行,它將的圓形區域上操作。

+0

布拉德拉爾森救援。感謝您的重播,並感謝GPUImage。正如你所說這段代碼來自凸起着色器。我用新的代碼編輯我的帖子。我得到了圓形,但是凸起效果不適用於正確的紋理座標。任何幫助?謝謝 – Sol

+0

我忘了告訴你我用屏幕上的用戶觸摸輸入中心制服。應用您的線條(當前代碼在此文章中更新)現在,凸起效果僅應用於屏幕的1乘1平方中心。所以當我觸摸屏幕的左下角時,凸起效果出現在屏幕中心的1乘1平方的左下角。非常不好的解釋,但我希望你能理解我的問題。謝謝 – Sol