Почему этот треугольный шейдер, который я написал, разбивается на четыре?

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

Почему этот треугольный шейдер, который я написал, разбивается на четыре?

int edgeFunction(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3){
        return (x2-x1)*(y3-y1)-(y2-y1)*(x3-x1);
}

std::vector<fragment> RGBtri(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3){
        std::vector<fragment> tri; //fragment is a struct with xyrgba

        int minX = std::min(x1, std::min(x2,x3));
        int maxX = std::max(x1, std::max(x2,x3));
        int minY = std::min(y1, std::min(y2,y3));
        int maxY = std::max(y1, std::max(y2,y3));

        int p = edgeFunction(x1,y2,x2,y2,x3,y3);

        for(uint16_t y = minY;y<=maxY;y++){
                for(uint16_t x = minX;x<=maxX;x++){
                        int a = edgeFunction(x2,y2,x3,y3,x,y);
                        int b = edgeFunction(x3,y3,x1,y1,x,y);
                        int c = edgeFunction(x1,y1,x2,y2,x,y);

                        if ((a|b|c)>=0){
                                float d = ((float)a*255/(float)p);
                                float e = ((float)b*255/(float)p);
                                float f = ((float)c*255/(float)p);

                                uint8_t r = static_cast<uint8_t>(d);
                                uint8_t g = static_cast<uint8_t>(e);
                                uint8_t b = static_cast<uint8_t>(f);

                                 tri.push_back({x,y,r,g,b,255});
                        }
                }
         }
          return tri;
}

Много информации я получила здесь

Я попробовал несколько вариантов, но в большинстве случаев мне удалось поменять местами разделы rgb и cmy.

моя цель - иметь красный, зеленый и синий цвета в вершинах основного треугольника, а не разделять

if ((a|b|c)>=0)Я на 99% уверен, что это неправильно. Что вы подразумеваете под этой строкой?
Mike Vine 28.06.2024 17:38

@MikeVine Это проверка того, все ли переменные положительны, и если все они положительны, то точка находится внутри треугольника и помещается в вектор с цветом

Gremlin 28.06.2024 17:44

о лол, ок... Думаю, это сработает, но это определенно выглядит очень странно. Почему бы просто не написать это как обычно и позволить компилятору делать некоторые трюки :)

Mike Vine 28.06.2024 17:48

@MikeVine Я читал, что так будет быстрее, вы правы насчет того, что компилятор делает это за кулисами, | объединяя их вместе и проверяя каждый из них по отдельности, создаются одни и те же инструкции по сборке с включенной оптимизацией O3.

Gremlin 28.06.2024 18:17

Компиляторы пишут люди (на данный момент), и люди пишут правила оптимизации, используемые компиляторами, на основе того, что люди понимают. В большинстве случаев компилятор оптимизирует совершенно глупый, легко распознаваемый и интерпретируемый код, чтобы он был лучше, чем тот хитрый код, который вы оптимизировали вручную. Во-первых, часто рассматриваются целые блоки кода, а не отдельные строки. Общее эмпирическое правило заключается в том, чтобы писать код настолько глупым, насколько это возможно, позволить компилятору его попробовать и делать что-то странное только после того, как вы профилировали вывод компилятора и обнаружили, что он не нужен.

user4581301 28.06.2024 18:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нашел ответ, точка p равна x1 y2 для первой точки, а не x1 y1, abc не следует умножать на 255, результат следует умножить на 255, а затем привести к uint8

std::vector<fragment> RGBtri(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3){
        std::vector<fragment> tri;

        int minX = std::min(x1, std::min(x2,x3));
        int maxX = std::max(x1, std::max(x2,x3));
        int minY = std::min(y1, std::min(y2,y3));
        int maxY = std::max(y1, std::max(y2,y3));

        int p = edgeFunction(x1,y1,x2,y2,x3,y3);

        for(uint16_t y = minY;y<=maxY;y++){
                for(uint16_t x = minX;x<=maxX;x++){
                        int a = edgeFunction(x2,y2,x3,y3,x,y);
                        int b = edgeFunction(x3,y3,x1,y1,x,y);
                        int c = edgeFunction(x1,y1,x2,y2,x,y);

                        if (a>=0&&b>=0&&c>=0){
                                float w1 = ((float)a/(float)p);
                                float w2 = ((float)b/(float)p);
                                float w3 = ((float)c/(float)p);

                                uint8_t R = red.r*w1+green.r*w2+blue.r*w3;
                                uint8_t G = red.g*w1+green.g*w2+blue.g*w3;
                                uint8_t B = red.b*w1+green.b*w2+blue.b*w3;

                                tri.push_back({x,y,R,G,B,255});
                        }
                }
        }

        return tri;

}

Другие вопросы по теме