如何在曲面着色器中获取纹理坐标?

问题描述 投票:0回答:1

我被要求使用表面着色器在两个给定点之间画一条线。该点在纹理坐标(0和1之间)中给出,并直接进入Unity中的表面着色器。我想通过计算像素位置并查看它是否在该行上来做到这一点。所以我要么尝试将纹理corrdinate转换为世界pos,要么我获得相对于该纹理坐标的像素位置。

但我只在Unity Shader手册中找到了worldPos和screenPos。有没有什么方法可以在纹理坐标中获得位置(或至少得到世界pos中纹理对象的大小?)

unity3d shader
1个回答
1
投票

这是一个简单的例子:

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。然后,您可以将其传递给顶点函数内的片段着色器。

© www.soinside.com 2019 - 2024. All rights reserved.