我被要求使用表面着色器在两个给定点之间画一条线。该点在纹理坐标(0和1之间)中给出,并直接进入Unity中的表面着色器。我想通过计算像素位置并查看它是否在该行上来做到这一点。所以我要么尝试将纹理corrdinate转换为世界pos,要么我获得相对于该纹理坐标的像素位置。
但我只在Unity Shader手册中找到了worldPos和screenPos。有没有什么方法可以在纹理坐标中获得位置(或至少得到世界pos中纹理对象的大小?)
这是一个简单的例子:
Shader "Line" {
Properties {
// Easiest way to get access of UVs in surface shaders is to define a texture
_MainTex("Texture", 2D) = "white"{}
// We can pack both points into one vector
_Line("Start Pos (xy), End Pos (zw)", Vector) = (0, 0, 1, 1)
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
float4 _Line;
struct Input {
// This UV value will now represent the pixel coordinate in UV space
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
float2 start = _Line.xy;
float2 end = _Line.zw;
float2 pos = IN.uv_MainTex.xy;
// Do some calculations
return fixed4(1, 1, 1, 1);
}
ENDCG
}
}
这是一篇关于如何计算一个点是否在一条线上的好文章:
How to check if a point lies on a line between 2 other points
假设您使用以下签名定义了一个函数:
inline bool IsPointOnLine(float2 p, float2 l1, float2 l2)
那么对于返回值,你可以把这个:
return IsPointOnLine(pos, start, end) ? _LineColor : _BackgroundColor
如果你想要不使用纹理的UV坐标,我建议改为使用顶点片段着色器并在appdata / VertexInput结构中定义float2 uv : TEXCOORD0
。然后,您可以将其传递给顶点函数内的片段着色器。