2016-12-01 6 views
0

Я конвертирую png в текстуры со стороны java и рисую их на пользовательских позициях на экране в 2D-поверхности. В моем случае это точка 0,0 верхний левый угол экрана. Нижний правый угол - это, например, 1024x768. Теперь я хочу реализовать что-то вроде ImageView с эффектом прокрутки. Это означает, что во время прокрутки будут некоторые текстуры, видимые только частично. Например, верхние текстуры (верхние элементы) будут пропускать верхнюю часть, а нижние текстуры (нижние элементы) пропустят нижнюю часть.OpenGL ES 2.0 - как рисовать только часть текстуры с шейдерами?

Я использую стандартные вершинные и фрагмент шейдер:

precision mediump float; 
varying vec2 v_texCoord; 
uniform sampler2D s_texture; 

void main() 
{ 
    gl_FragColor = texture2D(s_texture, v_texCoord); 
} 
//------------ 
uniform mat4 uMVPMatrix; 
attribute vec4 vPosition; 
attribute vec2 a_texCoord; 
varying vec2 v_texCoord; 

void main() 
{ 
    gl_Position = uMVPMatrix * vPosition; 
    v_texCoord = a_texCoord; 
} 

Пусть говорят, мой ImageView немного прокручиваются, и я вижу только 70% от высоты детали верхних текстур? Первые 30% должны быть невидимыми. Как изменить шейдер вершин или фрагментов?

Я использую OpenGL ES 2.0

Спасибо

ответ

1

Два пути реализации этого:

(1) Есть негабаритный прямоугольник, который представляет всю текстуру и изменить gl_Position излучаемый от вершины шейдер, чтобы обеспечить свиток. Подумайте о физическом перемещении прямоугольника вверх и вниз в трехмерном пространстве, и вы получите эту идею.

Область между координатами -1 и +1 в пространстве клипов (вывод из вершинного шейдера). Например. если вы хотите, чтобы средние 50% текстуры были видимыми и заполняли весь экран (измельчение сверху и снизу на 25%), вы выбрали квадрат текстуры с координатами от +2 до -2. Детали за пределами видимого пространства клипа (+1 -> +2 и -2 -> -1) будут просто отсечены.

(2) Держите прямоугольник того же размера на экране и меняйте координаты текстуры v_texCoord, испускаемые вершинным шейдером. В этом случае вы хотите уменьшить значения, чтобы обеспечить падение. Координаты между 0.0 и 1.0 представляют всю текстуру, поэтому, если вы хотите отключить верхние 30%, которые вы хотите использовать (от 0,3 до 1,0) или (от 0,0 до 0,7), в зависимости от вашего определения «сверху».

+0

Второй способ звучит лучше для моих целей. Я думаю, что знаю, как это сделать, и я попробую это на простом примере. Я считаю, что эта тема может быть интересной для многих людей, поэтому, если кто-то может добавить простой пример, я буду очень рад. Большое спасибо. – user1063364