OpenGL着色过滤器

时间:2011-04-22 18:59:41

标签: opengl colors filter

我有一个用灰度渐变渲染的开放式GL四边形。我想通过应用过滤器来着色它,例如:

如果color = 0,0,0,则将颜色设置为255,255,255
如果color = 0,0,1,则将颜色设置为255,255,254
等,或我决定的一些方案。

请注意我在灰度级中执行此操作的原因,因为我使用的算法设计为以灰度绘制然后着色,因为颜色可能无法立即知道。

这与java LookupOp http://download.oracle.com/javase/6/docs/api/java/awt/image/LookupOp.html类似。

有没有办法在openGL中执行此操作?

感谢,
杰夫

1 个答案:

答案 0 :(得分:3)

您可以将灰度渐变中的这些颜色解释为1-D纹理坐标,然后将查找表指定为1-D纹理。这似乎适合你的情况。

或者,您可以使用片段程序(着色器)对各个像素执行任意颜色转换。


更多解释:什么是纹理?概念上,纹理是某种查找功能,顶部有一些额外的逻辑。

2-D纹理对于[0,0] - [1,1]范围内的任何坐标对(s,t)或(x,y)产生特定颜色(RGB,RGBA) ,L,无论如何)。此外,它还有一些像翘曲或过滤的设置 在下面,纹理由给定“密度”的离散数据描述 - 可能是16x16,也许是256x512。过滤过程可以为[0,0]和[1,1]之间的任何实数指定颜色(通过混合/插入相邻纹素或仅取最近的纹素)。

1-D纹理是相同的,只是它将单个实际值映射到颜色。因此,可以将其视为特定类型的“查找表”。您可以认为它相当于基于1xN图像的二维纹理。

如果您有灰度渐变,则可以通过将渐变值视为颜色来直接渲染它 - 或者您可以将其视为纹理坐标(=查找表中的索引)并将1-D纹理用于任意颜色色彩空间转换。

您只需要将渐变值(从0..255范围)转换为[0..1]纹理索引范围。我推荐像out = (in+0.5)/256.0这样的东西。 0.5表示半纹素偏移,因为我们想要指向纹理元素的中间(纹理内部的值),而不是指向2个值之间的角落。

要仅从查找表(= 1-D纹理)中获取完全 RGB值,还要将纹理过滤器设置为GL_NEAREST

BTW:请注意,如果你已经需要另一个纹理来绘制渐变,那么它会变得有点复杂,因为你想要将从一个纹理接收的值视为另一个纹理的坐标 - 我相信你d需要像素着色器。并不是着色器很复杂或任何东西......当你学习基础知识时它们非常方便。