Войти
ПрограммированиеФорумГрафика

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

Страницы: 1 2 3 4 58 Следующая »
#30
21:16, 5 авг. 2016

Synthetic
> Интересно, а почему блендинг не дает записать float ?
Потому что UB. У тебя же блендинг использует альфаканал, в который ты не пишешь.


#31
21:16, 5 авг. 2016

lexer42152
> да, по дефолту в неприсваемые каналы пишется ноль.
Насколько я знаю - не ноль. Это UB.

#32
(Правка: 21:19) 21:19, 5 авг. 2016
Насколько я знаю - не ноль. Это UB.

может быть, надо спецификацию смотреть. нвидиа во всех известных мне реализациях 0 пишет.
#33
(Правка: 21:40) 21:39, 5 авг. 2016

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.
#34
21:41, 5 авг. 2016

MrShoor
)))) Вы меня опередили )))

#35
13:54, 10 авг. 2016

Заметил такую хрень.
Если создать контекст 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];

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

#36
14:08, 10 авг. 2016

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];
}
#37
(Правка: 14:47) 14:26, 10 авг. 2016

Andrey
> Ох, Mac OS X и Cocoa! :)))
ага, сплошные сюрпризы блин.

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

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

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

#38
14:34, 10 авг. 2016

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

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

#39
14:34, 10 авг. 2016

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 спросить может что помогут.

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

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

#42
18:13, 10 авг. 2016
Ну все, сейчас тема превратится в очередной спор Andrey и innuendo...
#43
(Правка: 23:28) 23:09, 12 авг. 2016

я правильно понимаю, что время выполнения метода glFlush() или glFinish() может сильно зависеть от мощности видеокарты?
в связке cocoa и OpenGL - оно самое и есть узкое место.
Значение пляшет как-то рандомно от кадра к кадру, в диапазоне от 2  до 40 миллисекунд.
Пипец какой-то.

#44
23:37, 12 авг. 2016

Synthetic
> Значение пляшет как-то рандомно от кадра к кадру, в диапазоне от 2  до 40
> миллисекунд.
> Пипец какой-то.
А что не так то? Все логично, обе команды сабмитят буфер на рендер. Единственное - glFlush может вернуть управление сразу (но не гарантирует это), а glFinish ждет выполнения всех команд, и только тогда возвращает управление.

Страницы: 1 2 3 4 58 Следующая »
ПрограммированиеФорумГрафика