为什么glDrawElments()在不使用任何着色器的情况下工作?

问题描述 投票:2回答:2

我正在尝试调试一些着色器,但我无法更改当前加载的那些。我尝试在不加载任何着色器的情况下运行,或者链接任何程序并且它仍在工作。

我已经尝试完全删除硬盘中的着色器。我试着在调用glDrawElements之前调用glUseProgram(任意随机数,包括0),它仍然有效。即使我加载任何着色器,它也没有任何效果。如果我在文件中出错,它仍然显示链接和编译错误但是当运行可执行文件时它只是忽略着色器中的内容。

我用这个绘制顶点

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();
}
c++ opengl shader sdl
2个回答
0
投票

如果没有绑定有效的着色器,则通常使用默认的固定功能(您知道GL 1.0向后兼容性,即使在核心配置文件上,有时也取决于供应商/驱动程序)。

因此,如果您的属性位置与使用的固定功能匹配,您的CPU端代码仍会呈现图像,请参阅:

但是,位置不是由任何标准定义的,因此对于任何供应商都是不同的(并且可以随时间/驱动程序版本而变化)。只有nVidia定义了它并且在使用多年后仍然使用它...

因此,检查开发中任何着色器的GLSL编译器/链接器日志是一个好主意,以避免混淆...有关如何获取它们的更多信息,请参阅:

顺便说一下一些gfx驱动程序支持日志记录,如果启用它会将GLSL日志保存到一个文件中...例如可以使用nVidia驱动程序和NVEmulate utility


2
投票

SDL_GL_SetAttribute()只影响下一个SDL_CreateWindow()电话。

来自the doc wiki

使用此函数在窗口创建之前设置OpenGL窗口属性。

所以现在你最有可能获得兼容性上下文,其中无着色器绘制是完全有效的。你可以检查一下GL_VERSION的值,看看你得到了什么。

如果你想要一个Core上下文在你的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);
© www.soinside.com 2019 - 2024. All rights reserved.