0

我正在尝试编写简单的着色器在基础纹理(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 坐标并将其转换为 - 第一个 col/第一行 青色 base texel = first col/first行标记纹素,第二列/第一行基数 = 第二列/第一行标记。ETC

4

1 回答 1

2

我认为有一种方法可以一次性完成 - 但它涉及使用另一个能够保存下面提供的信息的纹理。因此,您将增加纹理内存使用量。

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

  1. R = 距青色方块左侧的归一化距离
  2. G = 到青色方块顶部的归一化距离
  3. B = 不在乎

现在像素着色器很简单,它需要做的就是查看当前纹理像素是否为青色,从“decal-uvmap”纹理中选择 R 和 G,并使用它们作为纹理坐标来对贴花纹理进行采样。

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

于 2012-08-10T19:59:27.487 回答