zoukankan      html  css  js  c++  java
  • unity 开发shader(0)

    本系列转载自毛星云(浅墨)的专栏

    主要目的死参考学习计算机图形学相关的内容,目前接手到的很多项目开发都需要涉及到对图形学的应用,鉴于没有图形学基础,也没有看到好的学习视频资料,无意间看到大神的博客,前来拜读作为学习的参考。(接触到了英伟达开发库中对“海飞丝”的开源内容,然而并不能熟练得使用其开源代码

    :https://forum.unity.com/threads/nvidia-hairworks-in-unity.328532/  看到了有日本大神根据DX11编写得插件觉得有必要学习下相关内容)

    前言

    首先,Unity中编写Shader的语言叫做ShaderLab,而ShaderLab说白了就是裹着一层皮的CG着色器语言而已。Cg,即C forgraphics,即用于图形的C语言,是微软Microsoft和英伟达NVIDIA相互协作在标准硬件光照语言的语法和语义上达成的一种一致性协议。

    HLSL和CG其实是同一种语言(参见Cg教程_可编程实时图形权威指南29页的致谢部分)。很多时候,我们会发现用HLSL写的代码可以直接当中Cg代码使用。

    Microsoft和NVIDIA联手推出CG语言,想在经济和技术上实现双赢,从而通过这种方式联手打击他们共同的对手GLSL。

    在Unity中写Shader约等于给DirectX写Shader

    前奏我就不copy了:看https://blog.csdn.net/poem_qianmo/article/details/40723789 的文章就行 直接看代码

    //-----------------------------------------------【Shader说明】----------------------------------------------
    //		Shader功能:   凹凸纹理显示+自选边缘颜色和强度
    //     使用语言:   Shaderlab
    //     开发所用IDE版本:Unity2017 、Monodevelop   
    //     2018年4月2日    
    //---------------------------------------------------------------------------------------------------------------------
    
    
    Shader "Shader编程/0.TheFirstShader" 
    {
    	//-------------------------------【属性】-----------------------------------------
    	Properties 
    	{
    		_MainTex ("【纹理】Texture", 2D) = "white" {}
    		_BumpMap ("【凹凸纹理】Bumpmap", 2D) = "bump" {}
    		_RimColor ("【边缘颜色】Rim Color", Color) = (0.17,0.36,0.81,0.0)
    		_RimPower ("【边缘颜色强度】Rim Power", Range(0.6,9.0)) = 1.0
    	}
    
    	//----------------------------【开始一个子着色器】---------------------------
    	SubShader 
    	{
    		//渲染类型为Opaque,不透明
    		Tags { "RenderType" = "Opaque" }
    
    		//-------------------开始CG着色器编程语言段-----------------
    		CGPROGRAM
    
    		//使用兰伯特光照模式
    		#pragma surface surf Lambert
    		
    		//输入结构
    		struct Input 
    		{
    			float2 uv_MainTex;//纹理贴图
    			float2 uv_BumpMap;//法线贴图
    			float3 viewDir;//观察方向
    		};
    
    		//变量声明
    		sampler2D _MainTex;//主纹理
    		sampler2D _BumpMap;//凹凸纹理
    		float4 _RimColor;//边缘颜色
    		float _RimPower;//边缘颜色强度
    
    		//表面着色函数的编写
    		void surf (Input IN, inout SurfaceOutput o)
    		{
    			//表面反射颜色为纹理颜色
    			o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
    			//表面法线为凹凸纹理的颜色
    			o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
    			//边缘颜色
    			half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
    			//边缘颜色强度
    			o.Emission = _RimColor.rgb * pow (rim, _RimPower);
    		}
    
    		//-------------------结束CG着色器编程语言段------------------
    		ENDCG
    	} 
    
    	//“备胎”为普通漫反射
    	Fallback "Diffuse"
    }
    

      

  • 相关阅读:
    智能算法:遗传算法
    matlab中画一条折线时怎样显示出每个点折点的数值
    灰色系统模型
    图论中TSP问题的LINGO求解与应用
    图论中最短路算法与程序实现
    图论中最优树问题的LINGO求解
    Hexo博客NexT主题美化之评论系统
    IN612L支持2.4G及蓝牙5.0全协议的SoC芯片替换NRF52832/NRF52840
    超低功耗蓝牙5.0芯片PHY6202替代NRF51822/NRF51802/NRF52832
    NRF51802多协议低功耗蓝牙/2.4G系统级芯片对比NRF51822差异
  • 原文地址:https://www.cnblogs.com/yangxiaohang/p/8698329.html
Copyright © 2011-2022 走看看