Nano Hash - криптовалюты, майнинг, программирование

Странная ошибка динамической итерации в шейдере OpenGL

Я пытаюсь превратить массив с плавающей запятой в массив vector2, поскольку массив с плавающей запятой — единственный массив, который я могу передать из кода Java в шейдер. Например, я превращаю float 3.8 в vec2 (3,8). Но это довольно неважно. Настоящая проблема в том, что шейдер перестает работать при добавлении определенной строки в цикл for. Вот мой код:

attribute vec4 a_color;
attribute  vec3 a_position;
attribute vec2 a_texCoord0;

uniform float a_tileCoords[144];
uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoord0;
varying vec2 v_tileCoords[144];

int length = 144;

void main(){
    v_color = a_color;
    v_texCoord0 = a_texCoord0;
    for(int i = 0; i < length; i++){
       int x = int(a_tileCoords[i]);
       int y = int((a_tileCoords[i] - int(a_tileCoords[i])) * 10);
       v_tileCoords[i] = vec2(x,y);
    }
    gl_Position = u_projTrans * vec4(a_position + vec3(0, 1, 0), 1.);
}

Речь идет об этой строке:

v_tileCoords[i] = vec2(x,y);

Когда я удаляю эту строку из цикла for, шейдер снова работает (текстура рисуется). Но я, конечно, хочу, чтобы эта строка работала. Итак, вопрос к вам: что я мог сделать неправильно, или это вообще возможно, чего я хочу достичь?

12.07.2017

  • Ваш дизайн (144 различных vec2s) мне не кажется правильным. 12.07.2017
  • Я хочу, чтобы массив float, который я передал шейдеру, был преобразован в массив vector2. 12.07.2017
  • Я пытаюсь запрограммировать шейдер для освещения. tileCoords предназначены для того, чтобы шейдер знал, через что не может пройти свет. Шейдер применяется к прозрачному наложению размером с окно. Также потребуется взять несколько координат для положений источников света. Это сделает пиксели более прозрачными, чем ближе они к источнику света, и сделает их непрозрачными, если они находятся внутри тайла. Может быть, вы знаете лучший способ сделать это, чем передавать данные шейдеру и использовать только текстуру размером с 1 окно? 12.07.2017
  • Я не совсем понимаю, что вы делаете, но решение, вероятно, состоит в том, чтобы сделать это за два прохода. Нарисуйте данные окклюзии в текстуру FrameBuffer. Во втором шейдере прочитайте эту текстуру. 12.07.2017
  • Кстати. ошибка не в самой строке, сделанная на заказ строка просто заставляет оптимизатор шейдера не полностью оптимизировать цикл и варьирование. 12.07.2017

Ответы:


1

Максимальное количество различных векторов можно определить с помощью MAX_VARYING_VECTORS и ограничивает количество векторов, которые вы можете передать на следующий этап шейдера. Я уверен, что вы превысили лимит.

см. также следующие вопросы:

12.07.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..