我正在尝试调试一些着色器,但无法更改当前加载的着色器。我尝试在不加载任何着色器或链接任何程序的情况下运行,但它仍然有效。
我已经尝试从硬盘中完全删除着色器。我尝试在调用 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();
}
最佳答案
SDL_GL_SetAttribute()
只影响下一个 SDL_CreateWindow()
打电话。
来自the doc wiki :
Use this function to set an OpenGL window attribute before window creation.
所以现在您很可能获得一个兼容性上下文,其中无着色器绘制完全有效。您可以检查 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);
关于c++ - 为什么 glDrawElments() 可以在不使用任何着色器的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55587286/