OpenGL: ошибка glAccum 1282 (недопустимая операция) - PullRequest
0 голосов
/ 03 марта 2011

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).

Ответы [ 2 ]

0 голосов
/ 03 марта 2011

Возможно, у вас нет накопительного буфера.Но вам все равно не нужен.Эффекты глубины резкости теперь делаются с помощью шейдеров.Метод накопительного буфера требует рендеринга одного и того же изображения несколько раз;не совсем эффективно.Shader Depth of Field - это эффект постобработки, который использует значения Z-буфера для выбора размера размытого ядра.Идея состоит в том, чтобы собрать значения вокруг текущего фрагмента и добавить каждый соседний фрагмент по размытому размеру ядра, определяемому Z-значением.Чтобы внутренний цикл был маленьким, вы обычно размываете все изображение на несколько размеров ядра и помещаете их в слои 3D-текстуры.Затем эта трехмерная текстура используется для быстрой выборки желаемой интенсивности размытия.

0 голосов
/ 03 марта 2011

Если GL_ACCUM_RED_BITS равен нулю, это означает, что у вас нет буфера накопления, ваша реализация GL должна поддерживать его хотя бы в программном обеспечении.Ошибка в glAccum предполагает также, что буфер накопления не существует.

Почему вы используете буфер накопления в первую очередь?Вы можете сделать тот же эффект, используя шейдеры, объекты Framebuffer и текстуры с плавающей точкой, и он также совместим с современными реализациями OpenGL.

...