Я работаю над проектом OpenGL в Windows, используя GLEW, чтобы обеспечить функциональность, отсутствующую в заголовках Windows. Для поддержки шейдеров я использую Cg от NVIDIA. Вся документация и примеры кода, которые я прочитал, показывают, что следующий является правильным методом загрузки с помощью шейдеров, и я реализовал вещи так в моем коде:Проблемы с Cg с OpenGL
- Создать контекст Cg с
cgCreateContext
. - Получите последние профили шейных и пиксельных шейдеров, используя
cgGLGetLatestProfile
сCG_GL_VERTEX
иCG_GL_FRAGMENT
, соответственно. ИспользуйтеcgGLSetContextOptimalOptions
, чтобы создать оптимальную настройку для обоих профилей. - Используя эти профили и шейдеры, которые вы написали, создайте шейдерные программы, используя
cgCreateProgramFromFile
. - Загрузите программы шейдеров, используя
cgGLLoadProgram
.
Затем каждый кадр, для объекта, который использует данный шейдер:
- Bind желаемый шейдер (ы) (вершины и/или пикселя) с использованием
cgGLBindProgram
. - Включить профили для желаемых шейдеров (ов), используя
cgGLEnableProfile
. - Извлеките и установите любые необходимые параметры шейдера, используя
cgGetNamedParameter
и различные функции настройки параметров. - Рендер ваш объект обычно
- зачистить шейдер по телефону
cgGLDisableProfile
Однако, вещи начинают получать странно. При использовании одного шейдера все работает нормально, но действие загрузки второго шейдера с cgGLLoadProgram
, по-видимому, делает объекты с использованием первого прекращения визуализации. Кажется, что переход на порядок тиража разрешает проблему, но вряд ли это будет проблемой. Эта проблема возникает как на ноутбуках моего, так и на моем партнере (довольно недавние компьютеры с интегрированными наборами микросхем Intel).
Я тестировал тот же код на своем рабочем столе с GeForce GTX 260, и все работало нормально. Я бы просто написал это, так как мой ноутбук GPU не ладил с Cg, но я успешно создал и запускал программы, которые используют несколько шейдеров Cg одновременно на моем ноутбуке, используя OGRE graphics engine (к сожалению, назначение, над которым я сейчас работаю, класс компьютерной графики, поэтому я не могу просто использовать OGRE).
В заключение я в тупике. Что такое OGRE, что мой код не является? Я использую Cg неправильно?
AFAIK, cgGLEnableProfile необходимо вызывать только во время инициализации (соответственно, cgGLDisableProfile вызывается только во время срыва). После этого просто вызовите cgGLBindProgram и выведите столько раз, сколько хотите. Вы пытались это сделать? Реализации OpenGL могут обрабатывать cgGLEnableProfile по-разному. – Ani
@ananthonline: Я считаю, что профили должны быть отключены до того, как вы нарисуете что-нибудь с фиксированной трубкой функции, нет? На данный момент я не использую шейдеры исключительно, хотя это и есть возможный план. –
Не можете ли вы просто CgGLBindProgram (0) вернуться к контуру фиксированной функции? Некоторые поисковые системы Google создали следующую ссылку: http://objectmix.com/graphics/135925-disabling-cg-programs.html. Помогает ли это? – Ani