【发布时间】:2018-05-08 01:45:22
【问题描述】:
我想知道如何将此表面着色器代码转换为顶点/片段杂注:
Shader "Custom/Diamond Opaque Test" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_SpecColor ("Specular Color", Color) = (0.5,0.5,0.5,1)
_Shininess ("Shininess", Range (0.01, 1)) = 0.078125
_RimPower ("Rim Power", Range(0,8.0)) = 3.0
_ReflectColor ("Reflection Color", Color) = (1,1,1,0.5)
[NoScaleOffset] _Cube ("Cubemap", CUBE) = "" {}
}
SubShader {
CGPROGRAM
#pragma surface surf BlinnPhong
struct Input {
float3 worldRefl;
float3 viewDir;
};
samplerCUBE _Cube;
fixed4 _Color;
fixed4 _ReflectColor;
half _Shininess;
half _RimPower;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = _Color.rgb;
o.Gloss = _Color.a;
o.Specular = _Shininess;
half rim = saturate(dot (normalize(IN.viewDir), o.Normal));
o.Emission = texCUBE (_Cube, IN.worldRefl).rgb * _ReflectColor.rgb * pow(rim,_RimPower);;
}
ENDCG
}
FallBack "Mobile/Diffuse"
}
上面的shader代码就是下图左边的红色宝石:
我的目标是看起来与右侧的宝石相似。在此过程中,我遇到了一些挑战。左边的宝石是不透明的并且接受阴影。右边的宝石有正面透明但没有背面。然而,这不接受阴影。我必须在 let BlinnPhong 上制作宝石,以便它可以投射和接收阴影。
是否可以为正面和背面透明度创建不同的控件?还有一种方法可以让透明物体接受阴影吗?我想为宝石添加轮廓,以便可以在更远的地方看到它。有没有办法在同一个 Pass 中添加轮廓,还是必须有自己单独的 Pass?另外,如何使接收到的阴影变暗?所有这些要求都会对 GPU 造成负担吗?该游戏适用于移动平台。
我是 CG 编程的初学者。我的第一步是弄清楚将曲面编程转换为顶点/片段。任何例子都将非常感激。
我确实在资产商店购买了一些宝石资产,但其中一些可以投射阴影但无法接收或根本无法投射或接收。是什么赋予了?右侧的宝石着色器来自资产商店中购买的资产之一。我不想在未经他们许可的情况下在此网站上分享他们的着色器脚本。
【问题讨论】:
-
我很困惑你的问题有很多问题? 1-表面到碎片 2-双面透明
-
为什么要将此着色器转换为片段着色器?最好使用表面着色器,因为它易于编辑。
-
@SeyedMortezaKamali 1)。我购买的资产中有一些我喜欢的功能,但它是写顶点/片段的。我想提取部分代码并添加到我的代码中。我想将表面转换为顶点/片段,以便了解如何操作它。 2)。我想通过控制正面和背面的 alpha 来控制宝石中的雾量。为整个宝石设置 alpha 使其看起来更像玻璃或塑料。例如,我想将白色宝石的背面 alpha 设置为更接近纯色而不是更深的颜色。我希望这是有道理的。
-
编写片段着色器并不容易,但如果你喜欢这样做,你应该学习片段着色器,但无论如何每个灯光建模都有片段着色器here
标签: unity3d shader fragment-shader vertex-shader