Итак, это немного сложно (по крайней мере, для меня), и я нигде не смог найти никакого решения. Я делаю 2D игру в гольф в OpenGL. Фон — это текстура, которую я сделал, у которой будет карта курса. Проблема в том, что границы, где мяч не может безопасно приземлиться (вне границ, песколовок и т. Д.), Не являются геометрическими, поэтому я не могу просто сравнить координаты x и y шара с несколькими значениями, чтобы увидеть, это из. Одна из идей, которую я имею в качестве решения, — это использование альфа-канала текстуры, чтобы отметить, какие пиксели находятся за пределами, а не за пределами. Я хотел бы, чтобы мой шейдер рисовал значения RGB независимо от альфы. Тогда я бы обозначил границы как alpha==1.0f
и вне границ, как alpha==0.0f
или что-то подобное, по крайней мере. Затем я мог бы сэмплировать текстуру по координатам x и y шара, чтобы увидеть, входит она или нет. Большую часть этого я могу выполнить самостоятельно, за исключением одного: как мне сэмплировать текстуру из процессора? Я знаю, что шейдеры на видеокарте могут использовать texture()
функция с sampler2D
а также vec2
и это все нормально, но если единственный вывод (ы) фрагментного шейдера — это цвет вложений (не считая gl_FragDepth
или что-нибудь подобное), тогда как мне вернуть возвращенное альфа-значение обратно в процессор? Или как-то сэмплировать процессор, а не использовать другой шейдер? Или вся эта концепция ошибочна? Любая помощь приветствуется.
Постскриптум Я использую OpenGL 4, если это не ясно.
OpenGL существует для визуализации. Предоставление информации OpenGL с единственной целью последующего ее прочтения является ошибочным.
Вы не должны передавать эту информацию о границах в OpenGL, если только вы не собираетесь использовать ее для рисования изображений. И даже если вы это сделаете, храните его копию на процессоре, чтобы вы могли без проблем запрашивать его. На процессоре вы просто вычисляете координаты пикселя, из которых нужно читать, и читаете из них.
Это ничем не отличается от чтения из 2D-массива.
Других решений пока нет …