• Как заставить код выполниться лишь раз в почти бесконечном цикле?

    @majstar_Zubr
    C++, C#, gamedev
    void do_one_time() {
         static bool was_called;
         if (!was_called) {
              // ... полезный код
         }
         was_called = true;
    }
    Ответ написан
    Комментировать
  • Компилятор выдает "�", почему?

    edward_freedom
    @edward_freedom
    Потому что, при выборе 1, у тебя условие попадает в int_, в любом другой последующем в char_, хоть ты 2, хоть 4 пиши, попадет в 5, потому что он последний. А все из за того, что ты правильно поставил break только на первое условие, а на остальных нет и всегда будет последнее условие.
    case 1:
    		chose = int_;
    		break;
    	case 2:
    		chose = double_;
    		break;
    	case 3:
    		chose = float_;
    		break;
    	case 4:
    		chose = long_;
    		break;
    	case 5:
    		chose = char_;
    		break;


    Твой код можно сократить с помощью шаблонов
    #include <iostream>
    #include <string> 
    using namespace std;
    enum Chose { int_, double_, float_, long_, char_ };
    
    
    template<typename Tn, typename Tp>
    Tn Power(Tn n, Tp p) {
    	Tn  result =  1;
    	for (int i = 0; i < p; i++)
    	{
    		result = result * n;
    	}
    	return result;
    }
    
    template<typename Tn, typename Tp>
    void UserInput() {
    	Tn  power =  1;
    	Tp  number =  1;
    	cout << "Введите число: ";
    	cin >> number;
    	cout << "Введите степень: ";
    	cin >> power;
    	Tn result = Power(number, power);
    	cout << "Result: " << result << endl;
    }
    
    
    int main()
    {
    	setlocale(LC_ALL, "russian");
    	Chose chose;
    	int chose_;
    	cout << "Выберите действие: ";
    	cin >> chose_;
    
    	switch (chose_)
    	{
    	case 1:
    		UserInput<int, int>();
    		break;
    	case 2:
    		UserInput<double, int>();
    		break;
    	case 3:
    		UserInput<int, float>();
    		break;
    	case 4:
    		UserInput<int, long>();
    		break;
    	case 5:
    		UserInput<double, char>();
    		break;
    	}
    
    	system("pause");
    }
    Ответ написан
    Комментировать
  • Как возможно задать параметры, а именно текстуру отдельно для каждого треугольника?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Коротко, тебе нужно усвоить вот этот урок.

    Развернуто:

    У тебя из атрибутов вершины сейчас есть только позиция. Уникальных вершин для твоей плоскости в таком случае будет всего 4. Под уникальностью у вершины понимается уникальность комбинации всех ее атрибутов.

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

    Под материалом понимается комплекс из программы и ресурсов, которые отображаются на геометрии.
    Материал отображает на геометрию заданный своими свойствами набор текстур и параметров. С точки зрения геометрии, материал - это DIP (Draw Indexed Primitive - твой glDrawElements). С точки зрения шейдера, материал - это комплекс из программы шейдера и набора входных/выходных параметров этой программы.
    Один материал одной геометрии - это один DIP с установкой набора текстур и параметров материала, а так же - с установкой нужного буфера индексов, вершин и инстансов.

    Ты хочешь чтобы Один набор треугольников твоей плоскости имел одну текстуру, а другой - другую. Вот и организуй два материала, у которых одна шейдерная программа, но две разные текстуры. Далее тебе надо ввести больше вершин, т.к. с вводом материала и текстурных координат, с учетом твоих требований, твои 4 вершины больше не могут обеспечить свою уникальность. В тех позициях плоскости, где два смежных треугольника отображают разные текстуры, тебе требуется ввести по две вершины вместо одной.
    Далее - организуй индексный буфер так, чтобы примитивы в нем описывались непрерывной последовательностью для каждого материала отдельно. Т.е. сперва все треугольники с одним материалом, потом все треугольники - с другим.
    Под конец определи инструкции для своей геометрии, сколько DIP-ов согласно твоим требованиям должно быть выполнено, для каких материалов и на какой геометрии.

    Таким образом ты реализуешь очень простую систему поддержки материалов и выполнишь свою задачу.
    Ответ написан
    Комментировать
  • Как возможно задать параметры, а именно текстуру отдельно для каждого треугольника?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Назначаете разные текстурные координаты разным граням - и готово.
    Ответ написан
    7 комментариев