有没有大佬帮忙 改下这个shader 这个是以前2.x版本的 想在3.8版本用

https://juejin.cn/post/7116064934789644302?searchId=20250724234852E5E2E0847D33F48D874A 这个是2.x版本 新人实在看不懂这个shader语法 也尝试了用augment等ai工具 但一直报错 有偿 能力有限 可以请大佬吃个猪脚饭 ! :sob:

1赞

// Copyright © 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 }

      pianyix: { value: 0.48 }

      pianyiy: { value: 0.8 }

      dy: { value: 0.0 }

}%

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>

uniform NumasConstant {

float pianyix;

float pianyiy;

float dy;

};

in vec4 color;

in vec2 uv0;

#pragma builtin(local)

layout(set = 2, binding = 12) uniform sampler2D cc_spriteTexture;

vec4 frag () {

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

// 目标,重新计算 v_uv0 中的采样位置即可

vec2 uv = vec2(uv0.x, uv0.y);

if(uv.x <= 0.5) {

    // 左侧边界的直线方程为 y = pianyiy- (pianyiy/pianyix)*x; pianyix 取值范围为 (0, 0.5) pianyiy 取值范围为 (0, 正无穷)

    // 计算当前渲染点对应左侧路边缘(直线)的值 s0

   float s0 = - pianyix/pianyiy *uv.y + pianyix;

   if(uv.x < s0) {

       uv.x = 0.0;

    }else{

       uv.x = 0.5 * (uv.x - s0)/(0.5 - s0);

    }

}else{

    // 右侧边界的直线方程为 x = (1-pianyix) + pianyix*y/pianyiy

   float s0 = 1.0 - pianyix + uv.y * pianyix/pianyiy;

   if(uv.x > s0) {

       uv.x = 1.0;

    }else{

       uv.x = 0.5 * (s0 - uv.x)/(s0 - 0.5);

    }

}

if(uv.x == 1.0||uv.x == 0.0){

  o.a = 0.0;

}

// 计算 v

// 保持 v 采样空间在 [0, 1]

uv.y = uv.y - dy;

if(uv.y <= 0.0) {

   uv.y += 1.0;

}

o *= CCSampleWithAlphaSeparated(cc_spriteTexture, uv);

#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

o *= color;

ALPHA_TEST(o);

return o;

}

}%

记得去掉图片的Packable选项

1赞