Проекция не работает при вырезании определенной области сверху и снизу элемента управления openGL - PullRequest
1 голос
/ 03 июля 2019

С помощью этой ссылки я могу применить проекцию к моей текстуре. Теперь я хочу вырезать / удалить одинаковую область сверху и снизу моего glcontrol, а затем применить ту же проекцию к оставшейся области. Я пытался, как показано ниже. Но, как показано на рисунке, верхняя и нижняя кривая отсутствует на проекции. Как я могу вернуть его в оставшуюся область?

precision highp float;
uniform sampler2D sTexture;
varying vec2 vTexCoord;
void main()
{
    float img_h_px  = 432.0; // height of the image in pixel
    float area_h_px = 39.0;  // area height in pixel

    float w = area_h_px/img_h_px;
    if (vTexCoord.y < w || vTexCoord.y > (1.0-w)){
        gl_FragColor= vec4(1.0,0.0,1.0,1.0);
    }
    else
    {
        vec2  pos     = vTexCoord.xy * 2.0 - 1.0;
        float b       = 0.5;
        float v_scale = (1.0 + b) / (1.0 + b * sqrt(1.0 - pos.x*pos.x));

        float u = asin( pos.x ) / 3.1415 + 0.5;
        float v = (pos.y * v_scale) * 0.5 + 0.5;
        if ( v < 0.0 || v > 1.0 )
            discard;

        vec3 texColor = texture2D( u_texture, vec2(u, v) ).rgb;
        gl_FragColor  = vec4( texColor.rgb, 1.0 );
    }    
}

1 Ответ

1 голос
/ 03 июля 2019

Размер нижней и верхней области (сумма нижней и верхней области) относительно размера элемента управления составляет 2.0*area_h_px/img_h_px = 2.0*w.Соотношение (h_ratio) размера элемента управления и «видимой» области:

float w = area_h_px/img_h_px;
float h_ratio = 1.0 - 2.0*w;

Вы должны масштабировать координату y для поиска текстуры по соотношению «видимой» области иразмер элемента управления, это обратное значение h_ratio (1.0/h_ratio):

float v = (pos.y * v_scale / h_ratio) * 0.5 + 0.5;

Конечный шейдер:

precision highp float;
uniform sampler2D sTexture;
varying vec2 vTexCoord;

void main()
{
    float img_h_px  = 432.0; // height of the image in pixel
    float area_h_px = 39.0;  // area height in pixel
    float w = area_h_px/img_h_px;
    float h_ratio = 1.0 - 2.0*w;

    vec2  pos     = vTexCoord.xy * 2.0 - 1.0;
    float b       = 0.5;
    float v_scale = (1.0 + b) / (1.0 + b * sqrt(1.0 - pos.x*pos.x));

    float u = asin(pos.x) / 3.1415 + 0.5;
    float v = (pos.y * v_scale / h_ratio) * 0.5 + 0.5;

    vec3 texColor = texture2D(sTexture, vec2(u, v)).rgb;

    vec4 color = vec4(texColor.rgb, 1.0);
    if (vTexCoord.y < w || vTexCoord.y > (1.0-w))
        color = vec4(1.0, 0.0, 1.0, 1.0);
    else if (v < 0.0 || v > 1.0)
        discard;

    gl_FragColor = color; 
}

Если вы хотите подкрасить всю область вфиолетовый, тогда вам нужно установить color вместо discard ing фрагментов:

if (v < 0.0 || v > 1.0)
    color = vec4(1.0, 0.0, 1.0, 1.0);
...