2015-02-15 5 views
2

Я пишу 3D-приложение с использованием металла. Для рендеринга в 3D мне нужно управлять каждым пикселем. В обычных экранах это, похоже, работает нормально с переменной [[position]], переданной в шейдер. Но на экране Retina, где есть коэффициент масштабирования, каждая координата экрана представляет 2x2 (или 3x3) пиксели.Пиксельные координаты в металлическом фрагменте шейдера

Позвольте мне подробно рассмотреть экран iPhone 6: экранные координаты 375x667 и пиксельные координаты - 750x1334. Вот мой код (тест) шейдера:

fragment half4 myFragShader(vtxOut in [[stage_in]], 
          float4 pcoord [[position]]) 
{  
    if(pcoord.x >187.5) //187.5=375/2 
     return half4(1.0 , 0.0 , 0.0, 1.0); // return red 
    else return half4(0.0 , 0.0 , 1.0, 1.0); // return blue 
} 

С выше тестового кода, я получаю (точно) левая половина экрана как синий и правую половину, как красный. Это означает, что pcoord приходит в систему координат 375x667, а не в 750x1334.

Вопросы:

  1. Будет пиксельный шейдер вызывается для каждого пикселя координаты? Или только для каждой экранной координаты?

  2. Если он вызван для каждой пиксельной координаты, как мне получить доступ к каждому пикселю внутри шейдера фрагмента?

Я пробовал то же самое с pcoord.y (в моем коде выше) с аналогичным результатом.

ответ

0

Это мой собственный ответ:

Хотя я не мог понять, почему некоторые простые проекты не дают точную пиксельную-координату в коде шейдера, несколько других проектов, которые я создал действительно давали мне координаты в pixel- координаты (включая коэффициент масштабирования экрана). то есть в моем примере выше, я получил 750x1334 координаты, а не 375x667.

Таким образом, чтобы ответить на два вопроса, я отвечал:

  1. фрагмент шейдера будет вызываться для каждого пиксела coodinate и
  2. in.position.xy дает координаты внутри кода шейдера.

обновляет это после того, как я узнаю, что происходит не так в моих проектах, которые дают координаты в скрин-coordiantes

 Смежные вопросы

  • Нет связанных вопросов^_^