繁体   English   中英

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

[英]Android: implementing the linear magnifier in opengl es2.0

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

在OpenGL es 2.0中,还有另一种渲染方法:使用顶点和片段着色器。 因此,您只需在屏幕上渲染纹理(图像),就需要为其编写自己的片段着色器-类似于:

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

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

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

我需要一个线性放大器。

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

根本没有片段着色器的预设可用于这种类型的东西。

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

桌面GL(3.3 / 4.0 +)定义了一个称为采样器对象的对象,该对象将环绕模式和滤镜与实际纹理对象分离。 老实说,这就是它应该一直工作的方式,让纹理对象定义数据存储和采样器状态是浪费的。 不幸的是,这在OpenGL ES 2.0中不存在,因此请记住,您提到的滤镜状态与纹理对象相关,并且不是可以在着色器中以可编程方式设置的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM