Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.249.247] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте.
Нужно создать поле (например 8 на 5 ячеек). При наведении курсора квадрат под ним окрашивается в другой цвет. Собственно задачу эту я решила. Если выводить каждую ячейку поля отдельным квадом (glDrawElements), то потом отследить положение мыши и передать в шейдер нужный цвет не проблема. Но, рисовать в цикле столько объектом (а поле может быть максимально 15 х 15, т.е. 225 ячеек) как-то не очень. Поэтому для всех полигонов я значения загоняю в один массив и вывожу один раз, сохраняя атрибуты для вершин (vertex, texcoord, color). И вот тут-то и начались проблемы. Как мне в шейдере корректно обработать координаты мышки, чтобы закрашивался ТОЛЬКО один квадрат (ячейка) при наведении на нее курсора? Мои попытки приводят к тому, что в каждой ячейке происходят изменения. Объясните как это сделать пожалуйста. Скрытый текст // Фрагментный 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; } |
Сообщ.
#2
,
|
|
|
Пиксельные шейдеры - оперируют 1й точкой
Вершинные - 1й вершиной Получаем, что тут нельзя никак определить попадание в прямоугольник (по простому) Геометрические - оперируют треугольниками, но нужен прямоугольник. Если известны координаты курсора, и надо определить объект, то это упрощённый обратный raytracing, нужно получить прямую, уходящую вглубь экрана, с учётом угла расширения горизонта и с учётом матриц. Затем считать. Лучше это считать до процесса рендеринга. Можно и видяхой. Либо сделать еще 1 буфер, куда при рендеренге загонять id объекта. Добавлено Что-то думается, что создание дополнительного буфера (размер можно иметь раза в 4 меньше размена экрана без особых последствий, а то и в 16, ну и рендерить упрощённю геометрию), с рендерингом id объекта наиболее адекватное решение, можно будет без каких либо проблем определить объект по координатам мыши, частично- и взаимно-перекрытие объекты отработают нормально. |
Сообщ.
#3
,
|
|
|
Axis
Говоря о id объекта, вы имеете вывод в цикле 225-ти квадратов? или я не верно поняла? Если так - то это сделано. Я хотела для одного объекта вывести особую область. Не поняла про сделать еще 1 буфер, куда при рендеренге загонять id объекта. Объясните поподробнее пожалуйста. Это поле до наведения курсора
Это - мышь над полем
Если можно,покажите пример, или дайте ссылку на пример. кстати, вывожу треугольниками glDrawElements( GL_TRIANGLES, icount, GL_UNSIGNED_INT, 0 ); |
Сообщ.
#4
,
|
|
|
Более подробно моя мысль.
|
Сообщ.
#5
,
|
|
|