Почему glDrawElments () работает без использования каких-либо шейдеров? - PullRequest
2 голосов
/ 09 апреля 2019

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

Я уже пытался полностью удалить шейдеры с моего жесткого диска.Я пытался просто вызвать glUseProgram (с любым случайным числом, включая 0), перед вызовом glDrawElements, и он все еще работает.И даже если я загружу любой шейдер, он просто не дает никакого эффекта.Он по-прежнему показывает ошибки компоновки и компиляции, если я делаю ошибки в файлах, но при запуске исполняемого файла он просто игнорирует то, что находится в шейдерах.

Я рисую вершину с этим

void Renderer::renderFrame() {
    vao.bind();
    glUseProgram(0);
    glDrawElements(GL_LINE_LOOP, 3, GL_UNSIGNED_INT, nullptr);
}

иэто мои оконные подсказки

void App::start() {
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 4);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

    window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 500,500, SDL_WINDOW_RESIZABLE|SDL_WINDOW_OPENGL);
    this->context = SDL_GL_CreateContext(window);
    glewInit();
    glClearColor(0.5,1.0,1.0,1.0);

     renderer.init();
}

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

SDL_GL_SetAttribute() влияет только на следующий SDL_CreateWindow() вызов.

С вики документа :

Используйте эту функцию, чтобы установить атрибут окна OpenGL до создания окна.

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

Если вам нужен базовый контекст, сделайте эти SDL_GL_SetAttribute() звонки до вашего SDL_CreateWindow():

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 500,500, SDL_WINDOW_RESIZABLE|SDL_WINDOW_OPENGL);
this->context = SDL_GL_CreateContext(window);
0 голосов
/ 14 апреля 2019

Если действительный шейдер не связан, то по умолчанию используется фиксированная функция , обычно (вы знаете, GL 1.0 обратная совместимость даже для профиля ядра , иногда в зависимости от поставщика /driver).

Таким образом, если ваши местоположения атрибутов соответствуют используемым фиксированным функциям , то ваш CPU боковой код все еще визуализирует изображение, см .:

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

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

кстати, некоторые драйверы gfx поддерживают ведение журналов и, если включено, сохраняют журналы GLSL в файл самостоятельно ... это можно сделать, например, с помощью nVidia драйверов и NVEmulate

...