debugging - 带有 glObjectLabel 的 OpenGL 调试扩展

标签 debugging opengl

我刚开始在我的项目中使用调试扩展,但 glObjectLabel 在与 GL_BUFFER 一起使用时会生成错误。

显卡是nVidia Quadro 600,驱动340.82

这个简单的测试是用 32 位的 MSVC 2010 构建的:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

void GLAPIENTRY ogl_cb(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam)
{
  using namespace std;
  cout << "message: "<< message << endl;
}

int main()
{
  using namespace std;

  if (!glfwInit())
  {
    cerr << "Error initializing GLFW" << endl;
    return 1;
  }

  glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
  GLFWwindow *window = glfwCreateWindow(1, 1, "", NULL, NULL);
  glfwMakeContextCurrent(window);

  GLint glew_result = glewInit();
  if (GLEW_OK != glew_result)
  {
    cerr << "Error initializing GLEW : " << (const char*)glewGetErrorString(glew_result) << endl;
    return 2;
  }

  cout << "VENDOR          : " << glGetString(GL_VENDOR) << endl;
  cout << "RENDERER        : " << glGetString(GL_RENDERER) << endl;
  cout << "VERSION         : " << glGetString(GL_VERSION) << endl;
  cout << "GLSL VERSION    : " << glGetString(GL_SHADING_LANGUAGE_VERSION) << endl;

  glDebugMessageCallback(ogl_cb, NULL);
  glEnable(GL_DEBUG_OUTPUT);
  glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);

  GLuint progid = glCreateProgram();
  glObjectLabel(GL_PROGRAM, progid, -1, "My program");

  GLuint bufid;
  glGenBuffers(1, &bufid);
  glObjectLabel(GL_BUFFER, bufid, -1, "My buffer");

  char prog_name[100];
  GLsizei prog_name_len = 0;
  glGetObjectLabel(GL_PROGRAM, progid, 100, &prog_name_len, prog_name);
  cout << "Program name " << prog_name_len << " : " << (prog_name_len ? prog_name : "NULL") << endl;

  char buf_name[100];
  GLsizei buf_name_len = 0;
  glGetObjectLabel(GL_BUFFER, bufid, 100, &buf_name_len, buf_name);
  cout << "Buffer name " << buf_name_len << " : " << (buf_name_len ? buf_name : "NULL") << endl;

  glfwDestroyWindow(window);
  glfwTerminate();
  return 0;
}

机器上的输出:

VENDOR          : NVIDIA Corporation
RENDERER        : Quadro 600/PCIe/SSE2
VERSION         : 4.5.0 NVIDIA 340.82
GLSL VERSION    : 4.50 NVIDIA
message: GL_INVALID_VALUE error generated. ObjectLabel: unknown buffer object <name>
Program name 10 : My program
message: GL_INVALID_VALUE error generated. GetObjectLabel: unknown buffer object <name>
Buffer name 0 : NULL

程序一切正常,但缓冲区不正常... 查看来自 www.g-truc.net 和网上其他网站的示例,我似乎看不出我做错了什么......

关于这里发生了什么的任何线索?

最佳答案

您为其分配标签的对象必须已经创建。 glGenBuffers 只保留名称,不创建任何东西。 glCreateProgram则相反,生成一个新名称并创建程序对象。

至少绑定(bind)一次缓冲区对象就足够了。

关于debugging - 带有 glObjectLabel 的 OpenGL 调试扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614130/

相关文章:

python - 如何使用 PyCharm 观察变量?

c - OpenGL 着色器编译代码位于何处?

opengl - OpenGL新手问题:什么是背面剔除?

javascript - Mojarra:提供非缩小的 Javascript 文件

visual-studio - Visual Studio - "attach to particular instance of the process"宏

Java 移位奇怪

opengl - gluUnProject() 的世界坐标问题

c++ - 大面积钻石方形地形生成

c++ - 帧缓冲区对象替代品?

debugging - ClojureScript 中的 js/console.log