我正在尝试编写简单的着色器,在基础纹理(128 * 128)上放置一些“标记”(64 * 64),以指示标记必须在哪里,我使用青色标记大小(64 * 64)基础纹理上的区域
成为
片段着色器
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”):
我试着想象它,只有像texelFetch这样的东西会帮助我,但是我无法弄明白,如何获得基本纹理青色纹理的tex tex并将其转换为get - first col / first row cyan base texel = first col /第一行标记纹理,第二行/第一行base =第二行/第一行标记。 e.t.c。
答案 0 :(得分:2)
我认为有一种方法可以在一次通过中完成此操作 - 但它涉及使用另一种能够保存下面信息的纹理。所以你要增加你的纹理内存使用量。
在这种方法中,第二个纹理(可以通过离线或某种方式对原始纹理进行后处理来生成)包含贴图的UV贴图
现在像素着色器很简单,只需查看当前纹素是否为青色,从“decal-uvmap”纹理中选取R和G,然后使用纹理坐标来对贴花纹理进行采样。
请注意,此纹理的位深度(以及它的大小)与原始纹理的大小有关,因此可以使用比原始纹理小得多的“decal-uvmap”纹理。