通过OpenGL ES着色器进行图像处理后如何写回帧?

时间:2018-08-02 01:16:15

标签: opengl-es glsl shader

我想通过OpenGL ES着色器执行某种图像处理,例如不失真。结果需要存储回图像缓冲区,而不是显示在屏幕上。

例如,类似

的函数
def plotTimes(data):
    x = data["x"]
    y = data["y"]
    fig, axes = plt.subplots(1, data["years"], sharey=True)
    for i in range(data['years']):
        axes[i].plot(x, y)
        if i < data['years'] - 1:
            axes[i].spines['right'].set_visible(False)
        if i > 0:
            axes[i].spines['left'].set_visible(False)
            axes[i].yaxis.set_ticks_position('none')
        axes[i].set_xlim(data['boundaries'][i]['start'],data['boundaries'][i]['end'])
    plt.xticks(rotation=90)
    plt.xlabel('Date')
    plt.ylabel('5k Time')
    plt.title(data['name'])
    plt.show()

根据我的阅读,现在的过程是

  1. 将图像加载为纹理
  2. 通过着色器语言执行图像处理
  3. 将缓冲区渲染到图像

我想知道是否可以将某种图像地址传递给着色器,以使我可以直接获得经过处理的图像而无需渲染到另一幅图像。

但是,我检查了片段着色器的规格。它只有一个可变变量-gl_FragDepth。它不能用于我的目的。而且,在其他讨论中,有人说由于着色器的流水线,不可能直接在着色器中访问数据。

如果是这样,我有什么办法可以通过OpenGL ES着色器语言实现快速的图像处理?可以在不使用纹理的情况下通过着色器中的常规计算完成吗?

如果有帮助,请附上我的代码。感谢您的阅读。

第一步:将图像作为纹理加载

glesDewarp( const UINT8* image_in, UINT8* image_out);

第2步:通过着色器语言执行图像无失真

glGenTextures ( 1, g_hTextureHandle );
glBindTexture ( GL_TEXTURE_2D, g_hTextureHandle[0] );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexImage2D ( GL_TEXTURE_2D, 0, nFormat, nWidth, nHeight, 0, nFormat, GL_UNSIGNED_BYTE, pImageData );

Step3:渲染为图片

g_strVSProgram =
"#version 300 es                                                    \n"
"attribute vec4 g_vVertex;                                          \n"
"attribute vec4 g_vTexcoord;                                        \n"
"                                                                   \n"
"varying   vec4 g_vVSTexcoord;                                      \n"
"                                                                   \n"
"void main()                                                        \n"
"{                                                                  \n"
"    gl_Position  = g_vVertex;                                      \n"
"    g_vVSTexcoord = g_vTexcoord;                                   \n"
"}                                                                  \n";

g_strFSProgram =
"#version 300 es                                                    \n"
"#ifdef GL_FRAGMENT_PRECISION_HIGH                                  \n"
"   precision highp float;                                          \n"
"#else                                                              \n"
"   precision mediump float;                                        \n"
"#endif                                                             \n"
"                                                                   \n"
"uniform   sampler2D g_sImageTexture;                               \n"
"varying   vec4      g_vVSTexcoord;                                 \n"
"                                                                   \n"
"void main()                                                        \n"
"{                                                                  \n"
"    gl_FragColor = texture2D(g_sImageTexture, g_vVSTexcoord.xy);   \n"
"}                                                                  \n";

0 个答案:

没有答案