从渲染管线拿到的uv取值范围是不是[0-1]

creator version: 2.2.1

CCEffect %{
  techniques:
  - passes:
    - vert: vs
      frag: fs
      blendState:
        targets:
        - blend: true
      rasterizerState:
        cullMode: none
      properties:
        texture: { value: white }
        alphaThreshold: { value: 0.5 }
}%


CCProgram vs %{
  precision highp float;

  #include <cc-global>
  #include <cc-local>

  in vec3 a_position;
  in vec4 a_color;
  out vec4 v_color;

  in vec2 a_uv0;
  out vec2 v_uv0;


  void main () {
    vec4 pos = vec4(a_position, 1);

    #if CC_USE_MODEL
    pos = cc_matViewProj * cc_matWorld * pos;
    #else
    pos = cc_matViewProj * pos;
    #endif

    v_uv0 = a_uv0;

    v_color = a_color;

    gl_Position = pos;
  }
}%

CCProgram fs %{
  precision highp float;
  
  #include <alpha-test>
  #include <cc-global>

  in vec4 v_color;

  in vec2 v_uv0;
  float wave_max_height = 0.05;
  float total_offset = 0.8;
  uniform sampler2D texture;

  void main () {
    vec4 o = vec4(1.0);

    // float wave_offset = sin(v_uv0.x * 4.0 + cc_time.x * 4.0) * wave_max_height;

    // if(total_offset + wave_offset > v_uv0.y){
    //   discard;
    //   // o = vec4(v_uv0.y);
    // }
    if(v_uv0.y < 0.5){
      discard;
    }

    o *= texture(texture, v_uv0);
    o *= v_color;
   
    gl_FragColor = o;
  }
}%

上面是一份片元着色器的代码,材质贴在某些图片上,没有渲染出任何像素,最后测试发现,从渲染管线拿到的uv坐标y值始终是一个非常小的浮点值,有些图片则是符合预期显示了一半,但是去掉discard的逻辑,又可以正确的从texture映射到像素
传递到顶点着色器的a_uv0的取值范围不是[0, 1]吗,大佬们解答一下
整理了一个demo,大佬们看看有什么问题TestUV.zip (731.8 KB)

uv是0,1, uv坐标是贴图的2D坐标。
而且没看懂你这是要干嘛?

没注释掉的部分是用来测试的:丢弃掉uv坐标小于0.5的片元,结果我有一张图片一个片元也没渲染出来(或者渲染了非常少的片元,但是少的难以察觉),由此推断使用这张图片(其他图片正常)时,从渲染管线拿到的uv坐标取值范围不是[0, 1]
注释掉的部分: 是用来实现一个波浪效果,在某些图片上确实也生效了,但是就是有一张图片,因为uv坐标不是[0, 1]导致什么都没渲染
下面贴出这张图片:做的是类似传奇那样的血条,血条上部分有波浪效果

感觉可是是什么地方没写对,但是看了看没看明白

把 vertex shader 也贴出来

大佬,我贴了个demo上来
顶点着色器就是默认的那个

CCEffect %{
  techniques:
  - passes:
    - vert: vs
      frag: fs
      blendState:
        targets:
        - blend: true
      rasterizerState:
        cullMode: none
      properties:
        texture: { value: white }
        alphaThreshold: { value: 0.5 }
}%


CCProgram vs %{
  precision highp float;

  #include <cc-global>
  #include <cc-local>

  in vec3 a_position;
  in vec4 a_color;
  out vec4 v_color;

  in vec2 a_uv0;
  out vec2 v_uv0;


  void main () {
    vec4 pos = vec4(a_position, 1);

    #if CC_USE_MODEL
    pos = cc_matViewProj * cc_matWorld * pos;
    #else
    pos = cc_matViewProj * pos;
    #endif

    v_uv0 = a_uv0;

    v_color = a_color;

    gl_Position = pos;
  }
}%

人工置顶:joy:

大佬shader和demo都贴上来了

看下是不是动态图集的锅

1赞

楼上说的对

感谢感谢,确实是动态图集的造成的,今天刚好看到一个大佬的帖子看到他专门描述了这个问题

官方不将真正的frameRect传入道material中,应该是因为动态图集dc合并的原因,但是有的时候,确实有这个需求。直接关闭动态图集对开发来说又很不友好,为什么不能定义个宏来解决这个问题。

1赞