Shader16 - 片段级模型动态变色

本文介绍如何使用Unity的Shader系统实现一个能够旋转并显示渐变色效果的球体,通过调整Shader参数,可以改变球体的颜色过渡方式和旋转效果。文章详细解析了Shader代码,并提供了一个用于挂载在汽车上的示例脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shader "Sbin/FragColor" 
{

	Properties
	{
		_MainColor("MainColor",color)=(1,1,1,1)
		_SecondColor("SecondColor",color)=(1,1,1,1)
		_Center("Center",Range(-0.51,0.51))=0
		_R("R",Range(0,0.5))=0.2
	}
	SubShader 
	{
	    //透明处理
		tags{"queue"="transparent"}

		pass
		{
		
			CGPROGRAM
		
			#pragma vertex Vert
			#pragma fragment frag 
			#include "unitycg.cginc"

			float4 _MainColor;
			float4 _SecondColor;
			float _R;
			struct v2f
			{
				float4 pos:POSITION;
				float4 y:TEXCOORD0;
			}


			v2f vert(appdata_base v)
			{
				v2f o;
				o.pos=mul(UNITY_MATRIX_MVP,v.Vertex);
				o.y=v.Vertex.y;
				return o;
			}

			fixed frag(v2f IN):COLOR
			{
				float d=IN.y-_Center;
				d=d/abs(d);
				float f=saturate(d/_R);
				d*=f;
				d=d/2+0.5;//范围在0到1之间
				return lerp(_MainColor,_SecondColor,d);//差值运算
			}
			ENDCG
		}
	} 
}

 

挂在汽车上转起来

using UnityEngine;
using System.Collections;
using System.Linq;

public class CheckVertex : MonoBehaviour
{
    public MeshFilter mf1;
    public MeshFilter mf2;
    public MeshFilter mf3;
	// Use this for initialization
	void Start () 
    {
        Vector3[] verts = mf1.mesh.vertices;
        float max = verts.Max(v => v.x);
        float min = verts.Min(v => v.x);
        Debug.Log(max + "   " + min);
	}
	
	// Update is called once per frame
	void Update () 
    {
        transform.Rotate(Vector3.up, Time.deltaTime * 10);
	}
}

 

Shader "Sbin/CarPaintSurface" 
{
	Properties 
	{
		_MainColor("MainColor",color)=(1,1,1,1)
		_SecondColor("SecondColor",color)=(1,1,1,1)
		_Center("Center",Range(-0.51,0.51))=0
		_R("R",Range(0,0.5))=0.2
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0
	}
	SubShader 
	{
		Tags { "RenderType"="Opaque" }
		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		//制定使用的表面着色器,表面着色器的函数surf,基于物理模型的光照模型standard,
		#pragma surface surf Standard vertex:vert

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;

		float4 _MainColor;
		float4 _SecondColor;
		float _R;
		half _Glossiness;
		half _Metallic;


		struct Input 
		{
			float2 uv_MainTex;
			float x;
		};

		void vert(inout appdata_full v,out Input o)
		{
			o.uv_MainTex=v.TEXCOORD.xy;
			o.x=v.Vertex.x;
		}

		

		void surf (Input IN, inout SurfaceOutputStandard o) {
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
			o.Albedo = c.rgb;//漫反射颜色赋值
			// Metallic and smoothness come from slider variables
			o.Metallic = _Metallic;//金属化的级别
			o.Smoothness = _Glossiness;//平滑度
			o.Alpha = c.a;

			float d=IN.x-_Center;
			d=d/abs(d);
			float f=saturate(d/_R);
			d*=f;
			d=d/2+0.5;//范围在0到1之间
			o.Albedo*= lerp(_MainColor,_SecondColor,d)*2;//差值运算
		}
		ENDCG
	} 
	FallBack "Diffuse"
}

 

对整threeJS体系进行全面剖析。整理出全面的教学大纲,涵盖内容面非常广。此教学版本为threeJS107版本。关于版本不建议大家使用低于90的版本学习。以下是课程目录1-ThreeJS概览(基本图形简介,什么是点线面如何绘制点线面,什么是材质,什么是几何体,什么是相机,什么是渲染器,什么是场景)2-相机和渲染器(详解相机类型,渲染器如何使用,针对不同场景怎么用,怎么调效果,怎么渲染,怎么输出画布,如何解决透明问题等等)3-创建平面几何(常见的几何体如何使用,如何使用简单的几何体绘制出自定义自己想要的几何体,关于几何体的性能剖析,如何解决性能,几何体的渲染原理)4-图形算法常见库(求直线的斜率  计算线段与圆的交点 计算线段的长度 判断折线是否在多边形内 等等)5-sprite精灵(怎么让一个图标永远朝向屏幕,精灵的属性,精灵材质原理等,广告提示框必用)6-骨骼游戏动画(什么是模型动画,常见游戏案例,如何让人头进行各种攻击动作)7-3d模型加载(常见模型格式,如何渲染不同格式,不同格式的特点,什么格式性能优越,模型渲染异常,贴图不显示等问题详解)8-高阶动态纹理(你所不知道的纹理用法,我说你不知道,你肯定不知道)9-漫游轨迹以及其动画路径(怎么绘制贝塞尔曲线,如何使用曲线上的路径,跟随路径移动的原理,相机如何运动,物体如何运动)10-着色器(什么是着色器。初识着色器基础,着色器材质怎么用,怎么使用着色器库)11-常见渲染以及透明度问题12-对象拾取以及拖拽(3d世界里面如何拖拽物体,拖拽的原理,mousemove mouseon等的事件效果)13-世界坐标以及组的问题(什么是相对坐标,什么是世界坐标,什么是当前坐标,怎么转化父子坐标系,组的优化,为什么用组,组的优势)14-指定对象旋转中心(什么是物体的几何体中心,如何改变中心,如何绕轴转动)15-对象渲染(多个场景一键切换,切换的优势,针对大项目的用法)16-拓展了解系列(不定期不断更新案例,各种酷炫效果bloom,halo等,以及各种3d图表,粒子案例等,不断构建你的3d实践能力)
### 如何在 Qt3D 中实现模型的颜色动态变化 在 Qt3D 中,可以通过调整材质属性来实现 3D 模型的颜色动态变化。具体来说,`Material` 组件负责定义对象的外观表现,而 `Effect` 和 `Technique` 则进一步细化了渲染方式[^1]。通过修改这些组件中的参数,可以达到实时改变模型颜色的效果。 以下是具体的实现思路: #### 使用自定义着色器 如果需要更灵活的颜色控制,可以选择编写自定义 GLSL 着色器程序,并将其应用于目标模型上。例如,在顶点或片段着色器中引入时间变量或其他输入数据作为颜色计算依据[^4]。 ```cpp // 创建一个QShaderProgram实例并加载相应的vertex/fragment shaders文件 auto shader = new QShaderProgram(); shader->addShaderFromSourceFile(QShader::Vertex, ":/shaders/my_vertex_shader.glsl"); shader->addShaderFromSourceFile(QShader::Fragment, ":/shaders/my_fragment_shader.frag"); // 构建Qt3DRender::QMaterial对象并将上述program关联进去 Qt3DRender::QMaterial *material = new Qt3DRender::QMaterial(rootEntity); material->setEffect(new Qt3DRender::QEffect(shader)); ``` #### 动态更新材质参数 对于大多数情况而言,直接操作现有的标准材料(Standard Materials)就足够满足需求了。比如设置不同的 diffuseColor 值即可轻松切换物体表面色调[^2]。 下面给出一段简单的示例代码演示如何周期性更改球体的颜色: ```cpp #include <Qt3DExtras/QForwardRenderer> #include <Qt3DCore/QTransform> ... QTimer timer; QObject::connect(&timer,&QTimer::timeout,[this]()mutable{ static float hue=0.0f; QColor c=qRgb(255,hue*255,(hue+0.5)*255); //生成HSV空间下的随机RGB色彩 m_sphereMeshMaterial->setParameter("diffuse",c); //假设m_sphereMeshMaterial已经初始化好 hue+=0.01f; if(hue>1.0f)hue-=1.0f; }); timer.start(16); //约每秒刷新60次 ``` 以上脚本会每隔一段时间调用一次槽函数,从而不断给定新的 RGB 数值至 sphere 的漫反射项之中,形成渐变过渡效果[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值