国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[游戲開發(fā)]Unity顏色矯正無障礙方案

這篇具有很好參考價(jià)值的文章主要介紹了[游戲開發(fā)]Unity顏色矯正無障礙方案。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

0. 前言

之前有在關(guān)注色盲視覺糾正問題,最近在調(diào)整游戲的時(shí)候就打算把這個(gè)用上。

色弱色盲,這其實(shí)算是一種誤稱吧,只是人類中的少數(shù)派,只不過看到的顏色和大部分人不一樣。下文用,視覺少數(shù)者,來稱呼吧。

本質(zhì)上是因?yàn)楦兄伾募?xì)胞發(fā)生突變,感知與大部分人有差異。之前就一直在想能不能有一些方法對顏色做一些調(diào)整作為糾正。比如說紅色感知弱,顯示的時(shí)候把紅強(qiáng)度提高作為彌補(bǔ)。但目前來說好像還沒有確切的方案來執(zhí)行,甚至色盲色弱的標(biāo)準(zhǔn)以及測試都不清楚,何談糾正呢。

主要是色覺其實(shí)是比較復(fù)雜的,人有3種感光細(xì)胞用于感知光線,然后感知之后再由大腦腦補(bǔ)一下出畫面。這其中的過程并不能夠簡單映射得出結(jié)果,比如同種顏色在不通顏色的比較下會感知不同。而且三種感光細(xì)胞還有一定的感光范圍,和RBG這種常用的顏色空間基準(zhǔn)還有偏差。所以這部分是比較難處理的。另外如果從小看到的火就是藍(lán)色的,那后面藍(lán)色這個(gè)顏色的意義也會發(fā)生改變,這個(gè)也難以統(tǒng)一。

1. 顏色矯正

顏色矯正是為了讓顏色更好區(qū)分,并不是開了之后就會讓視覺少數(shù)者感知到其他人一樣的顏色。處理還是有挺多種方法的。

  • 顏色映射,紅色映射為某一種顏色,紫色映射為另一種等等,這種方法主要是映射空間難以確定,而且運(yùn)行比較復(fù)雜,一般只有對圖片做處理才會有這種方式。
  • 旋轉(zhuǎn)H分量,在HSV空間縮放旋轉(zhuǎn)H分量的方式,這樣在色環(huán)上做的處理就可以讓顏色均勻,只不過旋轉(zhuǎn)角度難以確定、前后顏色差異比較大。
  • 線性變換,RGB顏色做一個(gè)線性變換,這樣顏色可以做到均勻計(jì)算量也比較小。至于能否在線性空間內(nèi)找到合適的方法,或者因人而異的指定參數(shù)這個(gè)還是比較難確定。

基本上目前軟件上,基本都是用第三種做的矯正處理,目前window中就是用的這個(gè),所以后續(xù)講的也是如此,參數(shù)也是用window開糾正后的顏色,反向求解出來的,效果應(yīng)該還可以。對于應(yīng)用到游戲中、UnIty中,目前考慮的方法就是用寫一個(gè) 顏色線性變換Shader,確定好不同的顏色糾正參數(shù),然后在攝像機(jī)后處理的時(shí)候做統(tǒng)一的糾正處理。

2. 線性變換Shader

這里就簡單的寫一個(gè)RGB線性變換的shder,主要目的是讓顏色與給定的矩陣做叉乘,如下。

Shader "MyShader/ColorTr" {
    Properties {
        [PerRendererData] _MainTex ("Texture", 2D) = "white" {}
        _UtR ("UtR",Vector)=(0.14,0.86,0,0)
        _UtG ("UtG",Vector)=(0.14,0.86,0,0)
        _UtB ("UtB",Vector)=(0,0,1,0)
    }
    SubShader {
        Pass {
            CGPROGRAM
            
            #include "UnityCG.cginc"
            
            #pragma vertex vert
            #pragma fragment frag

            sampler2D _MainTex;
            float4 _UtR;
            float4 _UtG;
            float4 _UtB;
            
			struct a2v {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0;
                //float3 color : COLOR0;
            };

            struct v2f {
                float4 pos : SV_POSITION;
                float3 texcoord : COLOR0;
            };
            
            v2f vert(a2v v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.texcoord = v.texcoord;
                return o;
            }

            fixed4 frag(v2f i) : SV_Target {
                float4 color = tex2D(_MainTex, i.texcoord);
                color.r = mul(_UtR,color);
                color.g = mul(_UtG,color);
                color.b = mul(_UtB,color);
                return color;
            }
            
            ENDCG
        } 
    }
    FallBack Off
}

好了,那么后面我們只需要修改_UtR 等3個(gè)矩陣點(diǎn)的值,就可以調(diào)整顏色線性變換的結(jié)果了。

2. 顏色糾正參數(shù)

我們先定義下顏色糾正類型,常規(guī)/紅色/綠色/藍(lán)色,

public enum ColorMappingType
{
    Normal,
    Red,
    Green,
    Blue,
}

具體的參數(shù)怎么去確定呢,參考window的顏色變換,我們只要獲取到對應(yīng)的顏色變換對,就可以通通過矩陣求逆的方式來得到和這個(gè)參數(shù)了,如下。color為原顏色,colorF為映射得到的函數(shù)

private double[,] GetTranslateU(double[,] color, double[,] colorF)
{
    double[,] colorAthwart = MatrixF.Athwart(color);
    return MatrixF.MultiplyMatrix(colorF, colorAthwart);
}
// 矩陣運(yùn)算相關(guān)內(nèi)容是參考的這里
// https://blog.csdn.net/Lynn_whu/article/details/80745634

如果不用矩陣運(yùn)算也可以,假設(shè)原本的顏色為(R1,G1,B1),變換后的顏色為(R2, G2, B2),線性變換矩陣為((a,b,c),(d,e,f),(g,h,i)},那么這個(gè)線性變換其實(shí)就是如下的結(jié)果。3個(gè)方程式,只要找到顏色變換對,代入就可以求出這幾個(gè)參數(shù)了。(不過估計(jì)還挺難算的。)

R2 = a * R1 + b * G1 + c * B1
G2 = d * R1 + e * G1 + f * B1
B2 = g * R1 + h * G1 + i * B1

那么求逆矩然后再求解之后,可得參數(shù)如下:

// 紅色
new double[3,3]{
    {1,0,0}, {0.47,0.49,0.04}, {0.59,-0.68,1.09},
},
// 綠色
new double[3,3]{
    {1.22,-0.31,0.11}, {0,1,0}, {-0.18,0.17,1},
},
// 藍(lán)色
new double[3,3]{
    {0.74,-0.39,0.66}, {0.08,0.59,0.33}, {0,0,1},
}

3. 攝像機(jī)后處理

場景等物體渲染后再做處理,用攝像機(jī)后處理來處理就很方便了。寫個(gè)腳本控制一下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


namespace GDT
{
    [RequireComponent(typeof(Camera))]
    public class ColorMapping : MonoBehaviour
    {
        public Material materialMapping;

        private double[][,] MappingUt;
        private Material curMaterial;

        private void Awake()
        {
            MappingUt = new double[3][,]{
                // 紅色
                new double[3,3]{
                    {1,0,0}, {0.47,0.49,0.04}, {0.59,-0.68,1.09},
                },
                // 綠色
                new double[3,3]{
                    {1.22,-0.31,0.11}, {0,1,0}, {-0.18,0.17,1},
                },
                // 藍(lán)色
                new double[3,3]{
                    {0.74,-0.39,0.66}, {0.08,0.59,0.33}, {0,0,1},
                }
            };
        }

        public void SetMaping(ColorMappingType type)
        {
            switch (type)
            {
                case ColorMappingType.Normal:
                    curMaterial = null;
                    break;
                case ColorMappingType.Red:
                    ChangeShaderColorTraU(MappingUt[0]);
                    curMaterial = materialMapping;
                    break;
                case ColorMappingType.Green:
                    ChangeShaderColorTraU(MappingUt[1]);
                    curMaterial = materialMapping;
                    break;
                case ColorMappingType.Blue:
                    ChangeShaderColorTraU(MappingUt[2]);
                    curMaterial = materialMapping;
                    break;
            }
        }

        private void OnRenderImage(RenderTexture source, RenderTexture destination)
        {
            //https://blog.csdn.net/qq_31042143/article/details/127186310
            if (curMaterial)
            {
                Graphics.Blit(source, destination, curMaterial);
            }
            else
            {
                Graphics.Blit(source, destination);
            }
            // R2 = a * R1 + b * G1 + c * B1
            // G2 = d * R1 + e * G1 + f * B1
            // B2 = g * R1 + h * G1 + i * B1
        }

        private void ChangeShaderColorTraU(double[,] Ut)
        {
            //Debug.LogError("Ut:" + Ut);
            materialMapping.SetVector("_UtR", new Vector4((float)Ut[0, 0], (float)Ut[0, 1], (float)Ut[0, 2], 0));
            materialMapping.SetVector("_UtG", new Vector4((float)Ut[1, 0], (float)Ut[1, 1], (float)Ut[1, 2], 0));
            materialMapping.SetVector("_UtB", new Vector4((float)Ut[2, 0], (float)Ut[2, 1], (float)Ut[2, 2], 0));
        }
    }
}

  • [RequireComponent(typeof(Camera))]
    因?yàn)樾枰M(jìn)行相機(jī)后處理,所以要求了一下組件類型
  • SetMaping 設(shè)置顏色糾正方式
  • OnRenderImage 進(jìn)行攝像機(jī)后處理
  • ChangeShaderColorTraU 設(shè)置shader參數(shù)

然后把腳本掛到攝像機(jī)對象上就完成了。

4. 效果

[游戲開發(fā)]Unity顏色矯正無障礙方案,游戲開發(fā),unity,c#,游戲
效果還是比較明顯的,下面是參照顏色條,和window 上的變換一致。

實(shí)現(xiàn)還是挺簡單的,只需要掛在顯示的攝像機(jī)上就可以了,不會影響到其他shader的處理,場景和游戲?qū)ο蠖疾挥昧硗庾鎏幚怼?/p>

5. 結(jié)束咯

到這里就結(jié)束了。線性變換的參數(shù)還是有很大操作空間的,不僅可以用于視覺少數(shù)者糾正顏色,也可以用于做一些視覺特殊效果,比如說畫面變黃等濾鏡效果。只要綁定到特殊的攝像頭上,或者直接用于對應(yīng)物體的材質(zhì)上就可以了。

希望能夠提供參考組作用。文章來源地址http://www.zghlxwxcb.cn/news/detail-605478.html

到了這里,關(guān)于[游戲開發(fā)]Unity顏色矯正無障礙方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android 應(yīng)用自動開啟輔助(無障礙)功能并使用輔助(無障礙)功能

    目錄 一.背景 二.前提條件 三.將普通應(yīng)用轉(zhuǎn)換成系統(tǒng)應(yīng)用 1.在AndroidManifest文件中添加

    2024年02月09日
    瀏覽(19)
  • Android 12.0默認(rèn)開啟無障礙服務(wù)權(quán)限和打開默認(rèn)apk無障礙服務(wù)

    在12.0的系統(tǒng)rom定制化開發(fā)中,在第三方app開發(fā)中,需要開啟無障礙服務(wù)功能,就不需要在代碼中開啟無障礙服務(wù)了, 為了簡便就需要在系統(tǒng)中開啟無障礙服務(wù),來實(shí)現(xiàn)開啟無障礙服務(wù)功能

    2024年02月07日
    瀏覽(54)
  • Android 無障礙服務(wù)自動點(diǎn)擊

    Android 無障礙服務(wù)自動點(diǎn)擊

    業(yè)余時(shí)間了解了Android無障礙服務(wù)的一些有趣功能,比如微信自動搶紅包、應(yīng)用寶的一鍵安裝功能等。大致原理是監(jiān)聽手機(jī)窗體內(nèi)容變化,拿到對應(yīng)的View,進(jìn)行點(diǎn)擊、長按等Touch操作,下面我們就借助 AccessibilityService 這個(gè)服務(wù)類實(shí)現(xiàn)模擬點(diǎn)擊功能。? 1、繼承AccessibilityService,

    2024年02月05日
    瀏覽(26)
  • auto.js autojs pro9 autox.js實(shí)現(xiàn)adb自動化測試腳本開發(fā)自動生成代碼 防無障礙檢測

    auto.js autojs pro9 autox.js實(shí)現(xiàn)adb自動化測試腳本開發(fā)自動生成代碼 防無障礙檢測

    不需要開無障礙就可以實(shí)現(xiàn)自動化 ,功能上和無障礙效果一樣, 但是可以過目標(biāo)app的檢測,因?yàn)檐浖旧隙疾粰z測adb(usb調(diào)試), 游戲腳本的福音 ,最主要是可以 直接生成自動化代碼 ,所以寫adb的自動化腳本 和無障礙的自動化腳本都同樣簡單高效,傻瓜式操作。 對于

    2024年01月19日
    瀏覽(36)
  • 手機(jī)APP-小米手機(jī)無障礙功能開啟失敗

    在設(shè)置中關(guān)閉以下三個(gè)設(shè)置: 不要設(shè)置為全面屏模式,不過可以在打開無障礙功能后再換回來。 ? ? ————————————————————— 以上就是今日博客的全部內(nèi)容了 創(chuàng)作不易,若對您有幫助,可否點(diǎn)贊、關(guān)注一二呢, 感謝支持

    2024年02月08日
    瀏覽(21)
  • Facebook的可訪問性使命:構(gòu)建無障礙社交空間

    Facebook的可訪問性使命:構(gòu)建無障礙社交空間

    在當(dāng)今數(shù)字時(shí)代,社交媒體不僅是人們交流、分享和連接的平臺,更是構(gòu)建開放、包容社交環(huán)境的關(guān)鍵。Facebook,作為全球最大的社交媒體平臺之一,積極推動著可訪問性使命,致力于構(gòu)建一個(gè)無障礙的社交空間,使每個(gè)用戶都能平等參與其中。本文將深入探討Facebook在可訪問

    2024年01月23日
    瀏覽(22)
  • 無障礙工具條在前端項(xiàng)目中的使用

    無障礙工具條在前端項(xiàng)目中的使用

    一、使用的工具 https://gitee.com/tywAmblyopia/ToolsUI 二、使用 VUE中使用 -1.拉取代碼 -2.將 canyou 文件夾放到 public 目錄下 -3.在 public 文件夾下的 index.html 文件中 /head標(biāo)簽前,引用v1.8以上的jquery.min.js(原網(wǎng)站已引用v1.8以上的jquery跳過此步驟)。 -4.在 public 文件夾下的 index.html 文件中 /he

    2024年02月14日
    瀏覽(37)
  • flutter flutter_accessibility_service無障礙服務(wù)

    flutter_accessibility_service a plugin for interacting with Accessibility Service in Android. Accessibility services are intended to assist users with disabilities in using Android devices and apps, or I can say to get android os events like keyboard key press events or notification received events etc. for more info check Accessibility Service Installation

    2024年02月10日
    瀏覽(28)
  • 有 AI,無障礙,AIoT 設(shè)備為視障人群提供便利

    有 AI,無障礙,AIoT 設(shè)備為視障人群提供便利

    據(jù)世界衛(wèi)生組織統(tǒng)計(jì),全球共 22 億人視力受損,包含 2.85 億視障人群和 3,900 萬全盲人群。而且,這一數(shù)字將隨老齡化加劇不斷增加。 雖然視障人群面臨著諸多不便,但是針對視障人群的輔助設(shè)備卻存在成本高、維護(hù)困難、操作復(fù)雜等問題,很難滿足他們的生活需求。 為此,

    2024年02月08日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包