2014-01-22 16 views
0
#include <typeinfo> 
#include "stdafx.h" 

MainChar::MainChar(){ vboID = 0; vboIndexID = 0; glGetError(); } 

MainChar::~MainChar(){} 

void MainChar::MainChar_VBO_Func() 
{ 
int error = glGetError(); 
if (error == GL_INVALID_ENUM){ std::cout << "Error before I even started!!! : " << error << "\n"; }; 

std::vector<GLdouble> mapVector{ 
-15.000000, -15.000000, 115.000000, -0.577349, 0.577349, 0.577349, -15.000000, -15.000000, -151.000000, -0.577349, 0.577349, -0.577349, 
15.000000, -15.000000, -115.000000, -0.577349, -0.577349, -0.577349, 15.000000, -15.000000, 115.000000, -0.577349, -0.577349, 0.577349, 
-15.000000, 15.000000, 115.000000, 0.577349, 0.577349, -0.577349, -15.000000, 15.000000, -115.000000, 0.577349, -0.577349, -0.577349, 
15.000000, 15.000000, -115.000000, 0.577349, 0.577349, 0.577349, 15.000000, 15.000000, 115.000000, 0.577349, -0.577349, 0.577349 
           }; 

//if (error != GL_NO_ERROR){ std::cout << "Error during mapVector decl: " << error << "\n"; } 

// Setup Vertex Buffer Object 
GLuint vboID = 0; 
//if (error != GL_NO_ERROR){ std::cout << "Error during vboID decl: " << error << "\n"; } 

glGenBuffers(1, &this->vboID); 
//if (error != GL_NO_ERROR){ std::cout << "Error during GenBuffer call-VBO: " << error << "\n"; } 

glBindBuffer(GL_ARRAY_BUFFER, this->vboID); 
//if (error != GL_NO_ERROR){ std::cout << "Error during BindBuffer call-VBO: " << error << "\n"; } 

glBufferData(GL_ARRAY_BUFFER, mapVector.size()*sizeof(GLdouble), &mapVector[0], GL_STATIC_DRAW); 
//if (error != GL_NO_ERROR){ std::cout << "Error during BufferData call-VBO: " << error << "\n"; } 

}Как исправить ошибку GL_INVALID_ENUM при вызове функции?

GLuint MainChar::MainChar_VBO_IndexBuffer_Func() 
{ 

/* Index Buffer Initialization */ 

/* Index Buffer Data */ 

std::vector<GLuint> indexBuffer{ 
5, 1, 6, 2, 2, 3, 1, 4, 6, 2, 7, 5, 3, 6, 2, 3, 7, 5, 8, 7, 4, 8, 3, 6, 
8, 7, 5, 1, 1, 4, 4, 8, 1, 4, 2, 3, 3, 6, 4, 8, 8, 7, 7, 5, 6, 2, 5, 1 
}; 

// Set-up Index Buffer Object 

    int error = glGetError(); 

glGenBuffers(1, &this->vboIndexID); 
    if (error != GL_NO_ERROR){ std::cout << "Error during GenBuffer call-INDEX: " << error << "\n"; } 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->vboIndexID); 
if (error != GL_NO_ERROR){ std::cout << "Error during BindBuffer call-INDEX: " << error << "\n"; } 

glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBuffer.size()*sizeof(GLuint), &indexBuffer[0], GL_STATIC_DRAW); 
if (error != GL_NO_ERROR){ std::cout << "Error during BufferData call-INDEX: " << error << "\n"; } 

return indexBuffer.size(); 

MainChar_VBO_Func() вызывается сразу после того, как проверка glGetError, чтобы убедиться, что никаких проблем не возникает право заранее, и в тот момент, функ называется, регистрируется ошибка. Я даже не передаю значение перечисления при регистрации ошибки. Возможно, он не находит контекст gl? GLEW инициируется, поэтому я не уверен, в чем проблема.

Ниже код, который предшествует и следует непосредственно после вызова Func в вопросе:

int main(int argc, char *argv[]) 
{ 

//INIT SDL 
SDL_Init(SDL_INIT_VIDEO); 
SDL_CreateWindowAndRenderer(800, 600, SDL_WINDOW_OPENGL, &displayWindow, &displayRenderer); 
SDL_GetRendererInfo(displayRenderer, &displayRendererInfo); 

/*TODO: Check that we have OpenGL */ 
if ((displayRendererInfo.flags & SDL_RENDERER_ACCELERATED) == 0 ||(displayRendererInfo.flags & SDL_RENDERER_TARGETTEXTURE) == 0) {} 

SDL_GL_CreateContext(displayWindow); 
//SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 

glewInit(); 
int error = glGetError(); 
if (error != GL_NO_ERROR){ std::cout << "Error during glewInit call: " << error << "\n"; }; 

Display_InitGL(); 
Display_SetViewport(800, 600); 
if (error != GL_NO_ERROR){ std::cout << "Error during Display Set Viewport Issue: " << error << "\n"; }; 


// SET UP TEST OBJ 
MainChar *player = new MainChar(); 
player->MainChar_VBO_Func(); 
unsigned int size = player->MainChar_VBO_IndexBuffer_Func(); 
float count = 0.0; 
// END SET UP OF TEST OBJ 


// Create VAO. Don't forget to enable all necessary states because the VAO starts with default state, cleaning all states prev called to do so. 
GLuint VaoId; 
glGenVertexArrays(1, &VaoId); 
glBindVertexArray(VaoId); 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_ELEMENT_ARRAY_BUFFER); 
// End VAO init 
+0

С одной стороны, это странно: 'glEnableClientState (GL_ELEMENT_ARRAY_BUFFER);' и гарантированно генерирует ошибку 'GL_INVALID_ENUM' для любой реализации. Буфер Element Array используется только при наличии ненулевой одной привязки, когда вы вызываете 'glDrawElements (...)' вам не нужно включать состояние клиента - нет такого состояния клиента для включения. –

ответ

3
  • Do error = glGetError(); после каждого другого вызова к API GL по очевидным причинам
  • Обратите внимание, что glGetError() может вернуться несколько счетчиков ошибок, поэтому вам нужно будет вызвать эту функцию в цикле, пока она не вернет GL_NO_ERROR, или ошибки останутся. Возможна также очистка ошибок до вызова другой функции GL (обычно не требуется очищать ошибки после каждого вызова GL). Однако в последнее время я столкнулся с некоторой ошибкой, которая вызвала бесконечный цикл, потому что glGetError() постоянно возвращал ту же ошибку.
  • Закрепить gDEBugger, чтобы избежать проверки ошибок в Беспорядок
  • При наличии (во время выполнения), используйте ARB_debug_output в режиме отладки вашей программы, по той же причине.
+1

Следует отметить, что 'GL_ARB_debug_output' часто указывается только в строке расширений, если вы создаете специальный контекст отладки. Это иногда заставляет людей поверить, что их реализация не поддерживает расширение, когда оно действительно выполняется. 'GL_KHR_debug' всегда сообщается, даже в контексте без отладки. * Nevermind, я вижу, что эта ссылка связана не с спецификацией 'GL_ARB_debug_output', а с вики-записью, которая уже объясняет это (и на самом деле связана с' GL_KHR_debug'). * –

+0

Я еще больше вызывал вызовы GetError прошлой ночью. Это не принесло пользы. Я выделил проблему для этой конкретной функции. По какой-то причине это неправильно обрабатывает контекст ... – JRFerrell

+0

@ user3204692: вам нужно включить больше контекста в свой вопрос, в частности, показать последовательность событий, которая ведет к вызову 'MainChar_VBO_Func (...)'. Потому что так, как вы это делаете: * «Ошибка до того, как я даже начал !!!»: * * похоже, что это первая функция, которую ваше программное обеспечение вызывает сразу после создания контекста. В этом случае я подозреваю, что GLEW виноват. –

Смежные вопросы