Аноны, нужна помощь. Пытаюсь сделать оверлей для игры при помощи перехвата WinAPI функции SwapBuffers. Затем создаю свой контекст, переключаюсь на него, рисую прямоугольник, переключаюсь на контекст игры и вызываю оригинальную функцию SwapBuffers. Прямоугольник появляется и всё бы ничего, но он мерцает. Я мог бы сказать что слабо разбираюсь в OpenGL но это будет враньё. Я вообще в нём не разбираюсь. Но мне позарез нужно устранить эту проблему. Я уже пытался гуглить, пытался отключать проверку глубины, но ничего не получилось. Он всё так же мерцает. Помогите пожалуйста. :(
>>237539984 (OP) SwapBuffers The SwapBuffers function exchanges the front and back buffers if the current pixel format for the window referenced by the specified device context includes a back buffer.
BOOL SwapBuffers( HDC hdc // device context whose buffers get swapped ); Parameters hdc Specifies a device context. If the current pixel format for the window referenced by this device context includes a back buffer, the function exchanges the front and back buffers. Return Values If the function succeeds, the return value is TRUE.
If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
Remarks If the current pixel format for the window referenced by the device context does not include a back buffer, this call has no effect and the content of the back buffer is undefined when the function returns.
With multithread applications, flush the drawing commands in any other threads drawing to the same window before calling SwapBuffers.
>>237539984 (OP) > Проверь как ты создаёшь hdc- hdc Specifies a device context. If the current pixel format for the window referenced by this device context includes a back buffer, the function exchanges the front and back buffers.
>>237545430 > Забивай комментариями отдельные строки и смотри где мерцание пропадёт
Да, ты прав. Если закомментировать строку рисующую прямоугольник то мерцание пропадает. Правда потому что прямоугольника теперь нет. Спасибо! А если серьезно, здесь каждая функция нужна и комментировать тут нечего. Тут скорее добавлять надо что-то, но вот что я не знаю. Возможно нужно как-то контекст мой правильно инициализировать.
>>237545631 > копипаста_с_msdn Спасибо! Я сижу с этой проблемой уже четыре дня и не додумался зайти и почитать описание этой функции!
>>237545992 Я тебе больше скажу. Я его не создаю! Как это так? А вот ТАК. HDC передаётся игрой в функцию SwapBuffers, а так как она мною перехвачена то передаётся в мою а потом моя функция вызывает уже оригинальную функцию с этим же HDC. Не в этом проблема.
>>237547319 >>237547398 Короче скорее всего помимо основного фреймбуфера игра создает еще всякие промежуточные для других проходов. Для теней там и прочей подобной малафьи и та хуйня, которую ты нарисовал, оказывается на экране только иногда. В итоге у тебя ничего не получится, попробуй по другому как-нибудь. Но это всё не точно, я тоже не гуру в opengl и особенно winapi
>>237547703 > Короче скорее всего помимо основного фреймбуфера игра создает еще всякие промежуточные для других проходов. Для теней там и прочей подобной малафьи и та хуйня, которую ты нарисовал, оказывается на экране только иногда.
Точно нет. Я смотрел вызовы функций и там только один игровой контекст.
Так блэд, а что еще за glRectf? Ты из 90х? Если да, то тебе же тогда надо еще сбросить матрицу проекции и модельную по логике вещей, а то иначе твой прямоугольник будет рисоваться умножаясь по текущие значения. Попробуй что-то в духе
glMatrixMode(GL_PROJECTION); glLoadIdentity();
Ну или по-человечески glOrtho2d или какая там функция, лет 10 уже фиксированные функции не видел.
Потом
glMatrixMode(GL_MODELVEW); // вроде так glLoadIdentity();
>>237548538 На данный момент пробую что посоветовал этот великий анон. Просто как он описал всё равно мигает, но я добавил ещё glDisable(GL_DEPTH_TEST) и вот сижу жду, будет ли мерцать или нет.
>>237539984 (OP) Вася, выкидывай ШинАпи, это сейчас никому нахуй не нужно, даже если ты это для себя игру пилишь. Бери SDL2 и уже на его контексте OpenGL запиливай свой мега рендер
>>237551595 При чем тут устройства. Я делаю оверлей для Java Minecraft и хочу чтобы работало с самой первой альфа версии по самую новую. Мой вопрос не в том как рисовать, а почему мерцает.
>>237551684 а причем тут альфа майна.. пиздос.. ты лучше найди чела, который этот майн сможет запустить на устройствах старее 2010 года мерцает - буферизация нужна уже выше тебе несколько анонов отписали (двойная или тройная - на твой ебаный вкус)
>>237551819 При чем тут двойная буферизация? Мой оверлей рисуется к ЛЮБОМУ кадру. Если в игре двойная буферизация значит он будет рисоваться и там и там. Это не я должен реализовывать. Да и если бы проблема была в этом, он мерцал бы КАЖДЫЙ ВТОРОЙ кадр.
>>237551997 ой бля.. ну и куда ты полез с такими познаниями.. твой майн тебе генерит кадр, твоя блядская прога генерит кадр, а чтобы итоговый кадр не мерцал, то тебе надо первые два мерджить в один буфер сначала, а потом уже на новом контексте выводить
майнкрафт-кун, ты? какой месяц идет? с октября-ноября ты свои треды тут создаешь. ты сам хоть что-то будешь писать? пакеты ему "зашифрованы", окна мерцают.
из тебя программист, как из двачера человек. нахуй ты свой велосипед изобретаешь, если читов жопой жуй. а с твоими мозгами ты кроме как килауру на ближайших существ сможешь написать, и то каждый античитит, даже говеный, задетектит твою хунту.
ты изначально выбрал не тот путь - взял бы и инжектил свое жвм оливье прямо в minecraft.jar и сидел бы довольный
>>237539984 (OP) У тебя второй буферок пустой, а ты их свапаешь с буфером с прямоугольником туда-сюда как угорелый, вот и мерцает. Нужно, чтоб во всех буферках у тебя что-то было.
> пакеты ему "зашифрованы" Да, зашифрованы. Как оказалось там RSA шифрование с каким-то костылём, при котором каждый новый пакет тех же данных содержит совершенно другие байты.
> взял бы и инжектил свое жвм Подгружать свою JVM? Что? При чём тут это? Minecraft работает на JVM и она сама уже подгружена. Зачем делать это второй раз? Повторюсь, то как обычно делают читы для этой игры я прекрасно знаю.
>>237553263 >да зашифрованы про encryption и на wiki.vg написано. ты прекрасно знаешь, что я про то, что ты дампил байты и бугуртил с того, что там нечитаемая информация >подгружать свою JVM? Нет. Засунуть в minecraft.jar свое никому нинужное говноподелие. >Как обычно делают читы я прекрасно знаю нет. /thread
>>237553613 > я про то, что ты дампил байты и бугуртил с того, что там нечитаемая информация Я не знал как правильно перевести массив char в нужный мне вид. До создания вопроса здесь, я неоднократно искал то как можно это сделать, находил только std::hex но оно не работало правильно. Видимо мне не повезло.
> Засунуть в minecraft.jar свое никому нинужное говноподелие Это самый идиотский способ делать читы из всех что я знаю.
> нет Да. Можно подгрузить Java класс чита через функцию DefineClass из JVM (или JNI, точно не помню) а можно вовсе вызывать Minecraft функции при помощи JNI. И это только то что я смог назвать с ходу.
Если я делаю что-то, значит я считаю нужным это делать. Твой выбор здесь либо помогать, либо пролистывать тред.
>>237554362 > Нужный вид - это какой? Изначально там был массив char и я бугуртил именно из-за того что выводятся всякие символы-закорючки, тогда как ожидал видеть байты типа "0x41" и так далее. Как только мне подсказали как перевести это в такой вид я больше не бугуртил. Ты что-то путаешь.
>>237539984 (OP) снегурочка ты долбоеб - не создавай свой контекст и не делай текущим - тебе нужно рисовать на чужом контексте поэтому у тебя и мерцает - ты раком опенгл ставить пытаешься впаривая в DC свой контекст - у тебя че блять как два контекста на одном окне рисовать будут? ты еблан? яхуею убери весь код нахуй
должно быть BOOL WINAPI Swapbuffers(HDC dc) { // do your shit here // ясен посох ты тут должен пушнуть атрибуты и стейты, сделать свое рисование и вернуть все взад (хотя это может быть и не обязательно если приложение все перевыставляет в начале кадра) retyrn oldSwapBuffers(dc); }
>>237557015 > ты долбоеб > ты раком опенгл ставить пытаешься > ты еблан?
Скажи это другим людям которые делают таким же образом. Я достаточно часто встречал подобную реализацию когда искал как сделать оверлей. Нужно делать через второй контекст.
>>237557159 ты вообще представляешь как работает опенгл? исходное приложение имеет состояние: - шейдер, матрицы проекции, модели поэтому ТАК прямо нарисовать ты не можешь нужно - glUseProgram(0); если используется шейдер в оригинале нужно glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(...) унжно glMatrixMode(GL_MODELVIEW); glLoadIdentity(); и вот ТОГДА ты можешь делать glBegin(GL_QUADS); если проекция -1 1 -1 1 то твой 0-0.5 квад если проекция по размеру вьюпорта то квад в пикселах окна должен быть - может быть установлена текстура, поэтому glDisable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); // или как там не помню - может быть включен тест глубины поэтому квад не будет виден тк он глубже чем сцена: glDisable(GL_DEPTH_TEST); или кка ваирант сделать glClear(GL_DEPTH_BUFFER_BIT);
>>237557304 а я реализовывал оверлей и вообще знаю опенгл и не знаю таких долбоебов которые на одном DC разными контекстами рисуют
>>237557637 нет конечно ничего не будет мерцать - ты будешь рисовать в контексте самого приложения - в конце рендеринга их кадра, тебе так же будут доступны все их ресурсы, текстуры и тп минус лишь в том что у них настроен стейт опенгл, который желательно сохранять чтобы ничего не сломать, делать свои грязные делишки и восстанавливать все на место
>>237557541 Можешь немного подробнее написать как проверить что использовалось перед вызовом SwapBuffers и как использовать Ortho (и зачем оно вообще) ? Пожалуйста.
>>237558536 >проверить что использовалось перед вызовом SwapBuffers особо не получится, если только взять профайлер типа gDEBugger - он запишет опенгл вызовы и ты узнаешь - используются там шейдеры или нет но вообще обычно там типичные штуки и тебе нужно - отключить чужие шейдеры: glUseProgram(0); - отключить буфер глубины чтобы рисовать поверх кадра glDisable(GL_DEPTH_TEST); - отключить текстуры glDisable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); > как использовать Ortho (и зачем оно вообще) орто - ставит ортографическую проекцию, обычно используют чтобы рисовать в пикселах окна, но в теории можно единичную поставить и тогда будешь рисовать в диапазоне координат -1;1 (если не ошибаюсь, если ошибаюсь - в 0;1 т.е. glMatrixMode(GL_PROJECTION); glLoadIdentity(); // единичная glOrtho(0, 320, 0, 240); // сделает будто в окне рисуешь в координатах до 320х240 (хотя окно может быть 1920х1080 на деле, т.е. координата 320 будет рисоваться в точке 1920) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // единичная - если разрабы ставили перед этим другую - это было положение камеры и объекта в кадре, а так ты сбросил и будешь рисовать где надо // вот тут уже делаешь свои квады
>>237559829 все стало белыми в майнкрафте тк ты же выключил текстуры чтобы нарисовать свой квадрат, в конце - просто включи их обратно так же как тест глубины включил glEnable(GL_TEXTURE_2D);
237559103 (You) >У меня в GL.h вообще не нашло.. glUseProgram - это расширения, есть в glext.h, можешь оттуда скопировать только объявление PFNGLUSEPROGRAM и объявить у себя PFNGLUSEPROGRAMPROC glUseProgram = 0;
в кадре: if(glUseProgram == 0) glUseProgram = GetProcAddress("glUseProgram");
но если в майнкрафте шейдеры - тебе скореев сего нужно получить вначале текущий шейдер чтобы потом его вернуть в конце т.е в конце перед свапом еще glGet(GL_CURRENT_PROGRAM,...); а потом glUseProgram(oldProgram);
>>237560406 если все белое и он белый ты его увидишь? или там не все белое? ну сделай glColor3f(1,0,0); перед квадом, а в конце верни glColor3f(1,1,1);
>>237560405 атрибуты надо , но в теории можно базовые вещи дернуть
ОПУ: >>237560406 а так да - можно атрибутами автоматом возвращать тест глубины и остального что ты изменил при рисовании своей шуки: glPushAttrib(GL_ALL_ATTRIB_BITS); // запомнит установленные текстуры и прочее // твой код который может их сбросить glPopAttrib(); // вернет // swapbuffers
>>237560916 в теории ты все делаешь вроде правильно, но не отключаешь шейдер через gluseprogram(0); если он включен - то задание проекций может не иметь эффекта и глючить, с другой стороны - не понятно как раньше у тебя оно рисовалось ps возможно даже с несколькими контектстами бы должно работать, но такой вариант проблемней обсуждать тк там могут потоки влиять или свапбуфер у каждого свой - я хз
>>237560762 ты покурил что ли? такие как он не умеют мсдн читать (да-да, я тот анон который ему с перехватом трафика помогал) и документацию по огл. для огл надо вообще линал немного знать и понимать как вся эта требуха матричная работает. я ему наооброт пытаюсь подсказать что делать, а он как обезьянка с форумов код копипастит без понимания.
>>237561124 Ого, это ты? Спасибо тебе большое. Насчёт msdn, ты прав, мне почему-то это трудно даётся. Мне намного легче копипастить и вручную перебирать чем пытаться читать. Это не лень. Я не знаю почему. Может я тупой просто..
>>237561859 у меня больше идей нет, вроде все верно делаешь ну можешь еще вернуть установку glViewport и пробовать выставить орто вот так: glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1, 1, 1, -1, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
>>237562011 >>237562090 если бы функции не было - у тебя вернулся бы 0 и приложение падало - раз не падает значит адрес вернулся и функция вызывается, но все же попробуй glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");
в opengl32.dll вообще нихера нет это ICD и там опенгл 1.1 функции-заглушки
>>237562179 > если бы функции не было - у тебя вернулся бы 0 и приложение падало
Стало падать. Может я дебил и забыл пересобрать, но я имею привычку постоянно тыкать на пересборку.. Сомневаюсь что я забыл в тот раз это сделать. 2 раза уже крашился процесс.
БОЖЕ МОЙ КАК Я РАД Я С ЭТИМ 4 ДНЯ СИДЕЛ КАКОЙ ЖЕ Я ТУПОЙ СПАСИБО БОЛЬШОЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Оп, а зачем так пердолиться? Все же давно через MinecraftForge гуи модифицируют, там любой оверлей делается через MinecraftForge.EVENT_BUS.register(твой кастомный обработчик с определённым preRenderOverlay)
>>237539984 (OP) Знаю в чем проблема. "Мерцает" это что? Его небось не видно половину кадров? FPS понизь до 1-2 кадров в секунду и посмотри, сразу увидишь что происходит.
Подобные проблемы возникают чае потому что архитектурно неправильно строят код, т.к. не понимают что происходит при вызове той или иной функции или в том или ином месте.
Работать должно так: Swapbuffers обменивает местами front и back буфер. И происходить это должно ровно один раз на кадр. Прямоугольник и вся графика рисуется в текущем буфере (текущий - back, отображается front). И дело скорее всего в том что прямоугольник ты рисуешь, а потом насильно зачем-то зовешь swapbuffers, принудительно меняя буферы. При этом скорее всего swapbuffers уже (может быть) вызывается откуда-то. Так прямоугольник у тебя всегда оказывается только в одном буфере, а должен по-очереди, то в первом, то во втором.
>>237563360 Боже спасибо еще раз ты даже не представляешь насколько я рад ты не только помог с мерцанием но и избавил меня от второго контекста который мог отнимать ФПС