Android:在opengl es2.0中实现线性放大镜

时间:2013-11-02 14:34:11

标签: android image-processing opengl-es

在OpenGL 1.x中,您可以简单地将纹理附加到顶点的四边形以显示图像,使用线性放大镜参数,您可以将纹理拉伸或最小化为像素的大小,而不会“看到”它“像素化”。

在OpenGL es 2.0中,还有另一种渲染方法:使用顶点和片段着色器。 所以你只需要在屏幕上渲染一个纹理(图像)就可以为它编写自己的片段着色器 - 例如:

uniform sampler2D texture;
varying vec2 point; // coming from the vertex 

void main () {
   gl_fragColor(texture2D(texture, point));
}

这里的问题是发生的放大镜类型是最近的一种。它取变量“point”指向的最近像素的值。

我需要线性放大镜。

我的问题是:我如何在代码方面实现这样的事情? 或者我从一开始就做错了什么?

根本没有片段着色器的预设用于此类事物。

1 个答案:

答案 0 :(得分:0)

片段着色器中没有预设,因为它使用与固定功能管道相同的状态。 sampler2D制服是可编程管道中纹理单元的接口,当您在ES 2.0中对绑定到纹理单元的纹理进行采样时,包裹状态,滤镜模式等都取自纹理对象目前已受约束。您可以像在ES 1.0中一样设置这些状态。你是不正确的,你不能在片段或顶点着色器中更改它们,但你不需要,只需将纹理对象与适当的状态绑定。

Desktop GL(3.3 / 4.0 +)定义了一个称为采样器对象的东西,它将包装模式和滤镜与实际纹理对象分离。老实说,这应该是它应该一直工作的方式,让纹理对象定义数据存储和采样器状态都是浪费。不幸的是,这在OpenGL ES 2.0中并不存在,所以请记住,你提到的过滤器状态与纹理对象有关,而不是你可以在着色器中以可编程方式设置的。