【发布时间】:2014-06-04 23:25:28
【问题描述】:
我正在为 Unity 项目编写一个(希望如此)行星着色器。我对着色器比较陌生,据我了解,这里的语言是 CG Shader 的一个子集,称为 ShaderLab。
我的问题是这可以在着色器中完成吗?我有将坐标映射到球体的公式,但我只是弄得一团糟。我在 XNA 项目中使用相同的公式将平面从单位立方体映射到单位球体,并且效果很好。我做错了什么?
哦,我正在 Unity 中放置在 (0, 1, 0),比例为 (1, 1, 1) 的库存平面预制件上进行测试。
注意事项:
- appdata_base :一种由位置、法线和一个纹理坐标组成的顶点格式
- _Object2World:来自 Unity 的当前模型矩阵
- UNITY_MATRIX_VP:当前视图 * Unity 的投影矩阵
这是我的顶点着色器:
struct v2f {
float4 pos : SV_POSITION;
float3 col : COLOR0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = v.vertex;
o.pos = mul(_Object2World, o.pos); // _Object2World is the current model matrix from UNITY
o.pos.x *= sqrt(1 - o.pos.y * o.pos.y / 2 - o.pos.z * o.pos.z / 2 + o.pos.y * o.pos.y * o.pos.z * o.pos.z / 3);
o.pos.y *= sqrt(1 - o.pos.z * o.pos.z / 2 - o.pos.x * o.pos.x / 2 + o.pos.z * o.pos.z * o.pos.x * o.pos.x / 3);
o.pos.z *= sqrt(1 - o.pos.x * o.pos.x / 2 - o.pos.y * o.pos.y / 2 + o.pos.x * o.pos.x * o.pos.y * o.pos.y / 3);
o.pos = mul(UNITY_MATRIX_VP, o.pos);
o.col = v.normal * 0.5 + 0.5;
return o;
}
【问题讨论】:
标签: unity3d shader vertex-shader cg