Ответы пользователя по тегу OpenGL
  • У меня есть отрисовка рандомных примитивов (кубов), как мне сделать так, чтобы они не заходили в друг друга при отрисовке?

    > как мне сделать так, чтобы они не заходили в друг друга при отрисовке?
    не позиционировать их при отрисовке так, чтобы они заходили друг в друга.

    Как их не позиционировать так? Ну если это что-то движущееся, то реализуйте определение столкновений и соответствующую физику. Если они статичны, и дело только в генерации - ну реализуйте простейшую сетку и не заполняйте повторно уже занятые ячейки. Тут без конкретной цели вам сложно что-то подсказать.
    Ответ написан
    Комментировать
  • Что выбрать новичку: DirectX или OpenGL?

    OpenGL однозначно, вам и его хватит с головой.

    Изучая DirectX вы иссохнете от того, сколько сопутствующий вещей придётся узнать хотя бы поверхностно - COM например. Возможно кто-то скажет что это не обязательно - да, пока вам не понадобится более-менее серьёзно подебажиться.

    OpenGL выглядит сейчас как самое простое (проще Vulkan, т.к. более высокоуровневый), но при этом полноценное (т.е. достаточно близкое к железу) графическое API без всяких Windows-specific наворотов. DirectX это по сути для профессионалов которые работают в индустрии, получают за это хорошие деньги и для них не проблема разобраться с какой-то сопутствующей технологией.
    Ответ написан
    Комментировать
  • Не правильный куб в LWJGL?

    Беглым взглядом могу сказать что проблема у вас в скорее всего в том самом "переходе" от 2D к 3D. Точнее, в его отсутствии.

    Недостаточно просто взять и вписать трёхмерные координаты. Вам нужно доучить матчать по видовым и проекционным матрицам и задействовать glMatrixMode с последующей загрузкой нужной матрицы. Сейчас вы, грубо говоря, не рисуете трёхмерный куб - вы рисуете его как двухмерную фигуру, не задействуя третью координату так как вы хотели бы.

    И да, ещё важный момент. Не имел дела с указанной вами библиотекой, но похоже что вы сейчас пользуетесь вызовами OpenGL старых версий, и работаете в "старой" модели программирования. В целях обучения это может даже и лучше, но это не готовит вас к современному OpenGL из реального мира. В современном подходе для матричных преобразований используются шейдеры (и это лишь ничтожная часть того что можно сейчас делать с помощью шейдеров различных типов), а координаты примитивов задаются не последовательными вызовами glVertex (что крайне неэффективно с учётом производительности современных GPU), а построением буферов данных заранее и отрисовкой всего набора вершин целиком (см. glDrawElements и прочие функции).

    Так что если вы делаете это всё исключительно для понимания мат. части - в принципе пока вам достаточно и этого, но если вам нужны актуальные умения - найдите книги/примеры/уроки посвежее. Это можно сделать и позже, когда вы будете к этому лучше подготовлены (к сожалению, современный OpenGL не может быть простым, хотя бы из-за очень больших возможностей современных граф. процессоров).
    Ответ написан
    Комментировать
  • OpenGL или DirectX?

    Nipheris
    @Nipheris Куратор тега C++
    Зависит от ваших текущих знаний и пожеланий, особенно от того, насколько вы готовы разбираться с каждой их технологий.

    OpenGL это кроссплатформенное API, раньше было не очень удобно начинать работу с ним на Винде, сейчас доступны различные библиотеки (GLEW, GLFW) и это больше не проблема.
    DirectX возможно даст вам больше возможностей, но там много заморочек с Windows-специфичными вещами, т.к. DirectX работает через технологию COM. Поначалу будет непривычно.

    Я бы на вашем месте начал с OpenGL и посматривал на Vulkan. Знание OpenGL полезно ещё тем, что проще будет использовать родственные API, например WebGL, если захотите писать внутрибраузерный код.
    Ответ написан
    Комментировать
  • Почему WebGL такой медленный (с пустым шейдером)?

    (хотя и в GPU тоже копируется, но опять же, 60 раз).

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

    gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
    Вот так делать нельзя. Создание и заюзание буфера разделили не для того чтобы вам жизнь усложнять. Попробуйте избавиться от этого и сделайте нормально.
    Ответ написан
    1 комментарий
  • Аналоги Substance material?

    Сходу гуглится такое:
    libnoise.sourceforge.net/examples/textures
    https://www.reddit.com/r/proceduralgeneration/comm... (обсуждение на реддите вопроса, очень похожего на ваш).

    Кроме того, вся демосцена живёт на процерудной генерации, можете погуглить тулы или доки от известных демогрупп (Conspiracy, Farb-rausch), может что-то полезное найдёте.
    Ответ написан
  • Как убрать черные полосы при рендере окружности в LibGdx?

    Этот дефект называется алиасинг. Рискну предположить, что это изображение вы рисуете с помощью концентрических кругов. Если это так, то дефекты возникают из-за того, что функция, рисующая окружность, округляет значения координат точек круга "в разные стороны" для различных значений радиусов окружности, и результат рисования окружности для R=1.5 (условно) не "согласуется" с результатом рисования окружности с радиусом R=1.6. Из-за этого остаются черные незакрашеннные точки.

    Избавиться от этого можно по-разному. Например, рисовать изображение, проходя ВСЕ пиксели, претендующие на попадание на окружность, но для каждого из них вычислять значение цвета по расстоянию до центра окружности. Тогда у вас не будет незакрашенных точек изображения.
    Ответ написан
    1 комментарий
  • Как повернуть объект на определенный угол в OpenGL?

    Вам необходимо научиться применять геометрические преобразования к входным геометриям (вершинам ваших мешей).
    В любом случае это происходит путем вычисления и использования матриц поворота. Для получения математической основы гуглите операции с матрицами и векторами (линейная алгебра, выч. геометрия).
    Как это делать конкретно в OpenGL - зависит от используемой вами версии API. Если это "старый" OpenGL, например версии 2.0, то там glRotate и прочие функции оперирования матрицами мировых и видовых преобразований. Если это OpenGL 3.0 и позже - то читайте про вершинные шейдеры и преобразования вершин в шейдерах.
    Ответ написан
    Комментировать
  • OpenGl камера нужна помощь?

    Nipheris
    @Nipheris Куратор тега C++
    Во-первых, условимся, что в рамках вопроса не делаем различий между OpenGL и DirectX. Будем называть их "графическим API".
    Во-вторых, будем считать это графическое API низкоуровневым (т.е. таким, как OpenGL и DirectX). Графические движки, где есть понятие сцены и камеры не рассматриваем в принципе.

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

    Для графического API НИКАКОЙ КАМЕРЫ НЕ СУЩЕСТВУЕТ.

    Для графического API существуют только примитивы (треугольники, линии, точки), которые вы хотите нарисовать, состоящие из вершин с трехмерными координатами и набор математических преобразований, которые вы хотите выполнить над этими вершинами ПЕРЕД тем, как они начнут реально рисоваться на экране (т.е. перед их растеризацией). ВСЁ. Все, что для вас выглядит как движение/поворот объекта в игровом мире ("мировые преобразования"), и движение/поворот камеры ("видовые преобразования") - лишь результат того, что вектора, задающие вершины объекта (например, кубика) предварительно умножаются на нужную, рассчитанную вами матрицу.

    Лет 10-15 назад такая матрица отдавалась непосредственно графическому API через специальные вызовы (когда видяхи уже умели делать T&L https://en.wikipedia.org/wiki/GeForce_256 , но еще не умели шейдеры), сегодня умножение вектора на матрицу - всего лишь одно из множества различных преобразований, которые можно выполнить в векторном шейдере.

    Теперь читайте про то, как эти матрицы используются и рассчитываются. Когда поймете матчасть, гляньте библиотеку GLM (раз уж у вас указано C++ и OpenGL) - она поможет не делать вам рутинную работу.
    Ответ написан
    Комментировать
  • Можно ли перейти от реализации для win(opengl,height map)?

    Nipheris
    @Nipheris Куратор тега C++
    0) закапываем GLUT, берем GLFW (www.glfw.org ); если это неприемлемо, отпишитесь в комментариях, сделаем другую инструкцию;
    1) берем пример, делаем окно по примеру: www.glfw.org/documentation.html
    2) когда убедились, что окно появляется и все работает, начинаем перетягивать код из урока;
    3) вызов кода отрисовки (который DrawGLScene) вставляем вместо /* Render here */;
    4) объявления виндовых дескрипторов убираем (HDC, HWND и прочие); windows.h тоже вроде не нужен;
    5) для обработки событий клавиатуры читаем вот это: www.glfw.org/docs/latest/input.html#input_keyboard , для мыши вот это: www.glfw.org/docs/latest/input.html#input_mouse . По сути все элементарно: устанавливаются колбэки, в которых уже находится код обработки;
    6) для того, чтобы адекватно выйти из главного цикла приложения (это тот, который while (!glfwWindowShouldClose(window))) в нужном месте (например, по нажатию ESC) вызываем glfwSetWindowShouldClose.

    Итого WindowProc вам уже не нужна, из WinMain возможно понадобится код инициализации и код обработки клавиатуры нужно будет вынести в колбэк.
    Вопросы в комментарии, все сразу не расскажешь.

    P.S. Вообще поищите современные туториалы, это OpenGL 2.0, этот API уже никому не нужен, в 3-м OpenGL всю архитектуру перекроили (зачем? Например затем, что вызывать glVertex для каждой вершины - это слишком затратно). Старые уроки вам будут полезны только для общего развития в CG.
    Ответ написан
    2 комментария
  • Какую цветовую модель использует OpenGL?

    Nipheris
    @Nipheris Куратор тега C++
    > 4 компоненты, явно не RGBA
    это шутка такая?

    > Значение варьируются от 0 до 1
    да, значения во float-е, так удобнее интерполяцию делать. 0.0 это 0, 1.0 это 255.
    Ответ написан
    2 комментария
  • World Editor war3 на с++ и openGl?

    Nipheris
    @Nipheris Куратор тега C++
    Но давайте представим что у меня 500 трех угольников у каждого по 3 точки то есть 500*3=1500 переменных , ну это бред !


    Действительно, бредовее ничего не видел. Вы слышали про struct-ы, классы, массивы? Что мешает сделать так:

    struct point {
       float x, y, z;
    };
    
    struct triangle {
      point points[3];
    };
    
    triangle triangles[500]; // вот ваши 500 треугольников, рисуйте их как хотите
    triangles[234].points[3].z = 155; // вот я меняю координату у 234-го треугольника
    Ответ написан
    1 комментарий
  • Как исправить проблему с выравниваем байтов при загрузке изображения с помощью libjpeg?

    Nipheris
    @Nipheris Куратор тега C++
    Придется задать несколько уточняющих вопросов:
    0) libjpeg обязательно? Если вам для загрузки текстур, FreeImage отлично подойдет, он конечно толще по-определению, но с ним проще на порядок, да и формат переключить сможете, если что.
    1) вы уверены, что проблема в том, как грузится текстура, а не как вы рисуете? Если в шейдере сплошным цветом залить, все нормально отрисовывается?
    2) с цветами проблемы есть? форматы цвета точно совпадают?
    3) как решаете проблему с тем, что размер картинки - не степень двойки?
    4) getTextureWidth(), getTextureHeight() - что делают эти вызовы? Какой размер у текстуры получается?
    Ответ написан
  • Насколько сложны игры на c++ и openGL?

    Nipheris
    @Nipheris Куратор тега C++
    Сложности в создании игр у вас будет три:
    1) программирование, и C++ в частности - не лучший язык для изучения программирования, хотя как второй по счету язык - вполне подойдет. Как инструмент для разработки игр, плюсы, безусловно, лидируют.
    2) компьютерная графика, и OpenGL в частности - вам нужно будет хорошо разобраться, как рассчитываются изображения, и как собирается финальная картинка. Для разработки игр вам понадобится знание графического конвейера, шейдеров, понимание общих принципов растровой и векторной графики (что такое цвет, пиксель, растр, как задаются векторные примитивы), понимание принципов анимации (как рисовать движущуюся картинку).
    3) математика, и линейная алгебра в частности. Операции с матрицами и векторами - это минимум, без которого даже 2d не сделаешь. Если захотите всяческие реалистичные эффекты - это еще и физика, в частности - механика. Прежде чем нарисовать летящий по баллистической траектории снаряд, нужно сначала рассчитать, ГДЕ он будет находиться на экране (в виртуальном пространстве) в каждый промежуток времени. Ну и так со всей начинкой игры. Вам следует четко понимать, что если вы не собираетесь брать готовый графический движок, то opengl вам сможет лишь нарисовать что-либо что вы ему скажете. Что рисовать и где - вы должны будете запрограммировать сами, во всех деталях.
    Как уже сказал GavriKos, геймдев - сложная область, можно сказать двигатель прогресса в технологиях развлечений. Конечно далеко не все разработчики игр участвуют в создании самых современных движков или крупнейших MMO-проектов, однако отставать в этой индустрии нельзя - только игры с оригинальной идеей могут позволить себе графику 10-летней давности, например.
    Ответ написан
    Комментировать
  • Как сделать изменение окна в OpenGL, что бы при изменении размера окна картинка не масштабировалась?

    Nipheris
    @Nipheris Куратор тега C#
    В общем случае вам нужно поработать с проекционной матрицей (у вас - gluPerspective) и glViewport. Можете попробовать у вьюпорта поставить константы вместо ширины и высоты контрола.
    Ответ написан
    Комментировать
  • C# sharpGL рендеринг текста как вывести кириллицу?

    Nipheris
    @Nipheris Куратор тега C#
    может быть когда в c код буквы "я", она в операции с+1 превращается в ноль? Вы бы объяснили сначала цель этого преобразования (+1 ко всем байтам).
    Ответ написан
    Комментировать