傻瓜式调用阿里云的接口进行三要素(姓名、手机号和身份证号)校验

news2024/12/27 3:53:07

傻瓜式调用阿里云的接口进行三要素(姓名、手机号和身份证号)校验

  • 一、准备
    • 1、购买阿里云的三要素核验套餐包
    • 2、申请开通三要素一致性核验
    • 3、查看AccessKey
  • 二、调用三要素核验接口
    • 1、查看接口文档
    • 2、查看阿里云的调用示例
    • 3、阿里云完整示例代码
    • 4、改造后的示例代码
    • 5、响应示例
  • 三、工具类
    • 1、请求参数dto
    • 2、枚举类
    • 3、调用接口的工具类(关键是这个)

一、准备

1、购买阿里云的三要素核验套餐包

根据你的业务量选择购买

在这里插入图片描述

地址:

https://www.aliyun.com/product/dytns/

2、申请开通三要素一致性核验

调用三要素校验的接口需要授权ID,到号码百科这一功能的标签广场申请

在这里插入图片描述

我这里已经申请通过了,点击“立即使用”可跳转查看授权ID

在这里插入图片描述

3、查看AccessKey

目前调用过的阿里云的接口都需要“AccessKey ID”和“AccessKey Secret”,登录阿里云后,点击头像“AccessKey管理”

在这里插入图片描述

如果有多组,任意拿一组就行了。

在这里插入图片描述

二、调用三要素核验接口

1、查看接口文档

在这里插入图片描述

在这里插入图片描述

地址:

https://help.aliyun.com/zh/cpns/developer-reference/api-dytnsapi-2020-02-17-threeelementsverification?spm=a2c4g.11186623.4.6.5ca451cdWl3z2V&scm=20140722.H_433414._.ID_433414-OR_rec-V_1

2、查看阿里云的调用示例

点击文档右边的调试可进入阿里云的调试页

在这里插入图片描述

代码示例在“SDK示例-Java”
在这里插入图片描述

也可以下载完整工程

3、阿里云完整示例代码

在使用之前先导入三要素核验的依赖

<dependency>
	<groupId>com.aliyun</groupId>
	<artifactId>dytnsapi20200217</artifactId>
	<version>2.1.0</version>
</dependency>

代码如下:

// This file is auto-generated, don't edit it. Thanks.
package com.aliyun.sample;

import com.aliyun.tea.*;

public class Sample {

    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.dytnsapi20200217.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // 必填,您的 AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 必填,您的 AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // Endpoint 请参考 https://api.aliyun.com/product/Dytnsapi
        config.endpoint = "dytnsapi.aliyuncs.com";
        return new com.aliyun.dytnsapi20200217.Client(config);
    }

    public static void main(String[] args_) throws Exception {
        java.util.List<String> args = java.util.Arrays.asList(args_);
        // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
        com.aliyun.dytnsapi20200217.Client client = Sample.createClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        com.aliyun.dytnsapi20200217.models.ThreeElementsVerificationRequest threeElementsVerificationRequest = new com.aliyun.dytnsapi20200217.models.ThreeElementsVerificationRequest();
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.threeElementsVerificationWithOptions(threeElementsVerificationRequest, runtime);
        } catch (TeaException error) {
            // 如有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
        }        
    }
}

4、改造后的示例代码

这只是一个代码片段,完整的代码在工具类那里

public static void main(String[] args) throws Exception{
    ThreeElementIdentifyRequestParam param = new ThreeElementIdentifyRequestParam();

    param.setAccessKeyId("你的AccessKey ID");
    param.setAccessSecret("你的AccessKey Secret");

    param.setAuthCode("你的授权ID");
    param.setMask("你的加密方式");
    param.setInputNumber("你的手机号码");
    param.setCertCode("你的身份证号码");
    param.setName("你的名字");

    threeElementIdentify(param);
}

5、响应示例

{
	"headers": {
		"access-control-allow-origin": "*",
		"date": "Mon, 23 Oct 2023 10:11:26 GMT",
		"content-length": "137",
		"keep-alive": "timeout=25",
		"x-acs-request-id": "35266210-AB31-5E73-88AC-509C5F0B3E79",
		"connection": "keep-alive",
		"content-type": "application/json;charset=utf-8",
		"etag": "1mfbFqXYsVtweJZ6OSyCWpg9",
		"access-control-expose-headers": "*",
		"x-acs-trace-id": "fa79554ca5ea3ffc8a613a0f85426a8d"
	},
	"body": {
		"code": "OK",
		"data": {
			"basicCarrier": "中国移动",
			"isConsistent": 1
		},
		"requestId": "35266210-AB31-5E73-88AC-509C5F0B3E79",
		"message": "OK"
	},
	"statusCode": 200
}

三、工具类

1、请求参数dto

因为我还有调用其他接口,所以把公共的参数抽取出来了,可以和三要素核验的参数放一起。

package org.jeecg.modules.aliyun.dto;

import lombok.Data;

/**
 * 阿里云公共请求参数
 *
 * @author:user
 * @date: 2022-09-05 10:38
 */
@Data
public class AliyunConfig {
    //阿里云accessKeyId
    private String accessKeyId;

    //阿里云accessSecret
    private String accessSecret;

    //阿里云识别身份证的regionId,设置请求参数的方法有横线,似乎废弃了
    private String regionId;
}

package org.jeecg.modules.aliyun.dto;

import lombok.Data;

/**
 * 三要素(姓名、手机号和身份证号)识别请求参数dto
 *
 * @author:gan
 * @date: 2023-09-25 09:44
 */
@Data
public class ThreeElementIdentifyRequestParam extends AliyunConfig {
	//阿里云三要素核验授权码。
    private String AuthCode;

    /*
    待检验的号码。
        若Mask取值为NORMAL,该字段为明文。
        若Mask取值为MD5,请将该字段做MD5加密。
        若Mask取值为SHA256,请将该字段做SHA256加密。
     */
    private String InputNumber;

    /*
    加密方式。取值:
        NORMAL:不加密
        MD5
        SHA256
     */
    private String Mask;

    /*
    待核验的身份证号。
        若Mask取值为NORMAL,该字段为明文。
        若Mask取值为MD5,请将该字段做MD5加密。
        若Mask取值为SHA256,请将该字段做SHA256加密。
     */
    private String CertCode;

    /*
     待核验的姓名。
        若Mask取值为NORMAL,该字段为明文。
        若Mask取值为MD5,请将该字段做MD5加密。
        若Mask取值为SHA256,请将该字段做SHA256加密。
     */
    private String Name;
}

2、枚举类

加密方式枚举类

package org.jeecg.modules.aliyun.enums;

/**
 * 姓名、身份证、手机号码三要素校验加密方式枚举类
 *
 * @author:gan
 * @date: 2023-10-24 09:41
 */
public enum ThreeElementIdentifyMaskEnum {
    NORMAL("NORMAL", "不加密"),
    MD5("MD5", "MD5加密"),
    SHA256("SHA256", "SHA256加密");

    private String code;
    private String desc;

    ThreeElementIdentifyMaskEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public static String getDesc(String code) {
        for (ThreeElementIdentifyMaskEnum value : ThreeElementIdentifyMaskEnum.values()) {
            if (value.code.equals(code))
                return value.desc;
        }
        throw new RuntimeException("未知加密方式:" + code);
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

错误码枚举类,错误码在返回结果中是英文的,详情如下:

在这里插入图片描述

这个枚举类是为了返回中文提示

package org.jeecg.modules.aliyun.enums;

/**
 * 姓名、身份证、手机号码三要素校验三要素错误码枚举类
 *
 * @author:gan
 * @date: 2023-10-24 09:41
 */
public enum ThreeElementIdentifyErrorCodeEnum {
    OperatorLimit("200", "OperatorLimit", "该号码受运营商限制"),
    MobileNumberIllegal("400", "MobileNumberIllegal", "手机号码格式错误"),
    EncyrptTypeIllegal("400", "EncyrptTypeIllegal", "手机号加密类型非法"),
    CarrierIllegal("400", "CarrierIllegal", "运营商类型非法"),
    CertCodeIllegal("400", "CertCodeIllegal", "身份证号码格式错误"),
    MobileNumberTypeNotMatch("400", "MobileNumberTypeNotMatch", "号码与号码类型不匹配"),
    AuthCodeNotExist("400", "AuthCodeNotExist", "该标签申请单不存在,请重新更换授权码"),
    Unknown("500", "Unknown", "未知异常"),
    SystemError("500", "SystemError", "系统异常");

    private String status;  //HTTP状态
    private String code;  //错误码
    private String desc;  //错误描述

    ThreeElementIdentifyErrorCodeEnum(String status, String code, String desc) {
        this.status = status;
        this.code = code;
        this.desc = desc;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public static String getDesc(String code) {
        for (ThreeElementIdentifyErrorCodeEnum value : ThreeElementIdentifyErrorCodeEnum.values()) {
            if (value.code.equals(code))
                return value.desc;
        }
        throw new RuntimeException("未知验证结果错误码:" + code);
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

验证结果状态枚举类

package org.jeecg.modules.aliyun.enums;

/**
 * 姓名、身份证、手机号码三要素校验返回验证结果状态枚举类
 *
 * @author:gan
 * @date: 2023-10-24 09:41
 */
public enum ThreeElementIdentifyConsistentEnum {
    STATUS_0("0", "不一致"),
    STATUS_1("1", "一致"),
    STATUS_2("2", "查无");

    private String status;
    private String desc;

    ThreeElementIdentifyConsistentEnum(String status, String desc) {
        this.status = status;
        this.desc = desc;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public static String getDesc(String status) {
        for (ThreeElementIdentifyConsistentEnum value : ThreeElementIdentifyConsistentEnum.values()) {
            if (value.status.equals(status))
                return value.desc;
        }
        throw new RuntimeException("未知验证结果状态:" + status);
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

3、调用接口的工具类(关键是这个)

其中“VerifyUtil”是校验空参的工具类,放在这篇博客里面了,也可以用自己的方法校验。

package org.jeecg.modules.aliyun.utils;

import com.alibaba.fastjson.JSONObject;
import com.aliyun.dytnsapi20200217.models.ThreeElementsVerificationRequest;
import com.aliyun.dytnsapi20200217.models.ThreeElementsVerificationResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.tea.TeaModel;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.google.gson.Gson;
import org.jeecg.common.util.VerifyUtil;
import org.jeecg.modules.aliyun.dto.AliyunConfig;
import org.jeecg.modules.aliyun.dto.ThreeElementIdentifyRequestParam;
import org.jeecg.modules.aliyun.enums.ThreeElementIdentifyConsistentEnum;
import org.jeecg.modules.aliyun.enums.ThreeElementIdentifyErrorCodeEnum;

import java.util.Arrays;
import java.util.List;

/**
 * 阿里云工具类
 *
 * @author:user
 * @date: 2022-09-02 16:36
 */
public class AliyunUtil {
    public static void main(String[] args) throws Exception{
        ThreeElementIdentifyRequestParam param = new ThreeElementIdentifyRequestParam();

        param.setAccessKeyId("你的AccessKey ID");
        param.setAccessSecret("你的AccessKey Secret");

        param.setAuthCode("你的授权ID");
        param.setMask("你的加密方式");
        param.setInputNumber("你的手机号码");
        param.setCertCode("你的身份证号码");
        param.setName("你的名字");

        threeElementIdentify(param);
    }

    /**
     * 获取阿里云的公共Client(核验信息)
     * @param param 阿里云公共配置
     * @return
     * @throws Exception
     */
    private static com.aliyun.dytnsapi20200217.Client getVerifyClient(AliyunConfig param) throws Exception {
        //这是阿里云案例代码中拿过来的
        Config  config = new Config ();
        config.setAccessKeyId(param.getAccessKeyId());
        config.setAccessKeySecret(param.getAccessSecret());

        return new com.aliyun.dytnsapi20200217.Client(config);
    }

    /**
     * 处理返回结果
     * @param response
     * @return
     */
    private static JSONObject getResponseBody(TeaModel response) {
        //将返回的json转化成JSONObject
        JSONObject responseJsonObject = JSONObject.parseObject(new Gson().toJson(response));

        System.out.println("responseJsonObject: " + responseJsonObject);

        //拿返回结果中的body,需要取哪些信息后面自己取
        JSONObject bodyJsonObject = responseJsonObject.getJSONObject("body");

        return bodyJsonObject;
    }

    /**
     * 三要素(姓名、手机号和身份证号)识别
     * @param param
     */
    public static Boolean threeElementIdentify(ThreeElementIdentifyRequestParam param) throws Exception {
        List<String> noEmptyFieldList = Arrays.asList("accessKeyId", "accessSecret", "AuthCode", "Mask", "InputNumber", "CertCode", "Name");
        VerifyUtil.checkBeanByNonEmptyFiledList(param, noEmptyFieldList, "三要素校验信息");

        com.aliyun.dytnsapi20200217.Client client = getVerifyClient(param);

        ThreeElementsVerificationRequest request = new ThreeElementsVerificationRequest();

        request.setAuthCode(param.getAuthCode());
        request.setMask(param.getMask());

        request.setCertCode(param.getCertCode());
        request.setInputNumber(param.getInputNumber());
        request.setName(param.getName());

        ThreeElementsVerificationResponse response = null;
        try {
            response = client.threeElementsVerificationWithOptions(request, new RuntimeOptions());
        } catch (TeaException e) {
            e.printStackTrace();

            //这里主要是把报错信息从英文换为中文
            throw new RuntimeException(ThreeElementIdentifyErrorCodeEnum.getDesc(e.code) + "!");
        } catch (Exception e) {
            e.printStackTrace();

            throw new RuntimeException(e.getMessage());
        }

        JSONObject body = getResponseBody(response);
        //{"headers":{"access-control-allow-origin":"*","date":"Mon, 23 Oct 2023 10:11:26 GMT","content-length":"137","keep-alive":"timeout=25","x-acs-request-id":"35266210-AB31-5E73-88AC-509C5F0B3E79","connection":"keep-alive","content-type":"application/json;charset=utf-8","etag":"1mfbFqXYsVtweJZ6OSyCWpg9","access-control-expose-headers":"*","x-acs-trace-id":"fa79554ca5ea3ffc8a613a0f85426a8d"},"body":{"code":"OK","data":{"basicCarrier":"中国移动","isConsistent":1},"requestId":"35266210-AB31-5E73-88AC-509C5F0B3E79","message":"OK"},"statusCode":200}

        if (VerifyUtil.isEmpty(body) || (VerifyUtil.isNotEmpty(body) && body.size() < 1)) {
            throw new RuntimeException("三要素校验响应异常!");
        }

        if (!body.getString("code").equals("OK")) {
            throw new RuntimeException(body.getString("message"));
        }

        JSONObject data = body.getJSONObject("data");
        if (VerifyUtil.isEmpty(data) || (VerifyUtil.isNotEmpty(data) && data.size() < 1)) {
            throw new RuntimeException("三要素校验结果状态异常!");
        }

        String isConsistent = data.getString("isConsistent");
        if (!isConsistent.equals(ThreeElementIdentifyConsistentEnum.STATUS_1.getStatus())) {
            throw new RuntimeException("手机号码" + ThreeElementIdentifyConsistentEnum.getDesc(isConsistent) + "!");
        }

        return true;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高级深入--day39

(实战项目三)新浪网分类资讯爬虫 爬取新浪网导航页所有下所有大类、小类、小类里的子链接&#xff0c;以及子链接页面的新闻内容。 效果演示图&#xff1a; items.py import scrapy import sys reload(sys) sys.setdefaultencoding("utf-8")class SinaItem(scrapy.I…

STM32Cube高效开发教程<基础篇>(七)----基础定时器

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、 概述 STM…

new Vue() 发生了什么?

目录 前言 用法 代码和效果图 效果图 理解 高质量的使用 前言 Vue.js是一个流行的JavaScript前端框架&#xff0c;用于构建单页面应用&#xff08;SPA&#xff09;和用户界面。当我们使用new Vue()来创建一个Vue实例时&#xff0c;Vue会执行一系列的初始化过程&#xff0…

Tomcat 和 HTTP 协议

目 录 HTTP 协议HTTP 是什么理解 HTTP 协议的工作过程抓包结果HTTP请求HTTP响应 HTTP 请求 (Request)认识 URL认识 "方法" (method)认识请求 "报头"&#xff08;header&#xff09;认识请求 "正文" (body) HTTP 响应认识 "状态码" (st…

NFS性能瓶颈分析

前言 atop – run it with -d option or press d to toggle the disk stats view. iostat – try it with the -xm 2 options for extended statistics, in megabytes, and in two-second intervals. iotop – top-like I/O monitor. Try it with the -oPa options to show the…

Redis数据类型——list类型数据的扩展操作

1.list阻塞式数据获取 2.list类型数据业务场景

基于蜻蜓算法的无人机航迹规划-附代码

基于蜻蜓算法的无人机航迹规划 文章目录 基于蜻蜓算法的无人机航迹规划1.蜻蜓搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用蜻蜓算法来优化无人机航迹规划。 1.蜻蜓搜索算法 …

华盛顿特区选举委员会:黑客可能已侵入整个选民名册

导语 近日&#xff0c;华盛顿特区选举委员会&#xff08;DCBOE&#xff09;传来了一条令人担忧的消息&#xff1a;黑客可能已经侵入了整个选民名册。这一事件引发了公众的广泛关注和担忧。本文将为大家详细介绍这一事件的经过以及可能带来的后果&#xff0c;并探讨选民数据的保…

KekeBlog项目实战后台模块(二)(已完结)

十一、后台模块-菜单列表 菜单指的是权限菜单&#xff0c;也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表&#xff0c;不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…

Python与Appium实现手机APP自动化测试的示例代码

本文主要介绍了Python与Appium实现手机APP自动化测试的示例代码&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 1.什么是Appium appium是一个开源的测试自动化框架&#xff0c;可以与原生的、混合的和移…

借助文心大模型4.0轻松搞定中文语境,生成技术视频十分强悍,并能自主添加各种方言!

在10月17日的百度世界2023上&#xff0c;文心大模型4.0版本正式发布&#xff01;百度直接放话&#xff1a;文心大模型4.0是目前最强大的文心大模型。会上百度董事长李彦宏为我们展示了文心大模型4.0在搜索、地图、商业智能、智能会议、智能视频、多轮对话方面的强悍。那文心大模…

【vue3+ts】@设置别名

新建的vue3ts项目&#xff0c;建路由的时候报错&#xff1a; 在vite.config.ts中新增如下代码&#xff1a; import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path" // https://vitejs.dev/config/ export default defineC…

1990-2021年上市公司债务融资成本数据(原始数据+stata处理代码+计算结果)

1990-2021年上市公司债务融资成本数据&#xff08;原始数据处理代码计算结果&#xff09; 1、时间&#xff1a;1990-2021年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;编码、年份、证券代码、短期借款、长期借款、应付债券、长期应付款、负债合计、行业代码、财务…

实现基于 Jenkins 的多服务器打包方案

实现基于 Jenkins 的多服务器打包方案 在实际项目中&#xff0c;我们经常会遇到需要将一个应用程序或服务部署到不同的服务器上的需求。而使用 Jenkins 可以很方便地自动化这个过程。 设置参数 首先&#xff0c;我们需要设置一些参数&#xff0c;以便在构建过程中指定要部署…

vue项目中隐藏右侧滑动栏,使用鼠标滚轮滑动

直接加一个样式&#xff0c;就什么也不用管了 ::-webkit-scrollbar {display: none; }

解决windows中安装VMware后宿主机wifi网卡无法正常使用的问题

问题描述 笔者在安装了 VMware16 后&#xff0c;出现了宿主机托盘中的wifi图标消失、宿主机无法上网、设备管理器中wifi网卡出现43代码错误等情况。在网上搜索良久&#xff0c;找到的解决方法大多为卸载 VMware16 然后清除注册表中的VMware记录等操作&#xff0c;参考性不是很…

数据结构和算法(14):串

串及串匹配 串或字符串&#xff08;string&#xff09;属于线性结构&#xff0c;可直接利用向量或列表等序列结构加以实现&#xff1a;结构简单&#xff0c;规模庞大&#xff0c;元素重复率高。 串 由 n 个字符构成的串记作&#xff1a; S " a 0 a 1 . . . a n − 1 &…

山海鲸数字孪生流域:创新驱动,智能治水

当今社会&#xff0c;水资源管理和防洪治理是一项重要的任务&#xff0c;涉及许多关键领域&#xff0c;如灌溉、供水、排水和防洪。这些任务通常在大规模的流域中进行&#xff0c;涉及复杂的水文和气象数据&#xff0c;需要高效的监测和管理。在这一背景下&#xff0c;山海鲸数…

HTML5语义化标签 header 的详解

&#x1f31f;&#x1f31f;&#x1f31f; 专栏详解 &#x1f389; &#x1f389; &#x1f389; 欢迎来到前端开发之旅专栏&#xff01; 不管你是完全小白&#xff0c;还是有一点经验的开发者&#xff0c;在这里你会了解到最简单易懂的语言&#xff0c;与你分享有关前端技术和…

【三维世界】高性能图形渲染技术——Shader你又了解多少?

目录 前言 什么是 Fragment Shader(片段着色器)&#xff1f; 为什么 shaders 运行特别快&#xff1f; 为什么 Shaders 有名但不好学&#xff1f; Hello World 总结 前言 Shader&#xff08;着色器&#xff09;是一种计算机程序&#xff0c;主要用于控制计算机图形学中…