PDA

View Full Version : Access violation in GLDrawArrays()



swtsvn
11-24-2014, 12:48 PM
Hi, I was using OpenGL couple years back. Now I am rendering using OpenGL again for a different project.
I am getting Access Violation error in glDrawArray of a simple triangle.
Attaching code here for review.
I googled for the error, and went through the solutions given. But I couldn't find the source of error in my code. Any help is greatly appreciated. Thanks.






void VerifyGL() {
GLenum err;
if((err = glGetError()) != GL_NO_ERROR) {
char sFinalMessage[1536];
sprintf_s(sFinalMessage, "Error! %u", err);
MessageBoxA(NULL, sFinalMessage, "Error", MB_ICONERROR);
assert(false);
}
}

In loader.cpp





void LoadShader(_In_ const std::wstring& FileName, _Out_ GLShader* shader)
{
//Find type.
std::wstring Ext = FileName.substr(FileName.size()-4, 4);
int Type = Ext == L"vert" ? GL_VERTEX_SHADER : (Ext == L"frag" ? GL_FRAGMENT_SHADER : GL_GEOMETRY_SHADER);


FILE* fp = nullptr;
_wfopen_s(&fp, FileName.c_str(), L"rt");
if(!fp){ return;}


std::vector<string> SourceLines;
char Line[255];
while(fgets(Line, 255, fp))
{
SourceLines.push_back(Line);
}
fclose(fp);


const char** ShaderSourceArray = new const char*[SourceLines.size()];
for(int i = 0 ; i < SourceLines.size(); i++)
{
ShaderSourceArray[i] = SourceLines[i].c_str();
}


GLuint ID = glCreateShader(Type);
glShaderSource(ID, (GLsizei)SourceLines.size(), ShaderSourceArray, NULL);
VerifyGL();
glCompileShader(ID);
delete[] ShaderSourceArray;
int result = 0;
glGetShaderiv(ID, GL_COMPILE_STATUS, &result);
if(!result){
char sInfoLog[1024];
char sFinalMessage[1536];
int iLogLength;
glGetShaderInfoLog(ID, 1024, &iLogLength, sInfoLog);
sprintf_s(sFinalMessage, "Error! Shader file %s wasn't compiled! The compiler returned:\n\n%s", FileName.c_str(), sInfoLog);
MessageBoxA(NULL, sFinalMessage, "Error", MB_ICONERROR);
return;}


shader->Initialize(ID, Type);


}

In Main.cpp
In Init() :


SpriteInfo* Info = new SpriteInfo();
glGenVertexArrays(1, &(Info->VertexArrayObject));
VerifyGL();
glBindVertexArray(Info->VertexArrayObject);
VerifyGL();
glGenBuffers(1, &(Info->VertexBuffer));
VerifyGL();
glBindBuffer(GL_ARRAY_BUFFER, Info->VertexBuffer);
VerifyGL();
glBindVertexArray(0);


loader->LoadShader( L"Shaders\\VertexShader.vert", m_vertexShader.Get()); //assume loader is initialized.
loader->LoadShader( L"Shaders\\PixelShader.frag", m_pixelShader.Get());


ShaderProgram = glCreateProgram();
VerifyGL();
glAttachShader(ShaderProgram, m_vertexShader->GetID());
VerifyGL();
glAttachShader(ShaderProgram, m_pixelShader->GetID());
VerifyGL();


glBindAttribLocation(ShaderProgram, 0, "pos");
glLinkProgram(ShaderProgram);
int result = 0;
glGetProgramiv(ShaderProgram, GL_LINK_STATUS, &result);
if(!result)
{
char sInfoLog[1024];
char sFinalMessage[1536];
int iLogLength;
glGetProgramInfoLog(ShaderProgram, 1024, &iLogLength, sInfoLog);
sprintf_s(sFinalMessage, "Error! Link Shaders : %s", sInfoLog);
MessageBoxA(NULL, sFinalMessage, "Error", MB_ICONERROR);
return;
}

In Main.cpp Draw()



glUseProgram(ShaderProgram);
VerifyGL();
float PositionArray[6];
PositionArray[0] = 0;
PositionArray[1] = 0.5;
PositionArray[2] = -0.5;
PositionArray[3] = -0.5;
PositionArray[4] = 0.5;
PositionArray[5] = -0.5;


glBindBuffer(GL_ARRAY_BUFFER, SpriteToDraw->VertexBuffer);
VerifyGL();
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), &PositionArray[0], GL_STATIC_DRAW); // Using static_draw in draw() call for testing purposes. Actual code would be changing the position of the triangle every frame and would be using dynamic_draw.
VerifyGL();
glBindVertexArray(SpriteToDraw->VertexArrayObject);
VerifyGL();
glBindBuffer(GL_ARRAY_BUFFER, SpriteToDraw->VertexBuffer);
VerifyGL();
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0 );
VerifyGL();
glEnableVertexAttribArray(0);
VerifyGL();


glDrawArrays(GL_TRIANGLES, 0 , 3); // memory access violation error.
VerifyGL();