为什么 glDrawElments() 在不使用任何着色器的情况下工作?
Why glDrawElments() is working without using any shader?
我正在尝试调试一些着色器,但无法更改当前加载的着色器。我尝试 运行 不加载任何着色器或链接任何程序,但它仍然有效。
我已经尝试从硬盘中完全删除着色器。我试图在调用 glDrawElements 之前调用 glUseProgram(使用任何随机数,包括 0),它仍然有效。即使我加载任何着色器,它也不会产生任何效果。如果我在文件中出错,它仍然显示链接和编译错误,但是当 运行 可执行文件时,它只是忽略着色器中的内容。
我用这个画顶点
void Renderer::renderFrame() {
vao.bind();
glUseProgram(0);
glDrawElements(GL_LINE_LOOP, 3, GL_UNSIGNED_INT, nullptr);
}
这是我的 window 提示
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();
}
SDL_GL_SetAttribute()
仅影响 next SDL_CreateWindow()
调用。
来自the doc wiki:
Use this function to set an OpenGL window attribute before window creation.
所以现在您很可能会获得一个兼容性上下文,其中无着色器绘制是完全有效的。您可以检查 GL_VERSION
的值,看看您得到了什么。
如果您想要核心上下文,请在 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);
如果没有绑定有效的着色器,默认的固定函数是通常使用(你知道GL 1.0即使在核心配置文件 有时取决于 vendor/driver).
因此,如果您的 属性位置 与使用的 固定函数 匹配,您的 CPU 侧代码仍然呈现图像见:
- What are the Attribute locations for fixed function pipeline in OpenGL 4.0++ core profile?
然而,这些位置没有由任何标准定义,因此对于任何供应商来说都是不同的(并且可以随着 time/driver 版本而改变)。只有 nVidia 定义了它并且多年后仍在使用它...
因此最好检查 GLSL compiler/linker 日志以了解开发中的任何着色器以避免混淆...有关如何获取它们的更多信息,请参见:
顺便说一句,一些 gfx 驱动程序支持日志记录,如果启用,它会将 GLSL 日志保存到自己的文件中......这可以通过 nVidia 驱动程序和 NVEmulate utility
我正在尝试调试一些着色器,但无法更改当前加载的着色器。我尝试 运行 不加载任何着色器或链接任何程序,但它仍然有效。
我已经尝试从硬盘中完全删除着色器。我试图在调用 glDrawElements 之前调用 glUseProgram(使用任何随机数,包括 0),它仍然有效。即使我加载任何着色器,它也不会产生任何效果。如果我在文件中出错,它仍然显示链接和编译错误,但是当 运行 可执行文件时,它只是忽略着色器中的内容。
我用这个画顶点
void Renderer::renderFrame() {
vao.bind();
glUseProgram(0);
glDrawElements(GL_LINE_LOOP, 3, GL_UNSIGNED_INT, nullptr);
}
这是我的 window 提示
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();
}
SDL_GL_SetAttribute()
仅影响 next SDL_CreateWindow()
调用。
来自the doc wiki:
Use this function to set an OpenGL window attribute before window creation.
所以现在您很可能会获得一个兼容性上下文,其中无着色器绘制是完全有效的。您可以检查 GL_VERSION
的值,看看您得到了什么。
如果您想要核心上下文,请在 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);
如果没有绑定有效的着色器,默认的固定函数是通常使用(你知道GL 1.0即使在核心配置文件 有时取决于 vendor/driver).
因此,如果您的 属性位置 与使用的 固定函数 匹配,您的 CPU 侧代码仍然呈现图像见:
- What are the Attribute locations for fixed function pipeline in OpenGL 4.0++ core profile?
然而,这些位置没有由任何标准定义,因此对于任何供应商来说都是不同的(并且可以随着 time/driver 版本而改变)。只有 nVidia 定义了它并且多年后仍在使用它...
因此最好检查 GLSL compiler/linker 日志以了解开发中的任何着色器以避免混淆...有关如何获取它们的更多信息,请参见:
顺便说一句,一些 gfx 驱动程序支持日志记录,如果启用,它会将 GLSL 日志保存到自己的文件中......这可以通过 nVidia 驱动程序和 NVEmulate utility