2014-10-28 98 views
0

我剛開始在我的項目中使用調試擴展,但glObjectLabel與GL_BUFFER一起使用時會生成一個錯誤。使用glObjectLabel的OpenGL調試擴展

圖形卡是的NVIDIA Quadro 600與340.82驅動程序

這個簡單的測試是在32位建有2010 MSVC:

#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和其他網上看到的樣本,我似乎無法看到我做錯了什麼...

對這裏發生的事情有任何線索?

回答

3

您將標籤分配給的對象必須已經創建。 glGenBuffers只保留名稱,不創建任何內容。 glCreateProgram,相反,生成一個新名稱並創建程序對象。

綁定緩衝區對象至少一次就足夠了。

+0

解決了這個問題,謝謝! 仍然看着g-truc示例(https://github.com/g-truc/ogl-samples/blob/master/tests/gl-430-debug.cpp)第136行: glGenBuffers(buffer :: MAX,&BufferName [0]); glObjectLabel(GL_BUFFER,BufferName [buffer :: ELEMENT],-1,「元素數組緩衝區對象」); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,BufferName [buffer :: ELEMENT]); 該標籤在第一次綁定之前,在生成之後立即設置。這項工作如何? – toownky 2014-10-28 19:24:50

+0

我想它可以在一些GL實現上工作(我認爲如果實現決定在名稱生成的時刻創建對象 - 這不是違反),但它不是規範所要求的,所以你可以'不依賴於這種行爲。 – keltar 2014-10-29 04:11:46