Значит плохо дело 🙁
Задача носит для меня прикладной характер, поэтому сильно углубляться не хотелось бы.
Есть несложный способ ускорить отрисовку?

#3
10:34, 10 фев 2013

отрисовка с помощью
glBegin(. );
glVertex3f(. );
glEnd();
— очень неэффективный способ
лучше использовать glDrawArrays/glDrawElements, а еще лучше расширение ARB_vertex_buffer_object

#4
10:35, 10 фев 2013
#5
13:45, 10 фев 2013

notnA
что glGetError выдает ?
OpenMP создает потоки, и твои вызовы OpenGL с разных потоков идут, а контекст один.

#6
13:55, 10 фев 2013

для кубов которые не отрисовываются glGetError возвращает 1282 (invalid operation, подсказал гугл).
не компетентен в Opengl, «вызовы OpenGL с разных потоков идут, а контекст один» — это значит что должно работать, как я планировал сделать?

#7
15:06, 10 фев 2013

notnA
> для кубов которые не отрисовываются glGetError возвращает 1282 (invalid

Ошибки OpenGL 1280 и 1282 в Minecraft


> operation, подсказал гугл).
Ну вообще я так и думал что будет эта ошибка.
Используй gluErrorString для получения строки с ошибкой.
>это значит что должно работать, как я планировал сделать?
Контекст OpenGL должен быть текущим в том потоке где он работает. У тебя это не так. Ты не делал текущим контекст в другом потоке отсюда и ошибка.
читай основы. Сделай тестовое приложение, пробуй шарить/не шарить контексты может синхронизацию придумаешь и без этого, и только потом пытайся это все реализовать через OpenMP.

#8
15:17, 10 фев 2013

Всем спасибо за информацию. буду копать 🙂

Источник: gamedev.ru

Ошибка opengl 1282 (недопустимая операция) при использовании texture ()

SEUS Minecraft FIX | [Шейдеры] Ошибка Недействительной программы «Composite1 «

У меня есть следующий фрагментный шейдер:

#version 330 core layout (location = 0) out vec4 color; uniform vec4 colour; uniform vec2 light_pos; in DATA < vec4 position; vec2 texCoord; float tid; vec4 color; >fs_in; uniform sampler2D textures[32]; void main() < float intensity = 1.0 / length(fs_in.position.xy — light_pos); vec4 texColor = fs_in.color; if (fs_in.tid >0.0) < int tid = int(fs_in.tid + 0.5); texColor = texture(textures[tid], fs_in.texCoord); >color = texColor * intensity; >

Читайте также:  Чит с крутой килаурой на Майнкрафт

Если я запускаю свою программу, я получаю ошибку opengl 1282, что является недопустимой операцией.

Если я не использую texture (), поэтому я пишу texCoord = vec4 (. ), он работает отлично. Я всегда передаю tid (идентификатор текстуры) как 0 (нет текстуры), поэтому эта часть даже не должна запускаться. Я установил однородность текстур для некоторого заполнителя, но, насколько я знаю, это не имеет значения. Что тогда могло вызвать неправильную операцию?

Ваша компиляция шейдера, скорее всего, не удалась. Убедитесь, что вы всегда проверяете статус компиляции после попытки скомпилировать шейдер, используя:

GLint val = GL_FALSE; glGetShaderiv(shaderId, GL_COMPILE_STATUS, if (val != GL_TRUE) < // compilation failed >

В вашем случае шейдер недопустим, потому что вы пытаетесь получить доступ к массиву семплеров с переменным индексом:

texColor = texture(textures[tid], fs_in.texCoord);

Это не поддерживается в GLSL 3.30. Из спецификации (курсив добавлен):

Сэмплеры, агрегированные в массивы внутри шейдера (с использованием квадратных скобок []), могут быть проиндексированы только с помощью целого постоянный выражения (см. раздел 4.3.3 «Постоянные выражения»).

Это ограничение ослаблено в более поздних версиях OpenGL. Например, из спецификации GLSL 4.50:

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

Это изменение было введено в GLSL 4.00. Но для вашего случая этого все равно будет недостаточно, поскольку вы пытаетесь использовать in переменная в качестве индекса, который не является динамически однородным.

Если все ваши текстуры одинакового размера, вы можете вместо этого рассмотреть возможность использования текстуры массива. Это позволит вам выбрать один из слоев текстуры массива на основе динамически вычисляемого индекса.

  • Я проверил статус компиляции, ничего не вышло. Но я займусь этим.
  • Этот парень делает то же самое и как-то работает: youtube.com/watch?v=1x4hrdS97cI Как это может иметь значение?
  • Посмотрю видео, когда вернусь домой сегодня вечером. Вы также проверяли статус ссылки?
  • Ооо . Я этого не проверял. Я сделаю это. Если видео слишком длинное для вас, значит, у загрузчика есть учетная запись Github с источником.
  • Это интересно. Сегодня я купил современную видеокарту с OpenGL 4.4 (старая поддерживала только 1.3), и с ней код работает без проблем! Итак, как я могу убедиться, что он также работает на других картах с версией 3.3 или около того?
Читайте также:  Как поиграть в Майнкрафт через tunngle

Я знаю, что это решение запоздало, но если это кому-то поможет .

Судя по видео Черно, это должно сработать. Однако он использует атрибут ‘fs_in.tid’ как ‘GL_BYTE’ в gl_VertexAttribPointer для индекса текстуры, по какой-то причине при приведении 1.0f всегда преобразовывался в 0.0f и, следовательно, не работал. Изменение GL_BYTE на GL_FLOAT решило эту проблему для меня.

Что касается «ошибки opengl 1282», это очень распространенная ошибка, с которой я столкнулся. Раньше я забывал вызвать glUseProgram (ShaderID) перед установкой какой-либо формы. Из-за этого униформа, даже если она не использовалась / не была установлена ​​в то время, может вызвать ошибку, а именно «1282». Это могло быть одним из решений, это решило проблему для меня.

Источник: ru.thehiramcollege.net

OpenGL: ошибка glAccum 1282 (недопустимая операция)

Edit2: Я пробовал тот же код на другом компьютере, там он отлично работает.

Edit3: ‘Решение’ Карты ATI HD4xxx и выше больше не поддерживают буферы накопления: * (

Таким образом, он не работает в 7-битной Windows 64 с HD4850 ​​и последними версиями драйверов. Он действительно работает в 7-битной Windows 32 с IGP Intel серии 4. (GL_ACCUM_RED_BITS = 16). Я также очень быстро попробовал это на машине на базе Linux, точных спецификаций которой я не знаю, там она тоже работала. Так что я полагаю, что это действительно связано с чем-то в моем компьютере :(. Я не знаю что, так что любые советы приветствуются.

Вот исходный вопрос.

Я пытаюсь использовать glAccum для создания эффекта глубины резкости, но вызовы 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 (все сферы, переведенные по оси x на 10 * appertureSamples).

Чтобы проверить, делает ли glAccum что-нибудь вообще, я изменил переменную weigth на 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).

задан 03 марта ’11, 12:03

Источник: stackovergo.com