Есть ли функция OpenGL для сброса текстуры до сплошного цвета?

Есть ли способ инициализировать или сбросить текстуру OpenGL со сплошным цветом? Я могу использовать функции до OpenGL 4.0, так как я хотел бы поддерживать Intel HD Graphics 4000 для ноутбуков.


person danijar    schedule 19.01.2014    source источник
comment
@fedab Я создаю действительно гибкий конвейер рендеринга. Проходы рендеринга можно переключать или изменять на лету. Таким образом, в каждом проходе рендеринга можно указать резервные варианты, которые выполняются, когда проход отключен, чтобы весь конвейер продолжал работать. Эти запасные варианты включают заливку текстуры сплошным цветом и копирование другой текстуры без изменений.   -  person danijar    schedule 19.01.2014


Ответы (4)


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

И затем вы рисуете фреймбуфер как текстуру.

person fedab    schedule 19.01.2014
comment
В последние часы я так же реализовал очистку и копирование с помощью простых шейдеров. Теперь это работает. Как вы думаете, очистка значительно быстрее, чем использование простого фрагментного шейдера? - person danijar; 19.01.2014
comment
@danijar Не уверен. Вы должны создать и запустить шейдер. Я бы использовал очистку, описанную в OpenGL Wiki. - person fedab; 19.01.2014

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

Но, откровенно говоря, мне кажется, что вы хотите заново реализовать фиксированный конвейер функций OpenGL, где у вас было большое количество переключателей для получения желаемых эффектов. Мы, наконец, избавились от этого, и теперь вы хотите реинкарнировать это проклятие?

person datenwolf    schedule 19.01.2014
comment
Я думаю, что мой конвейер рендеринга разработан достаточно хорошо. Тем не менее, я хотел бы услышать ваши мысли по этому поводу. Проходы рендеринга определяются в файле сценария и могут переключаться во время выполнения с соответствующими откатами. Это мой текущий скрипт конвейера. Также униформу можно установить из скриптов. Видите ли вы ошибки дизайна в моем конвейере, которые я мог бы исправить? - person danijar; 19.01.2014
comment
Проблема с фиксированным конвейером функций заключалась в том, что многие варианты использования не подходили для него. Но что, если потребности запрашивающей программы точно соответствуют возможностям фиксированного функционального конвейера? - person user253751; 08.01.2017

Хотя вы говорите, что можете использовать до GL 4.0 (и у вас есть несколько ответов на этот вопрос), я все же хотел бы отметить, что начиная с GL 4.4 также существует glClearTexImage().

Соответствующее расширение OpenGL для этого — ARB_clear_texture. Говорят, что Intel HD 4000 поддерживает GL4.0, но с более новыми драйверами было добавлено множество расширений, реализующих расширения для уровней 4.1, 4.2 и 4.3. Однако я пока не нашел ни одного источника, утверждающего, что Intel начала внедрять функции уровня 4.4. Последний источник, который я нашел, это OpenGL feature matrix from february 2014, показывающий, что Intel des еще не поддерживает эту функцию. Но я считаю вполне вероятным, что это расширение может поддерживаться в будущих версиях драйверов.

person derhass    schedule 29.03.2014
comment
Вы не знаете, поддерживается ли это графическими драйверами Intel HD в качестве расширения, не так ли? - person danijar; 29.03.2014
comment
Спасибо за ответ и полезный ресурс. - person danijar; 29.03.2014

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

person concept3d    schedule 19.01.2014
comment
Так что я бы создал длинный массив одного цвета для каждого пикселя и отправил бы его на видеокарту, верно? - person danijar; 19.01.2014
comment
@danijar да, как обычное изображение. Что делает это требованием, так это то, что проблема заключается в том, что для очистки буфера (например, кадрового буфера) вам необходимо заблокировать буфер, перебрать его и сбросить каждый пиксель. Эта операция медленная, поэтому реализована аппаратно. В вашем случае у вас нет такой привилегии. Если только вы не можете модифицировать объект текстуры на лету с помощью шейдеров. Проверьте объекты буфера текстуры, но я не уверен в этом. - person concept3d; 19.01.2014
comment
@danijar Вы можете сделать это с помощью FBO, чтобы уменьшить передачу данных на графический процессор. Но для этого потребуется больше работы. - person concept3d; 19.01.2014