Intereting Posts
Держите карту в центре независимо от того, где вы зажимаете масштаб на андроиде API-интерфейс Places для Android: получите строки addres из Place.getAddress () Как удалить текст в EditText с помощью TextWatcher? Каждый раз, когда он обнаруживает строку и форматирует ее Использование facebook SDK на Android дает «Пользователь зарегистрирован как пользователь Facebook другого пользователя». Intel XDK отключает вращение RecyclerView – получить все существующие виды / зрители Что это означает «если устройство подключено к GCM» Есть ли какая-либо документация для Android XML? Изменить заголовок панели действий для каждой вкладки. JsPDF с Cordova – Добавление изображений Android – Подтвердите выход приложения с помощью тоста Автофокусировка Android не работает после создания вида камеры Неверные типы ошибок Android: Object и int Как отправить данные с помощью библиотеки okhttp с типом контента x-www-form-urlencoded? Держите TextInputLayout всегда сфокусированным или сохраняйте ярлык всегда расширенным

Как получить доступ к другой вершине в программе вершинного шейдера в opengl es 2?

Я приложение андроида, я хочу вычислить нормаль поверхности, находящейся на другой вершине этой поверхности. Я не хочу делать это в программе «мастера», потому что это занимает много времени. Фактически для каждой вершины i передается 4 массива float для каждого vextex:

attribute vec3 a_bottom; attribute vec3 a_left; attribute vec3 a_right; attribute vec3 a_top; vec3 calculNormal( ) { return normalize( cross( (a_left - a_right) , ( a_bottom - a_top ) ) ); } 

Это очень очень грязный код, который я знаю, поэтому вместо того, чтобы пропустить 4 массива, я хочу сделать это:

 vec3 calculNormal( ) { vec3 a_left = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - 1 ]; vec3 a_bottom = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - X ]; ... return normalize( cross( (a_left - a_right) , ( a_bottom - a_top ) ) ); } 

Так возможно ли в программе вершинного шейдера перейти к текущему буферу с плавающей точкой? Существуют ли специальные ключевые слова, например currentFloat? Или есть еще одна возможность, которую я пропустил?

    Это действительно невозможно. Вершинный шейдер имеет доступ только к обрабатываемой вершине и ее атрибутам. И поскольку OpenGL ES не имеет расширения texture_buffer_object , вы не можете получить доступ к данным VBO внутри шейдера. Таким образом, единственный способ доступа к соседи по вершинам – это явно вставить их в атрибуты вершин, как в первом примере.

    Но поскольку похоже, что ваша геометрия представляет собой прямоугольный шаблон, вы можете также сохранить его в текстуре (или скопировать его в один, расширение pixel_buffer_object может помочь с этим, если оно поддерживается в ES). В этом случае вы можете просто использовать классический шейдер GPGPU-фрагмента, который вычисляет нормали для каждого «пикселя» (в данном случае вершины) выходного изображения (в данном случае нормальных данных прямоугольной геометрии) на основе значений Его соседи (доступ к которым осуществляется простым доступом к тексту).

    Но я думаю, что ни первый, ни второй не были бы вам в действительности, учитывая дополнительные операции надстройки и / или операции копирования памяти, поскольку вычисление вершинных нормалей уже довольно быстро. Вам не нужно делать это в любом кадре, и если вы действительно это делаете, то это потому, что вы также обновляете свои позиции вершин, и в этом случае вы можете использовать ту же самую процедуру обновления для обычных данных (будь то CPU или GPGPU).

    Я хочу вычислить нормаль поверхности, находящейся на другой вершине этой поверхности.

    Неправильный подход. Вычислите нормали и сохраните их вместе с вершинами.

    Я не хочу делать это в программе «мастера», потому что это занимает много времени.

    Вы не должны пересчитывать нормали для каждого прохождения рендеринга. Просто вычислите их один и сохраните их. Вычисления в вершинном шейдере не являются бесплатными. И вычисление нормалей в ВС – это просто отходы вычислительной мощности.

    Рассчитайте их, сохраните.