2012-05-01 2 views
4

Я работаю над проектом OpenGL в Windows, используя GLEW, чтобы обеспечить функциональность, отсутствующую в заголовках Windows. Для поддержки шейдеров я использую Cg от NVIDIA. Вся документация и примеры кода, которые я прочитал, показывают, что следующий является правильным методом загрузки с помощью шейдеров, и я реализовал вещи так в моем коде:Проблемы с Cg с OpenGL

  1. Создать контекст Cg с cgCreateContext.
  2. Получите последние профили шейных и пиксельных шейдеров, используя cgGLGetLatestProfile с CG_GL_VERTEX и CG_GL_FRAGMENT, соответственно. Используйте cgGLSetContextOptimalOptions, чтобы создать оптимальную настройку для обоих профилей.
  3. Используя эти профили и шейдеры, которые вы написали, создайте шейдерные программы, используя cgCreateProgramFromFile.
  4. Загрузите программы шейдеров, используя cgGLLoadProgram.

Затем каждый кадр, для объекта, который использует данный шейдер:

  1. Bind желаемый шейдер (ы) (вершины и/или пикселя) с использованием cgGLBindProgram.
  2. Включить профили для желаемых шейдеров (ов), используя cgGLEnableProfile.
  3. Извлеките и установите любые необходимые параметры шейдера, используя cgGetNamedParameter и различные функции настройки параметров.
  4. Рендер ваш объект обычно
  5. зачистить шейдер по телефону cgGLDisableProfile

Однако, вещи начинают получать странно. При использовании одного шейдера все работает нормально, но действие загрузки второго шейдера с cgGLLoadProgram, по-видимому, делает объекты с использованием первого прекращения визуализации. Кажется, что переход на порядок тиража разрешает проблему, но вряд ли это будет проблемой. Эта проблема возникает как на ноутбуках моего, так и на моем партнере (довольно недавние компьютеры с интегрированными наборами микросхем Intel).

Я тестировал тот же код на своем рабочем столе с GeForce GTX 260, и все работало нормально. Я бы просто написал это, так как мой ноутбук GPU не ладил с Cg, но я успешно создал и запускал программы, которые используют несколько шейдеров Cg одновременно на моем ноутбуке, используя OGRE graphics engine (к сожалению, назначение, над которым я сейчас работаю, класс компьютерной графики, поэтому я не могу просто использовать OGRE).

В заключение я в тупике. Что такое OGRE, что мой код не является? Я использую Cg неправильно?

+0

AFAIK, cgGLEnableProfile необходимо вызывать только во время инициализации (соответственно, cgGLDisableProfile вызывается только во время срыва). После этого просто вызовите cgGLBindProgram и выведите столько раз, сколько хотите. Вы пытались это сделать? Реализации OpenGL могут обрабатывать cgGLEnableProfile по-разному. – Ani

+0

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

+0

Не можете ли вы просто CgGLBindProgram (0) вернуться к контуру фиксированной функции? Некоторые поисковые системы Google создали следующую ссылку: http://objectmix.com/graphics/135925-disabling-cg-programs.html. Помогает ли это? – Ani

ответ

2

Необходимо позвонить по телефону cgGLEnableProfile, прежде чем звонить по телефону cgGLBindProgram. С вашего вопроса, похоже, вы делаете это наоборот.

Из документации Cg для cgGLBindProgram:

cgGLBindProgram связывает программу с текущим состоянием. Программа должна быть загружена cgGLLoadProgram, прежде чем она может быть связана. Кроме того, профиль программы должен быть включен для привязки к работе. Это можно сделать с помощью функции cgGLEnableProfile.

Смежные вопросы