【问题标题】:openGL- Drawing Grid of Quads and Manually paint themopenGL-绘制四边形网格并手动绘制它们
【发布时间】:2019-03-17 15:22:04
【问题描述】:

我正在使用 OpenGL 和 C++ 做一个简单的图像处理应用程序。 但是,有一件特别的事情我不知道该怎么做,那就是:

我需要让我的用户绘制直方图。 我想这样做的方法是为图像的每个像素强度创建一个四边形网格。示例:如果图像是 8 位,我的网格中需要 256x256 个四边形。绘制网格后,我希望用户以可以“绘制”直方图的方式以量化方式(每个四边形)手动绘制四边形。问题是我不知道如何做这些事情...... 谁能给我指导一下如何绘制网格,以及如何进行绘画。

如果您对“绘制直方图”感到困惑,请将其视为常规图。

【问题讨论】:

    标签: opengl image-processing


    【解决方案1】:

    您不必绘制四边形网格。一个四边形就足够了,然后使用着色器从存储在一维纹理中的直方图中进行采样。这是我得到的:

    顶点着色器:

    #version 450 core
    layout(std140, binding = 0) uniform view_block {
        vec2 scale, offset;
    } VIEW;
    
    layout(std140, binding = 1) uniform draw_block {
        vec4 position;
        float max_value;
    } DRAW;
    
    out gl_PerVertex {
        vec4 gl_Position;
    };
    
    void main()
    {
        ivec2 id = ivec2(gl_VertexID&1, gl_VertexID>>1);
        vec2 position = vec2(DRAW.position[id.x<<1], DRAW.position[(id.y<<1) + 1]);
        gl_Position = vec4(fma(position, VIEW.scale, VIEW.offset), 0, 1);
    }
    

    片段着色器:

    #version 450 core
    layout(std140, binding = 1) uniform draw_block {
        vec4 position;
        float max_value;
    } DRAW;
    layout(binding = 0) uniform sampler1D hist;
    layout(location = 0) out vec4 OUT;
    
    void main()
    {
        const vec2 extent = DRAW.position.zw - DRAW.position.xy;
        vec2 texcoord = (gl_FragCoord.xy - DRAW.position.xy)/(DRAW.position.zw - DRAW.position.xy);
        OUT.rgb = vec3(lessThan(texcoord.yyy*DRAW.max_value, texture(hist, texcoord.x).rgb));
        OUT.a = 1;
    }
    

    直方图纹理创建:

    image hist(256, 1, 3, type_float);
    // ... calculate the histogram ...
    
    tex.reset(glCreateTextureSN(GL_TEXTURE_1D));
    glTextureStorage1D(tex.get(), 1, GL_RGB32F, hist.w);
    glTextureSubImage1D(tex.get(), 0, 0, hist.w, GL_RGB, GL_FLOAT, hist.c[0]);
    glTextureParameteri(tex.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
    

    渲染例程:

    const vec2i vs = { glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT) };
    glViewport(0, 0, vs[0], vs[1]);
    glClear(GL_COLOR_BUFFER_BIT);
    
    struct view_block {
        vec2f scale, offset;
    } VIEW = {
        vec2f(2)/vec2f(vs), -vec2f(1)
    };
    GLbuffer view_buf(glCreateBufferStorageSN(sizeof(VIEW), &VIEW, 0));
    glBindBufferBase(GL_UNIFORM_BUFFER, 0, view_buf.get());
    
    struct draw_block {
        box2f position;
        float max_value;
    } DRAW = {
        box2f(0, 0, vs[0], vs[1]),
        max_value
    };
    GLbuffer draw_buf(glCreateBufferStorageSN(sizeof(DRAW), &DRAW, 0));
    glBindBufferBase(GL_UNIFORM_BUFFER, 1, draw_buf.get());
    
    bind_textures(tex.get());
    glBindProgramPipeline(pp.get());
    glBindVertexArray(0);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    
    glutSwapBuffers();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 2011-06-26
      • 2015-02-05
      相关资源
      最近更新 更多