我想通过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()
根据我的阅读,现在的过程是
我想知道是否可以将某种图像地址传递给着色器,以使我可以直接获得经过处理的图像而无需渲染到另一幅图像。
但是,我检查了片段着色器的规格。它只有一个可变变量-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";