Cocos Creator3 简单白帧Shader在游戏中完全不显示

CCEffect %{
techniques:

  • passes:
  • vert: vs
    frag: fs
    depthStencilState:
    depthTest: false
    depthWrite: false
    blendState:
    targets:
    • blend: true
      blendSrc: src_alpha
      blendDst: one_minus_src_alpha
      rasterizerState:
      cullMode: none
      properties:
      intensity: { value: 0.5, editor: { type: slider, range: [0, 1] } }
      color: { value: [1.0, 1.0, 1.0, 1.0], editor: { type: color } }
      }%

CCProgram vs %{
precision highp float;
#include
#include

in vec3 a_position;
in vec2 a_texCoord;

out vec2 v_texCoord;

void main () {
v_texCoord = a_texCoord;
gl_Position = cc_matViewProj * cc_matWorld * vec4(a_position, 1.0);
}
}%

CCProgram fs %{
precision highp float;
#include <legacy/output>
in vec2 v_texCoord;

#pragma builtin(local)
layout(set = 2, binding = 10) uniform sampler2D cc_spriteTexture;

uniform EffectUniform {
vec4 color;
float intensity;
};

layout(___location = 0) out vec4 o_fragColor;

void main () {
vec4 texColor = texture(cc_spriteTexture, v_texCoord);

// 只混合RGB颜色,保持原始alpha不变
vec3 finalColor = mix(texColor.rgb, color.rgb, intensity);
o_fragColor = vec4(finalColor, texColor.a);
}
}%

在Editor中,能显示正常;放到游戏中,就完全不显示,全透明了。有啥可能的原因

image

我也有这个问题,只是这些bug问题太多了,习以为常了。

我哭死,不如回去用2.4。
现在这样,等于把Shader这一条路封了

3的具体版本是多少?
建议include sprite-texture.chunk,不要手动写binding。
然后3.8.x的binding应该是12。

#pragma builtin(local)
layout(set = 2, binding = 12) uniform sampler2D cc_spriteTexture;

目前3.8.5

去掉手动Binding也一样

enemyEffect.zip (788 字节)

试试这个呢?

CCProgram fs %{
  precision highp float;
  #include <legacy/output>
  #include <builtin/internal/embedded-alpha>
  in vec2 v_texCoord;

  #pragma builtin(local)
  layout(set = 2, binding = 12) uniform sampler2D cc_spriteTexture;

  uniform EffectUniform {
    vec4 color;
    float intensity;
  };

  layout(___location = 0) out vec4 o_fragColor;

  void main () {
    vec4 texColor = CCSampleWithAlphaSeparated(cc_spriteTexture, v_texCoord);
    
    // 只混合RGB颜色,保持原始alpha不变
    vec3 finalColor = mix(texColor.rgb, color.rgb, intensity);
    o_fragColor = vec4(finalColor, texColor.a);
  }
}%

一样,还是完全透明

我这很正常呀,试试这个?test.zip (21.8 KB)

image

你这是Editor中的, 进游戏中呢?


你的代码,新建一个空项目,在Editor中有这个键头
在游戏中,纯黑

我感觉就是有一个什么诡异的设置没设置对,官方又不说
@boyue

NewProject.zip (38.3 KB)

复制cocos的改不就行了

// Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.
CCEffect %{
  techniques:
  - passes:
    - vert: sprite-vs:vert
      frag: sprite-fs:frag
      depthStencilState:
        depthTest: false
        depthWrite: false
      blendState:
        targets:
        - blend: true
          blendSrc: src_alpha
          blendDst: one_minus_src_alpha
          blendDstAlpha: one_minus_src_alpha
      rasterizerState:
        cullMode: none
      properties:
        alphaThreshold: { value: 0.5 }
        intensity: { value: 0.5, editor: { type: slider, range: [0, 1] } }
        testColor: { value: [1.0, 1.0, 1.0, 1.0], editor: { type: color } }
}%

CCProgram sprite-vs %{
  precision highp float;
  #include <builtin/uniforms/cc-global>
  #if USE_LOCAL
    #include <builtin/uniforms/cc-local>
  #endif
  #if SAMPLE_FROM_RT
    #include <common/common-define>
  #endif
  in vec3 a_position;
  in vec2 a_texCoord;
  in vec4 a_color;

  out vec4 color;
  out vec2 uv0;

  vec4 vert () {
    vec4 pos = vec4(a_position, 1);

    #if USE_LOCAL
      pos = cc_matWorld * pos;
    #endif

    #if USE_PIXEL_ALIGNMENT
      pos = cc_matView * pos;
      pos.xyz = floor(pos.xyz);
      pos = cc_matProj * pos;
    #else
      pos = cc_matViewProj * pos;
    #endif

    uv0 = a_texCoord;
    #if SAMPLE_FROM_RT
      CC_HANDLE_RT_SAMPLE_FLIP(uv0);
    #endif
    color = a_color;

    return pos;
  }
}%

CCProgram sprite-fs %{
  precision highp float;
  #include <builtin/internal/embedded-alpha>
  #include <builtin/internal/alpha-test>

  in vec4 color;

  #if USE_TEXTURE
    in vec2 uv0;
    #pragma builtin(local)
    layout(set = 2, binding = 12) uniform sampler2D cc_spriteTexture;
  #endif


  uniform EffectUniform {
    vec4 testColor;
    float intensity;
  };

  vec4 frag () {
    vec4 o = vec4(1, 1, 1, 1);

    #if USE_TEXTURE
      o *= CCSampleWithAlphaSeparated(cc_spriteTexture, uv0);
      #if IS_GRAY
        float gray  = 0.2126 * o.r + 0.7152 * o.g + 0.0722 * o.b;
        o.r = o.g = o.b = gray;
      #endif
    #endif

    o *= color;

    // 只混合RGB颜色,保持原始alpha不变
    vec3 finalColor = mix(o.rgb, testColor.rgb, intensity);
    o = vec4(finalColor, o.a);

    ALPHA_TEST(o);
    return o;
  }
}%

确实有有些东西不一样 拿官方的builtin-sprite改的就能显示了

你最后改出来的是啥样的?你之前发的是不能显示的

你发的代码我试了不行。。

你什么版本?
image 应该没问题啊,我是3.8.5