- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用文本网格在 3D 对象上放置文本,但众所周知,文本网格没有任何法线...
http://docs.unity3d.com/Documentation/Components/class-TextMesh.html
...所以它没有正确点亮。我进行了搜索,发现很多人在照明 3D 文本网格时遇到问题,因为它没有任何法线,但我还没有找到向文本网格对象添加法线的解决方案,所以这就是我的问题。
如何向文本网格添加法线以使其正确点亮?
非常感谢您的智慧!
最佳答案
我做了类似的事情来照亮 3D 纹理。我希望我的回答不是矫枉过正。所以这段代码是我之前写的一个 hack,它效率低下,只支持单个定向光(有用的 cg lighting tuts here)。希望这足以让你开始。
要使用我下面的代码创建 3D 纹理,您必须进行更多工作:
_Normal
属性与文本面向的方向,以便它反射(reflect)方向的变化。文本是平面的,所以我们只需要 1 个法线。为了测试,我手动将法线设置为 (0,0,-1,1),因为默认文本网格面朝下 -Z。
Shader "GUI/LitText" {
Properties {
_MainTex ("Font Texture", 2D) = "white" {}
_Color ("Text Color", Color) = (1,1,1,1)
_Normal ("Text Normal",Vector) = (0,0,0,1)
}
SubShader {
Blend SrcAlpha OneMinusSrcAlpha
Pass {
Color [_Color]
SetTexture [_MainTex] {
combine primary, texture * primary
}
}
pass {
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform sampler2D _MainTex;
uniform float4 _Color; // define shader property for shaders
uniform float4 _Normal;
// The following built-in uniforms (apart from _LightColor0)
// are defined in "UnityCG.cginc", which could be #included
uniform float4 unity_Scale; // w = 1/scale; see _World2Object
uniform float3 _WorldSpaceCameraPos;
uniform float4x4 _Object2World; // model matrix
uniform float4x4 _World2Object; // inverse model matrix
// (all but the bottom-right element have to be scaled
// with unity_Scale.w if scaling is important)
uniform float4 _WorldSpaceLightPos0;
// position or direction of light source
uniform float4 _LightColor0;
// color of light source (from "Lighting.cginc")
struct vertexInput {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 col : COLOR;
float4 tex : TEXCOORD0;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
float4x4 modelMatrix = _Object2World;
float4x4 modelMatrixInverse = _World2Object;
float3 normalDirection = normalize(float3(mul(_Normal, modelMatrixInverse)));
float3 lightDirection = normalize(float3(_WorldSpaceLightPos0));
float3 diffuseReflection = float3(_LightColor0) * float3(_Color)
* max(0.0, dot(normalDirection, lightDirection));
output.col = float4(diffuseReflection, 1.0);
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
output.tex = input.texcoord;
return output;
}
float4 frag(vertexOutput input) : COLOR
{
half4 color = tex2D(_MainTex, float2(input.tex));
// use color.a to get alpha from text texture, rgb comes from vertex shader
return float4(input.col.r,input.col.g,input.col.b,color.a);
}
ENDCG
}
}
}
public class TextMeshNormals : MonoBehaviour {
private TextMesh textMesh;
// Use this for initialization
void Start () {
// reassign font texture to our material
textMesh = transform.GetComponent<TextMesh>();
renderer.material.mainTexture = textMesh.font.material.mainTexture;
}
}
Shader "GUI/LitText" {
Properties {
_MainTex ("Font Texture", 2D) = "white" {}
_Color ("Text Color", Color) = (1,1,1,1)
_Normal ("Text Normal",Vector) = (0,0,0,1)
}
SubShader {
Blend SrcAlpha OneMinusSrcAlpha
Pass {
Color [_Color]
SetTexture [_MainTex] {
combine primary, texture * primary
}
}
pass {
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform sampler2D _MainTex;
uniform float4 _Color; // define shader property for shaders
uniform float4 _Normal;
uniform float4 _LightColor0;
// color of light source (from "Lighting.cginc")
struct vertexInput {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 col : COLOR;
float4 tex : TEXCOORD0;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
float4x4 modelMatrix = _Object2World;
float4x4 modelMatrixInverse = _World2Object;
float3 normalDirection = normalize(float3(mul(_Normal, modelMatrixInverse)));
float3 lightDirection = normalize(float3(_WorldSpaceLightPos0));
float3 diffuseReflection = float3(_LightColor0) * float3(_Color)
* max(0.0, dot(normalDirection, lightDirection));
output.col = float4(diffuseReflection, 1.0);
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
output.tex = input.texcoord;
return output;
}
float4 frag(vertexOutput input) : COLOR
{
half4 color = tex2D(_MainTex, float2(input.tex));
// use color.a to get alpha from text texture, rgb comes from vertex shader
return float4(input.col.r,input.col.g,input.col.b,color.a);
}
ENDCG
}
}
}
关于unity3d - 如何向文本网格添加法线以使其正确点亮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16228481/
我正在尝试点亮 STM32F103C8T6 上的 LED(在端口 c,引脚 13 上)。我没有使用 IDE。代码: #include "include/stm32f10x.h" int main()
我写了一个小的 fetchmail 脚本,它检查远程服务器并在我有新邮件时播放音频文件。我还想在邮件可用时点亮我的键盘灯之一,但我遇到了问题。我可以用这个点亮滚动锁定灯: /usr/bin/xset
我想用Java编写一个GUI,其中会有一个按钮。按下按钮将点亮连接到 Arduino 的二极管。我正在使用 RXTXcomm.jar 库。 现在,我编写了显示 COM21 端口的代码,因为这就是我的
我的场景中有几个 Sprite 节点正在转换阴影。我还有一个 Sprite 在其中一个阴影中。我希望能够判断用户是否将 Sprite 从阴影中移到光线中。无论如何要 swift 做到这一点?谢谢。 最
我不太了解PHP,但我想问一下我应该如何改进这个脚本。 添加我现有代码的截图,我简单描述一下。 当第一次按下网络按钮时,该程序会导致 LED 点亮。 必须满足条件,即文件大小必须等于 2 个字节。当执
我刚刚开始使用 Unity 3d 进行照明,现在有一个功能可以逐渐加深我这里场景的照明。我已经通过渲染设置完成了这项工作,并尝试了 3 种不同的光照方法,我都收到了相同的结果:
我是一名优秀的程序员,十分优秀!