找到纹理的特定强度点-OpenTK

时间:2019-08-21 05:08:34

标签: c# glsl shader fragment-shader opentk

借助此link,我可以更改整个纹理的强度。现在,我要检测纹理上强度大于0.7的所有点。我该如何实现?

private void CreateShaders()
{
    /***********Vert Shader********************/
    vertShader = GL.CreateShader(ShaderType.VertexShader);
    GL.ShaderSource(vertShader, @"
        attribute vec3 a_position;
        varying vec2 vTexCoord;
        void main() {
            vTexCoord = (a_position.xy + 1) / 2;
            gl_Position = vec4(a_position,1);
        }");
    GL.CompileShader(vertShader);

    /***********Frag Shader ****************/
    fragShader = GL.CreateShader(ShaderType.FragmentShader);
    GL.ShaderSource(fragShader, @"
        precision highp float;
        uniform sampler2D sTexture;
        varying vec2 vTexCoord;
        const float Epsilon = 1e-10;

        //RGBtoHSV
        //HSVtoRGB

        void main ()
        {
            vec4  color = texture2D (sTexture, vTexCoord);
            float u_saturate=0.7;
            vec3 col_hsv = RGBtoHSV(color.rgb);
            col_hsv.z *= (u_saturate * 2.0);
            vec3 col_rgb = HSVtoRGB(col_hsv.rgb);
            gl_FragColor = vec4(col_rgb.rgb, color.a);
        }");
    GL.CompileShader(fragShader);
}

1 个答案:

答案 0 :(得分:0)

将强度与阈值进行比较,并根据强度使用不同的颜色:

gl_FragColor = intensity > 0.7 ? colorH : vec4(col_rgb.rgb, color.a);  

片段着色器main可能看起来像这样:

void main ()
{
    vec4  color = texture2D (sTexture, vTexCoord);
    float u_saturate=0.7;

    vec3  col_hsv = RGBtoHSV(color.rgb);
    float intensity = col_hsv.z;

    col_hsv.z *= (u_saturate * 2.0);
    vec3 col_rgb = HSVtoRGB(col_hsv.rgb);   

    vec4 colorH = vec4(0.0, 0.0, 0.0, 1.0);
    gl_FragColor = intensity > 0.7 ? colorH : vec4(col_rgb.rgb, color.a);
}