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

标签 c++ opengl shader sdl

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

我已经尝试从硬盘中完全删除着色器。我尝试在调用 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/

相关文章:

opengl - 着色器变量归一化职责

c++ - 使用 dllimport 过程

C++ 在 .size() 之后丢失 vector 元素

c++ - Win32 中机器内进程通信的最佳 IPC 方法是什么?

c++ - 奇怪的编译器错误和模板继承

c++ - 在模拟中使用 GL_ARRAY_BUFFER 时屏幕锁定

java - 保留 JOGL 上下文

c++ - OpenGL "black screen"挫折

java - OpenGL - OpenGL 2.1 中实现的最先进的渲染方法是什么?

Android OpenGL ES 2.0 多重纹理和相机