Edit: добавлен некоторый код проверки ошибок и обнаружена ошибка «1282», когда я выполняю glAccum (..)
Edit2: я попробовал точно такой же код на другом компьютере, он работаетотлично там.
Edit3: 'Solution' Карты ATI HD4xxx и выше больше не поддерживают накопительные буферы: * (
, поэтому он не работает на 64-битной Windows 7 с HD4850 и додрайверы работают на Windows 7 32bit с IGP Intel серии 4. (GL_ACCUM_RED_BITS = 16). Я также очень быстро попробовал это на машине на базе Linux, точные характеристики которой я не знаю, она тоже там работалаТак что я думаю, что это действительно связано с чем-то на моем компьютере :(. Я не знаю, что, хотя, поэтому любые советы приветствуются.
Вот оригинальный вопрос.
Я пытаюсьиспользовать glAccum для генерации эффекта DOF, но вызовы glAccum, похоже, не имеют никакого эффекта. Я свел проблему к простому тестовому случаю, где в цикле for я перевожу некоторые сферы вдоль оси x.ты можешь видетьсообщается об ошибке, когда я пытаюсь скопировать данные цветового буфера в буфер накопления.
Кроме того, когда я проверяю количество красных битов, доступных в буфере накопления, результат равен 0. Что будет означать, что его нетинициализирован?!
Я настроил режим отображения следующим образом:
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ACCUM | GLUT_DEPTH);
glClearAccum(0.0, 0.0, 0.0, 0.0);
Таким образом, буфер накопления должен быть доступен.
Мой метод отображения выглядит следующим образом:
void display(void)
{
int i;
GLint test[1];
float weigth = 1.0/(float)apertureSamples;
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
HandleKeyboardInput();
glLoadIdentity();
UpdateCamera();
glClear(GL_ACCUM_BUFFER_BIT);
glGetIntegerv(GL_ACCUM_RED_BITS, test);
//No errors here but the number of red bits is 0!?
for(i = 0; i < apertureSamples; i++)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(10*i, 0, 0);
DrawScene(); //draw a couple of spheres
glPopMatrix();
//Still no errors here
glAccum(GL_ACCUM, weigth);
//If I check for errors here I get error 1282
glFlush();
}
glAccum(GL_RETURN, 1.0);
glutSwapBuffers();
}
Теперь я ожидал бы увидеть размытый след сфер, сдвинутый вправо, но я не вижу, вместо этого я вижу только последнюю итерацию forloop (все сферы переведены на х-axis на 10 * appertureSamples).
Чтобы проверить, что glAccum вообще что-то делал, я изменил весовую переменную на 0,00001, что должно отразиться на том, что каждый кадр нарисован очень «тонким» (мойАнглийский словарь оставил меня здесь).Но, похоже, это никак не влияет.Затем я изменил glAccum (GL_RETURN, 1.0) на gl_Accum (GL_RETURN, 0.0001);который опять ничего не сделал (но должен был сделать всю выходную картинку более тонкой.
Я выполнил все шаги в DOF и JITTER отсюда: http://glprogramming.com/red/chapter10.html и я не могу найти ничего, что я 'м отсутствует. У кого-нибудь есть советы?
(Кстати, я делаю это на компьютере под управлением Windows 7 с графическим процессором Radeaon HD4850).