На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Обработка наведения мышки на объект в шейдере , Visual Studio 2010 С++, GLSL
    Здравствуйте.
    Нужно создать поле (например 8 на 5 ячеек). При наведении курсора квадрат под ним окрашивается в другой цвет.
    Собственно задачу эту я решила. Если выводить каждую ячейку поля отдельным квадом (glDrawElements), то потом отследить положение мыши и передать в шейдер нужный цвет не проблема. Но, рисовать в цикле столько объектом (а поле может быть максимально 15 х 15, т.е. 225 ячеек) как-то не очень.
    Поэтому для всех полигонов я значения загоняю в один массив и вывожу один раз, сохраняя атрибуты для вершин (vertex, texcoord, color).
    И вот тут-то и начались проблемы. Как мне в шейдере корректно обработать координаты мышки, чтобы закрашивался ТОЛЬКО один квадрат (ячейка) при наведении на нее курсора? Мои попытки приводят к тому, что в каждой ячейке происходят изменения.
    Объясните как это сделать пожалуйста.
    Скрытый текст

    ExpandedWrap disabled
      // Фрагментный
      uniform vec3 colorMouse;
      uniform vec2 mouse;
       
      void main()
      {
        
        vec3 color;
          color = gl_Color.rgb;  
      // рамки для ячеек
         if(gl_TexCoord[0].x < 0.03  || gl_TexCoord[0].x > 0.97)
                    color = vec3(0.5, 0.5, 0.0);
         if(gl_TexCoord[0].y < 0.03  || gl_TexCoord[0].y > 0.97)
                    color = vec3(0.5, 0.5, 0.0);
        
         vec4 finalColor = vec4(color, 1.0);
         //-----------------------------------------------
      // танцы с бубном... :)
          vec2 pos = gl_TexCoord[0];
          float dist = distance(mouse, pos);
        //if(mouse.x > 0.5)
          if(mouse.x > dist)
              finalColor = vec4(color, 1.0) * vec4(colorMouse, 1.0);
        gl_FragColor = finalColor;
      }

      Пиксельные шейдеры - оперируют 1й точкой
      Вершинные - 1й вершиной

      Получаем, что тут нельзя никак определить попадание в прямоугольник (по простому)

      Геометрические - оперируют треугольниками, но нужен прямоугольник.

      Если известны координаты курсора, и надо определить объект, то это упрощённый обратный raytracing, нужно получить прямую, уходящую вглубь экрана, с учётом угла расширения горизонта и с учётом матриц. Затем считать.

      Лучше это считать до процесса рендеринга. Можно и видяхой.

      Либо сделать еще 1 буфер, куда при рендеренге загонять id объекта.

      Добавлено
      Что-то думается, что создание дополнительного буфера (размер можно иметь раза в 4 меньше размена экрана без особых последствий, а то и в 16, ну и рендерить упрощённю геометрию), с рендерингом id объекта наиболее адекватное решение, можно будет без каких либо проблем определить объект по координатам мыши, частично- и взаимно-перекрытие объекты отработают нормально.
        Axis
        Говоря о id объекта, вы имеете вывод в цикле 225-ти квадратов? или я не верно поняла?
        Если так - то это сделано. Я хотела для одного объекта вывести особую область.
        Не поняла про сделать еще 1 буфер, куда при рендеренге загонять id объекта. Объясните поподробнее пожалуйста.
        Это поле до наведения курсора
        Прикреплённая картинка

        Это - мышь над полем
        Прикреплённая картинка

        Если можно,покажите пример, или дайте ссылку на пример.

        кстати, вывожу треугольниками
        glDrawElements( GL_TRIANGLES, icount, GL_UNSIGNED_INT, 0 );
        Сообщение отредактировано: lio -
          Более подробно моя мысль.
          1. Создаём буферную текстуру, уменьшаем разрешение в по координате в 2, 4, 8, ... раз, тут всё зависит от требуемой точности. В случае если нужно перекрытия, нужен еще буфер глубины.
          2. Создаём матрицу проецирования, по сути изменится только размер буфера. Матрица вида и мира остаются от основной сцены.
          3. Рендерим сцену в буферную текстуру, нужно использовать по возможности максимально простую геометрию. Рендерится отдельными шейдерами, здесь и производится кодирование id объекта в цвете, но в данном случае лучше координаты ячейки в поле (не экранные).
          4. Дальше эта текстура уходит в шейдер рендеринга поля, так же координаты курсора (либо уже преобразованные к 0..1, либо еще размеры экрана передать)
          5. В вершинном шейдере имея координаты курсора получаем координаты ячейки по данной текстуре. Эта текстура нужно только для определения координат ячейки игрового поля, более она ни для чего не нужна.
          6. Отдаём координаты в пиксельный шейдер.
          7. Осталось сделать механизм определения координаты отображаемой ячейки в шейдере. Это либо делать по текстурным координатам, но точность может слегка страдать, да и считать много, либо делать поле таким образом, что на каждый квадрат свои 4 вершины, будут дубли вершин, тогда можно в дополнительных текстурных координатах задать координату ячейки игрового поля. Второй вариант, это равномерно задать всем вершинам доп текстурные координаты от 0 до 1 (дубликатов вершин не будет, но нужно будет 1 делить на кол-во вершин по оси + 1 и используя этот шаг вычислять координату ячейки). Т.е. тут надо иметь возможность легко узнать, координату ячейки игрового поля по текстурной координате поля.
            Я продолжила свои эксперименты выделения мышкой квадратной области под ней в шейдере. И все получилось. ;)
            Прикреплённая картинка
            Прикреплённая картинка

            Красный квадрат акурат под мышкой!
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,1306 ]   [ 18 queries used ]   [ Generated: 18.05.24, 12:08 GMT ]