Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Ковыряю этот ваш OpenGL. [вопрос в посте #55] (3 стр)

Ковыряю этот ваш OpenGL. [вопрос в посте #55] (3 стр)

Страницы: 1 2 3 4 5 6 7 Следующая »
MrShoorУчастникwww5 авг. 201621:16#30
Synthetic
> Интересно, а почему блендинг не дает записать float ?
Потому что UB. У тебя же блендинг использует альфаканал, в который ты не пишешь.
MrShoorУчастникwww5 авг. 201621:16#31
lexer42152
> да, по дефолту в неприсваемые каналы пишется ноль.
Насколько я знаю - не ноль. Это UB.
lexer42152Постоялецwww5 авг. 201621:19#32
Насколько я знаю - не ноль. Это UB.

может быть, надо спецификацию смотреть. нвидиа во всех известных мне реализациях 0 пишет.

Правка: 5 авг. 2016 21:19

MrShoorУчастникwww5 авг. 201621:39#33
lexer42152
> может быть, надо спецификацию смотреть. нвидиа во всех известных мне
> реализациях 0 пишет.
Из спецификации:
Color values written by a fragment shader may be floating-point, signed integer,
or unsigned integer. If the color buffer has a signed or unsigned normalized
fixed-point format, color values are assumed to be floating-point and are converted
to fixed-point as described in equations 2.4 or 2.3, respectively; otherwise no type
conversion is applied. If the values written by the fragment shader do not match
the format(s) of the corresponding color buffer(s), the result is undefined.

И вот еще:
All alpha values in this section refer only to the alpha component of the fragment
shader output linked to color number zero, index zero (see section 15.2.3).
If the fragment shader does not write to this output, the alpha value is undefined.

Это именно UB.

Правка: 5 авг. 2016 21:40

lexer42152Постоялецwww5 авг. 201621:41#34
MrShoor
)))) Вы меня опередили )))
SyntheticПостоялецwww10 авг. 201613:54#35
Заметил такую хрень.
Если создать контекст OpenGL не в главном окне приложения, а в дочернем (некоем подобии редактора), ну как бы есть главное окно,
в нем еще панельки различные, а в них еще какие нибудь панельки, и вот в одной из панелек сделать вьювер c OpenGL,
то оно начинает медленно рендерить.
Причем на пустой сцене, где один скайбокс, оно рисует один кадр где-то 40 миллисекунд, если размер этого окна почти на весь экран.
Если уменьшать окно, то скорость рисования растет, пропорционально размеру окна. Этот эффект хорошо заметен на относительно слабых видеокартах,
в данном случае на Intel HD 4000. Она то конечно не топовый флагман, но Half-Life 2 тянет на ура, по этому уверен что дело тут не в видеокарте.
В полный софтвар не падает OpenGL точно, ибо если я его вручную в софтвар переключаю, то рисует оно еще медленнее,
где-то два кадра в секунду.
формат задаю так:
    
NSOpenGLPixelFormatAttribute attribs[] =
    {
        // Must specify the 3.2 Core Profile to use OpenGL 3.2
        NSOpenGLPFAOpenGLProfile,
        NSOpenGLProfileVersion3_2Core,
        
        NSOpenGLPFAColorSize, 8,
        NSOpenGLPFADepthSize, 24,
        NSOpenGLPFAStencilSize, 8,
        NSOpenGLPFAAlphaSize, 8,
        
        // Software (floating-point)
        //NSOpenGLPFARendererID,
        //kCGLRendererGenericFloatID,
        
        // Hardware-accelerated onscreen
        NSOpenGLPFANoRecovery,
        NSOpenGLPFAAccelerated,
        
        //NSOpenGLPFADoubleBuffer,
        
        
        // --- msaa ---
        NSOpenGLPFAMultisample,
        NSOpenGLPFASampleBuffers, 1,
        NSOpenGLPFASamples, 4,
        

        0 };

        NSOpenGLPixelFormat *pf = [[NSOpenGLPixelFormat alloc] initWithAttributes: attribs];
        NSOpenGLContext* context = [[NSOpenGLContext alloc] initWithFormat:pf shareContext:nil];
        [self setPixelFormat:pf];
        [self setOpenGLContext:context];
        
        [super prepareOpenGL];
        [[self openGLContext] makeCurrentContext];

Кто сталкивался, куда копать хоть?

AndreyПостоялецwww10 авг. 201614:08#36
Synthetic
Ох, Mac OS X и Cocoa! :)))
рисуешь через NSOpenGLView? если да то мне помог такой код, ссылка в комментариях, правда я создаю контекст на главном окне.
//https://developer.apple.com/library/mac/qa/qa1385/_index.html
-(void)initTimer
{
  renderTimer = [NSTimer timerWithTimeInterval:0.001   //a 1ms time interval
                      target:self
                    selector:@selector(timerFired:)
                    userInfo:nil
                     repeats:YES];
 
  NSRunLoop* currentRunLoop = [NSRunLoop currentRunLoop];
  [currentRunLoop addTimer:renderTimer forMode:NSDefaultRunLoopMode];
  //Ensure timer fires during resize

  [currentRunLoop addTimer:renderTimer forMode:NSEventTrackingRunLoopMode];
}

// Timer callback method
- (void)timerFired:(id)sender
{
  // It is good practice in a Cocoa application to allow the system to send the -drawRect:
  // message when it needs to draw, and not to invoke it directly from the timer.
  // All we do here is tell the display it needs a refresh
  [self setNeedsDisplay:YES];
}
SyntheticПостоялецwww10 авг. 201614:26#37
Andrey
> Ох, Mac OS X и Cocoa! :)))
ага, сплошные сюрпризы блин.

тоже рисую по таймеру, c вызовом

[self setNeedsDisplay:YES];
правда  timerWithTimeInterval:(1.0 / 60.0) для fps 60 сделал, что бы не захлёбывалось.

добавил currentRunLoop и таймер в него (правда не понимаю чем оно помочь должно), результат тот же.
в главном окне оно то работало бы, понять бы почему в дочерних такая хрень.
Или это cocoa не считает нужным дочерние окна быстрее перерисовывать, уже все мозги сломал, пытаясь причину найти.

Правка: 10 авг. 2016 14:47

innuendoПостоялецwww10 авг. 201614:34#38

Andrey
> правда я создаю контекст на главном окне.

Скрытый фанат GL ? А почему не юзаешь чудесный DX на macOS ? Не завезли ? Какая жаль !

AndreyПостоялецwww10 авг. 201614:34#39
Synthetic
> ага, сплошные сюрпризы блин.
Я как-то пробовал решить проблему без Cocoa и Objective C пока безуспешно.
вот прочитай может чего интересного узнаешь:
http://www.gamedev.ru/code/forum/?id=213675

Если тебе не нужен OpenGL 3x-4.1 Core Profile  то можно использовать GLX, правда он требует установки XQuartz ну и версия ограничена OpenGL 2.1.
>Или это cocoa не считает нужным окна быстрее перерисовывать, уже все мозги сломал, пытаясь причину найти.
мона на developer.apple.com спросить может что помогут.

MrShoorУчастникwww10 авг. 201617:17#40
innuendo
> Скрытый фанат GL ? А почему не юзаешь чудесный DX на macOS ? Не завезли ? Какая
> жаль !
Меня поражает как ты преданно за ним бегаешь по всему геймдеву. Не устал еще?

Правка: 10 авг. 2016 17:17

innuendoПостоялецwww10 авг. 201617:23#41
MrShoor
> Меня поражает как ты преданно за ним бегаешь по всему геймдеву.

Я никуда не бегаю, он сам себя подставляет  для стёба:)

Vlad2001_MFSПостоялецwww10 авг. 201618:13#42
Ну все, сейчас тема превратится в очередной спор Andrey и innuendo...
SyntheticПостоялецwww12 авг. 201623:09#43
я правильно понимаю, что время выполнения метода glFlush() или glFinish() может сильно зависеть от мощности видеокарты?
в связке cocoa и OpenGL - оно самое и есть узкое место.
Значение пляшет как-то рандомно от кадра к кадру, в диапазоне от 2  до 40 миллисекунд.
Пипец какой-то.

Правка: 12 авг. 2016 23:28

MrShoorУчастникwww12 авг. 201623:37#44
Synthetic
> Значение пляшет как-то рандомно от кадра к кадру, в диапазоне от 2  до 40
> миллисекунд.
> Пипец какой-то.
А что не так то? Все логично, обе команды сабмитят буфер на рендер. Единственное - glFlush может вернуть управление сразу (но не гарантирует это), а glFinish ждет выполнения всех команд, и только тогда возвращает управление.
Страницы: 1 2 3 4 5 6 7 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр