如何在函数调用中修复GL_INVALID_ENUM错误?

时间:2014-01-22 22:56:08

标签: opengl

#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"; }

}

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();

在检查glGetError之后立即调用MainChar_VBO_Func()以确保没有事先发生问题,并且在调用func的那一刻,记录错误。在记录错误时,我甚至不会传递枚举值。是否可能找不到gl上下文? GLEW是def发起的,所以我不确定问题是什么。

以下是有问题的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

1 个答案:

答案 0 :(得分:3)

  • 出于显而易见的原因,彼此之后执行error = glGetError();
  • 注意,glGetError()可能会返回多个错误枚举器,因此您需要在循环中调用此函数,直到它返回GL_NO_ERROR或错误仍然存​​在。在调用另一个GL函数之前以这种方式清除错误也可能是必要的(通常不希望在每次单个GL调用之后清除错误)。但是,我最近遇到了一些错误,导致无限循环,因为glGetError()不断返回相同的错误。
  • 附加gDEBugger,以避免错误检查混乱
  • 如果可用(在运行时),请在程序的调试模式下使用ARB_debug_output,原因相同。