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

Opengl GLSL-将贴花纹理放入带有颜色指示的基础纹理中,opengl,glsl,shader,Opengl,Glsl,Shader,我正在尝试编写简单的着色器,在基础纹理(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

我正在尝试编写简单的着色器,在基础纹理(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;
}
当然,它不能像它应该的那样工作,我得到了这样的东西(transperity仅用于演示,没有青色区域,只有一块“T”):


我试图找出它,只有像texelFetch这样的东西会帮助我,但我不知道如何获得基本纹理青色texel的tex坐标,并将其转换为-first col/first row cyan base texel=first col/first row mark texel,second col/first row base=second col/第一行标记。e、 t.c.

我认为有一种方法可以在一次传递中实现这一点,但它需要使用另一种能够保存以下信息的纹理。所以你要增加你的纹理记忆使用

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

  • R=青色正方形左侧的标准化距离
  • G=距青色正方形顶部的标准化距离
  • B=不在乎
  • 现在像素着色器很简单,只需查看当前纹理是否为青色,从“贴花uvmap”纹理中拾取R和G,并将其用作纹理坐标来采样贴花纹理


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

    如果您有“标记”的图像坐标,为什么不能简单地调整“t”的纹理坐标(和寻址模式)纹理使其位于正确的位置?你使用的几何体只是一个四边形,对吗?是的,就是四边形,你是说改变vv_mark_tex坐标?那么寻址方式呢?“T”是不同的纹理,我必须把它放在青色区域,我不知道青色区域纹理的位置,只知道它与mark的大小相同。让我简化我的问题-你知道青色矩形的像素/图像坐标吗?不,青色区域可以在它适合的基础纹理的任何位置-右上角,中心,左下角等等。整个事情是关于编写一个着色器,它使用一些彩色区域来确定标记(贴花)的位置。我可以用一些制服,但情况不同。从理论上讲,艺术家使用这些颜色区域在精灵上放置各种贴花,因此这些贴花可以自定义。这种方法无法解决此问题,因为像素着色器是并行调用的,每个实例都无法知道它们相对于青色正方形的位置。每个像素着色器仅有的图像空间信息是相对于纹理左上角的当前(变化)纹理坐标。您是否愿意采用多通道方法或涉及一些纹理预处理的方法?这是针对手机还是个人电脑?