GLSL - 将贴花纹理放入带有颜色指示的基础纹理中

时间:2012-08-10 14:54:01

标签: opengl glsl shader

我正在尝试编写简单的着色器,在基础纹理(128 * 128)上放置一些“标记”(64 * 64),以指示标记必须在哪里,我使用青色标记大小(64 * 64)基础纹理上的区域  base image
 mark image
 成为
 desired result

片段着色器

precision lowp float;

uniform sampler2D us_base_tex;
uniform sampler2D us_mark_tex;

varying vec2 vv_base_tex;
varying vec2 vv_mark_tex;

const vec4 c_mark_col = vec4(0.0, 1.0, 1.0, 1.0);//CYAN

void main()
{
 vec4 base_col = texture2D(us_base_tex, vv_base_tex);

if(base_col == c_mark_col)
{
 vec4 mark_col = texture2D(us_mark_tex, vv_mark_tex);//texelFetch magic overhere must be
 base_col = mix(base_col, mark_col, mark_col.a);
}
 gl_FragColor = base_col;
}

当然,它不能正常工作,我得到这样的东西(仅用于演示的变换,没有青色区域,只有一块“T”):
problem

我试着想象它,只有像texelFetch这样的东西会帮助我,但是我无法弄明白,如何获得基本纹理青色纹理的tex tex并将其转换为get - first col / first row cyan base texel = first col /第一行标记纹理,第二行/第一行base =第二行/第一行标记。 e.t.c。

1 个答案:

答案 0 :(得分:2)

我认为有一种方法可以在一次通过中完成此操作 - 但它涉及使用另一种能够保存下面信息的纹理。所以你要增加你的纹理内存使用量。

在这种方法中,第二个纹理(可以通过离线或某种方式对原始纹理进行后处理来生成)包含贴图的UV贴图

  1. R =青色方块左侧的归一化距离
  2. G =距青色方块顶部的归一化距离
  3. B =不在乎
  4. 现在像素着色器很简单,只需查看当前纹素是否为青色,从“decal-uvmap”纹理中选取R和G,然后使用纹理坐标来对贴花纹理进行采样。

    请注意,此纹理的位深度(以及它的大小)与原始纹理的大小有关,因此可以使用比原始纹理小得多的“decal-uvmap”纹理。