Как получить координату текстуры в шейдере поверхности? - PullRequest
0 голосов
/ 20 апреля 2019

Меня попросили нарисовать линию между двумя заданными точками, используя шейдер поверхности.Точка задается в координате текстуры (между 0 и 1) и напрямую переходит в поверхностный шейдер в Unity.Я хочу сделать это путем вычисления положения пикселя и посмотреть, находится ли он на этой линии.Поэтому я либо пытаюсь перевести текстурный кординат в мировой pos, либо получаю положение пикселя относительно этой текстурной координаты.

Но я нашел только worldPos и ​​screenPos в руководстве по шейдерам Unity.Есть ли какой-нибудь способ, которым я могу получить положение в текстурной координате (или, по крайней мере, получить размер текстурированного объекта в мире pos?)

1 Ответ

1 голос
/ 23 апреля 2019

Вот простой пример:

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
    }
}

Вот хороший пост о том, как вычислить, находится ли точка на линии:

Как проверить, если точкалежит на линии между двумя другими точками

Допустим, вы определяете функцию из этого со следующей сигнатурой:

inline bool IsPointOnLine(float2 p, float2 l1, float2 l2)

Затем для возвращаемого значения вы можете поместить это:

return IsPointOnLine(pos, start, end) ? _LineColor : _BackgroundColor

Если вам нужны координаты UV без использования текстуры, я рекомендую вместо этого сделать шейдер вершинного фрагмента и определить float2 uv : TEXCOORD0 внутри структуры appdata / VertexInput.Затем вы можете передать это фрагментному шейдеру внутри функции вершины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...