Android 在GLSL中混合不同大小/坐标的纹理

Android 在GLSL中混合不同大小/坐标的纹理,android,opengl-es,opengl-es-2.0,blending,Android,Opengl Es,Opengl Es 2.0,Blending,如果在片段着色器中混合两个不同大小的纹理,是否可以将纹理映射到不同的坐标 例如,如果混合来自以下两个图像的纹理: 使用以下着色器: // Vertex shader uniform mat4 uMVPMatrix; attribute vec4 vPosition; attribute vec2 aTexcoord; varying vec2 vTexcoord; void main() { gl_Posi

如果在片段着色器中混合两个不同大小的纹理,是否可以将纹理映射到不同的坐标

例如,如果混合来自以下两个图像的纹理:

使用以下着色器:

      // Vertex shader
      uniform mat4 uMVPMatrix;
      attribute vec4 vPosition;
      attribute vec2 aTexcoord;
      varying vec2 vTexcoord;
      void main() {
        gl_Position = uMVPMatrix * vPosition;
        vTexcoord = aTexcoord;
      }

      // Fragment shader
      uniform sampler2D uContTexSampler;
      uniform sampler2D uMaskTextSampler;
      varying vec2 vTexcoord;
      void main() {
        vec4 mask = texture2D(uMaskTextSampler, vTexcoord);
        vec4 text = texture2D(uContTexSampler, vTexcoord);
        gl_FragColor = vec4(text.r * mask.r), text.g * mask.r, text.b * mask.r, text.a * mask.r); 
      }
(片段着色器使用第二个纹理替换黑白遮罩的空白)

由于两个纹理使用相同的gl_位置和坐标(1.0f、1.0f、1.0f、0.0f、0.0f、1.0f、0.0f、0.0f),因此两个纹理都会映射到视图中的相同坐标:

但是,我的目标是保持原始纹理比率:

我希望在着色器中实现这一点,而不是
glBlendFunc
glBlendFuncSeparate
,以便为混合创建自己的值


是否有办法在GLSL内实现这一点?我有一种感觉,我为不同位置坐标混合纹理顶点的方法被设计打破了…

这确实是可能的,但您需要为遮罩纹理坐标获得2D比例向量。我建议您在CPU上计算这些,并通过“统一”将它们发送到着色器,另一种方法是按顶点或甚至每个片段计算它们,但您仍然需要将图像尺寸传递到着色器中,因此只需在CPU上执行此操作并添加统一


要得到那个比例向量,你需要一点简单的数学知识。您要做的是尊重遮罩比率,但缩放它,使两个缩放坐标中的一个是
1.0
,另一个是
很棒,谢谢!这让我走上了正确的轨道-使用vec2变量进行缩放变得很容易,现在我正在管理遮罩的位置。哦,是的,我忘记了那个部分,你现在把它放在左边了。。。你需要使它正常化。让我来编辑。试试这个编辑,我希望它是正确的。。。不要改变位置,这些位置应该与目标相同。还请注意,您可以在顶点着色器中进行缩放,并在片段着色器中为遮罩添加另一个纹理坐标。@MaticOblak只是想说声谢谢。这是我发现的在片段着色器中处理大小/位置的最有用的帖子。我在一个系统中工作,我只能访问frags(没有顶点或无关的openGL方法),这些信息救了我的命。
vec4 mask = texture2D(uMaskTextSampler, vTexcoord* scaleVector);
    float imageWidth;
    float imageHeight;
    float maskWidth;
    float maskHeight;

    float imageRatio = imageWidth/imageHeight;
    float maskRatio = maskWidth/maskHeight;

    float scaleX, scaleY;

    if(imageRatio/maskRatio > 1.0f) {
        //x will be 1.0
        scaleX = 1.0f;
        scaleY = 1.0f/(imageRatio/maskRatio);
    }
    else {
        //y will be 1.0
        scaleX = imageRatio/maskRatio;
        scaleY = 1.0f;
    }
vec2 fromCentre = vTexcoord-vec2(.5,.5);
vec2 scaledFromCenter = fromCenter*scaleVector;
vec2 resultCoordinate = vec2(.5,.5) + scaledFromCenter;