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和其他網上看到的樣本,我似乎無法看到我做錯了什麼...
對這裏發生的事情有任何線索?
解決了這個問題,謝謝! 仍然看着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
我想它可以在一些GL實現上工作(我認爲如果實現決定在名稱生成的時刻創建對象 - 這不是違反),但它不是規範所要求的,所以你可以'不依賴於這種行爲。 – keltar 2014-10-29 04:11:46