繁体   English   中英

Cocos2dx OpenGl Shader二贴图问题

[英]Cocos2dx OpenGl Shader two textures problem

我的 cocos2dx 手机游戏片段着色器可在 iOS 上运行,但在 Android 上无法正常运行,我没有想法。

想法:u_texture 是我要修改其外观的精灵的输入纹理。 u_texture1 是一个具有一定透明度的“蒙版”纹理,根据其 alpha 通道,我想渲染精灵的外观有一些变化或没有变化。

我遇到的问题的最小示例:

  1. 这是“按预期方式”工作的,即在遮罩透明的地方将精灵着色为红色,在遮罩不透明的地方将其着色为黄色。
    uniform sampler2D u_texture;
    uniform sampler2D u_texture1;
    
    varying vec2 v_texCoord;
    
    varying vec2 v_resolution;
    
    void main()
    {
        vec4 maskCol=texture2D(u_texture1, v_texCoord);
        vec4 currentCol = texture2D(u_texture,v_texCoord);
        vec4 newCol = currentCol;
    
        if(maskCol.a == 0.0){
            newCol.r = 1.0;
            newCol.g = 0.0;
            newCol.b = 0.0;
            newCol.a = 1.0;
        } else {
            newCol.r = 1.0;
            newCol.g = 1.0;
            newCol.b = 0.0;
            newCol.a = 1.0;
        }
        gl_FragColor = newCol;
    }
  1. 我希望这段代码将蒙版透明的精灵着色为红色,并单独保留 rest。 但是,它不会那样做。 相反,它将 INPUT TEXTURE 透明的精灵着色为红色,并单独保留 rest。
    uniform sampler2D u_texture;
    uniform sampler2D u_texture1;

    varying vec2 v_texCoord;

    varying vec2 v_resolution;

    void main()
    {
      vec4 maskCol=texture2D(u_texture1, v_texCoord);
      vec4 currentCol = texture2D(u_texture,v_texCoord);
      vec4 newCol = currentCol;

      if(maskCol.a == 0.0){
          newCol.r = 1.0;
          newCol.g = 0.0;
          newCol.b = 0.0;
          newCol.a = 1.0;
      } 
     gl_FragColor = newCol;
 }

任何人都可以看到这段代码有什么问题吗? 除了比较 alpha 值的相等 - 这不是这里的问题,我已经检查过,但为了简单起见,我将其保留。

v_resolution有什么作用吗?

glsl 很好。

两种检查方式:

1.确保 u_texture1 是遮罩纹理。 纹理传递是否颠倒?

2.第一个glsl是正确的,因为每个newcol都有一个颜色。 但是第二个glsl没有,所以你可以直接尝试output newcol,看看结果是否符合预期?

2022-12-29

我复制了这个glsl。

右边是:

unsigned int texture1, texture2;
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glGenTextures(1, &texture2);
glBindTexture(GL_TEXTURE_2D, texture2);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

着色器是:

  vec4 maskCol=texture2D(texture2, TexCoord);
  vec4 currentCol = texture2D(texture1,TexCoord);
  vec4 newCol = currentCol;

  if(maskCol.a == 0.0){
      newCol.r = 1.0;
      newCol.g = 0.0;
      newCol.b = 0.0;
      newCol.a = 1.0;
  } 
 FragColor = newCol;

纹理 1 是:

在此处输入图像描述

纹理 2 是

在此处输入图像描述

在此处输入图像描述

错误是:

glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

也许尝试更改纹理 glTexParameteri 或其他纹理设置!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM