【发布时间】:2012-08-07 21:46:16
【问题描述】:
我正在尝试编写简单的着色器在基础纹理(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/第一行青色基本纹素 = first col/第一行标记纹素,第二列/第一行基数=第二列/第一行标记。等等
【问题讨论】:
-
如果您有“标记”的图像坐标,为什么不能简单地调整“T”纹理的纹理坐标(和寻址模式),使其位于正确的位置?你使用的几何只是一个四边形,对吧?
-
是的,只是四边形,你的意思是改变 vv_mark_tex 坐标?那么寻址模式呢? “T”是不同的纹理我必须把它放在青色区域,我不知道青色区域的纹理位置只知道它与标记的大小相同。
-
让我简化一下我的问题 - 你知道青色矩形的像素/图像坐标吗?
-
不,青色区域可以位于基础纹理上适合的任何位置 - 右上角、中心、左下角等。整个过程是关于编写一个着色器,该着色器使用一些彩色区域来确定标记的位置(贴花)。我可以为此使用一些制服,但情况不同。理论上 - 艺术家使用这些颜色区域在精灵上放置各种贴花,因此它们可以自定义。
-
您无法通过这种方式解决此问题,因为像素着色器是并行调用的,并且每个实例都无法知道它们相对于青色方块的位置。每个像素着色器拥有的唯一图像空间信息是当前(变化的)texcoords,它相对于纹理的左上角。您是否愿意接受多通道方法或涉及一些纹理预处理的方法?这适用于移动设备还是 PC?