Jump to content

  • Log In with Google      Sign In   
  • Create Account

#ActualTocs1001

Posted 30 November 2012 - 04:37 PM

Case Closed:

I'm an idiot, a typo in ibo.Write() caused the program to not write the indices to the IBO and thus it didn't render anything. It works now.


I've been working on a "graphics framework" (I use this term loosely), I've put OpenGL concepts into C++ classes so I can use them more easily, at any rate I decided to give them a simple test of a fullscreen quad. I init opengl to 3.1, set the clear color to blue, and start the renderloop. The quad is set to show up as white, yet I still see blue so the quad is not showing up.

First off here's my code using my framework stuff
[source lang="cpp"]//The quad, it's not there!class ScreenQuad{ Tocs::Graphics::VBO vbo; Tocs::Graphics::IBO ibo; Tocs::Graphics::VAO vao; Tocs::Graphics::Shader QuadShader;public: ScreenQuad(); void Draw (Tocs::Graphics::Texture2D &texture);};struct CrappyVertex{ float x,y,z; float u,v;};//Crappy Fullscreen quad class, meant more as a test than a utilityScreenQuad::ScreenQuad(void) : vbo (4 * sizeof(CrappyVertex)), ibo (6){ CrappyVertex vertices [4] = {{1,1,0,0,0},{-1,1,0,1,0},{1,-1,0,0,1},{-1,-1,0,1,1}}; vbo.Write (vertices,4,0); unsigned short indices[6] = {0,1,2, 1,3,2}; ibo.Write (indices,6,0); VertexFormat format; format.AddMember ("Position",VertexType::Vec3,false); format.AddMember ("TexCoord",VertexType::Vec2,false); vao.Bind (); vao.AddVBO (vbo,format); vao.UnBind (); ShaderCode vertcode (ShaderType::Vertex); vertcode.CompileFromFile ("Quad.vert"); if (!vertcode.Compiled ()) { cout << vertcode.GetCompileErrors () << endl; return; } ShaderCode fragcode (ShaderType::Pixel); fragcode.CompileFromFile ("Quad.frag"); if (!fragcode.Compiled ()) { cout << fragcode.GetCompileErrors () << endl; return; } QuadShader.SetOutput ("Color",0); QuadShader.AddCode (vertcode); QuadShader.AddCode (fragcode); QuadShader.SetAttribute ("InPosition",0); QuadShader.SetAttribute ("InTextureCoordinate",1); QuadShader.Link (); if (!QuadShader.Linked ()) { cout << QuadShader.GetLinkErrors () << endl; } cout << "InPosition: " << QuadShader.GetAttribute ("InPosition") << endl << "InTextureCoordinate: " << QuadShader.GetAttribute ("InTextureCoordinate") << endl << "Color: " << QuadShader.GetOutput ("Color") << endl;}void ScreenQuad::Draw (Tocs::Graphics::Texture2D &texture){ QuadShader.Bind (); //QuadShader["Texture"] = texture; //Segfaults without "Texture" uniform being used. vao.Bind (); ibo.Bind (); GraphicsContext::DrawTriangles (2); ibo.UnBind (); vao.UnBind (); QuadShader.UnBind ();}[/source]

This probably wont help as much because you can't see the OpenGL, so I went inside each function and copied down the OpenGL calls so I could see more clearly the order the functions were being called. And got this.

Note: All OpenGL calls have a Debug error check, all calls are giving GL_NO_ERROR
[source lang="cpp"]glGenVertexArrays (1,&vao.ID);glGenBuffers (1,&vbo.ID);glBindBuffer (GL_ARRAY_BUFFER,vbo.ID);glBufferData (GL_ARRAY_BUFFER,static_cast <GLsizeiptr> (Size),nullptr, GL_DYNAMIC_DRAW);glBindBuffer (GL_ARRAY_BUFFER,0);glGenBuffers (1,&ibo.ID);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glBufferData (GL_ELEMENT_ARRAY_BUFFER,static_cast <GLsizeiptr> (Format.GetSize () * IndiceCount),nullptr, GL_DYNAMIC_DRAW);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);CrappyVertex vertices [4] = {{1,1,0.5,0,0},{-1,1,0.5,1,0},{1,-1,0.5,0,1},{-1,-1,0.5,1,1}};glBindBuffer (GL_ARRAY_BUFFER,vbo.ID); glBufferSubData (GL_ARRAY_BUFFER, 0, 20*4, vertices);glBindBuffer (GL_ARRAY_BUFFER,0);unsigned short indices[6] = {0,1,2, 1,3,2};glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glBufferSubData (GL_ELEMENT_ARRAY_BUFFER,static_cast <GLintptr> (offset * sizeof (unsigned short)),6 * sizeof (unsigned short), static_cast <void *> (indices));glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);glBindVertexArray (vao.ID);glBindBuffer (GL_ARRAY_BUFFER,vbo.ID);int index = 0;unsigned int Offset = 0;for (auto i = Members.begin (); i != Members.end (); ++i){ glEnableVertexAttribArray (index); glVertexAttribPointer (index,(*i).GetType ().GetComponentCount (), (*i).GetType ().GetGLFormat (),(*i).IsNormalized (),Size,reinterpret_cast <GLvoid *> (Offset)); Offset += (*i).Size(); ++index;} //Gets called with GL_FLOAT 3 components, 12 bytes and GL_FLOAT 2 components, 8 bytesglBindBuffer (GL_ARRAY_BUFFER,0);glBindVertexArray (0);QuadShader.ID = glCreateProgram ()vertcode.ID = glCreateShader(GL_VERTEX_SHADER)glShaderSource (vertcode.ID,1,&codecstr,nullptr);glCompileShader (vertcode.ID);fragcode.ID = glCreateShader(GL_FRAGMENT_SHADER)glShaderSource (fragcode.ID,1,&codecstr,nullptr);glCompileShader (fragcode.ID);glBindFragDataLocation (QuadShader.ID,0,"Color");glAttachShader (QuadShader.ID,vertid);glAttachShader (QuadShader.ID,fragid);glBindAttribLocation (QuadShader.ID,0,"InPosition");glBindAttribLocation (QuadShader.ID,1,"InTextureCoordinate");glLinkProgram (QuadShader.ID);////////////////////////////////////////////////////////DRAWglUseProgram (QuadShader.ID);glBindVertexArray (vao.ID);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glDrawElements (GL_TRIANGLES, 2*3, GL_UNSIGNED_SHORT, nullptr);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);glBindVertexArray (0);glUseProgram(0);[/source]
And in case the shader may be the problem here they are.
[source lang="cpp"]//Vert#version 130precision highp float;in vec3 InPosition;in vec2 InTextureCoordinate;out vec2 TextureCoordinate;void main(){ TextureCoordinate = InTextureCoordinate; gl_Position = vec4(InPosition.xy,0,1);} //Frag#version 130precision highp float;uniform sampler2D Texture;in vec2 TextureCoordinate;out vec4 Color;void main(){ //Color = texture2D(Texture,TextureCoordinate); Color = vec4(1,1,1,1);} [/source]
I'm hoping it's something simple I've overlooked and someone will be able to point it out fairly quickly. Any comments, insights, insults, or other thoughts are welcome.

Thanks


EDIT: For a more complete view, I generated a log of the application startup through the first frame with gDEbugger.
[source lang="cpp"]glGetError()wglDeleteContext(0x00010000)wglMakeCurrent(0x6D012800, 0x00010001)glGetString(GL_SHADING_LANGUAGE_VERSION)glGetString(GL_VERSION)glViewport(0, 0, 800, 800)glGetError()glClearColor(0, 0, 0, 0)glGetError()glClearDepth(1000)glGetError()glDisable(GL_DEPTH_TEST)glGetError()glDisable(GL_BLEND)glGetError()glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST)glGetError()glGenBuffers(1, 0x0018FC2C)glGetError()glBindBuffer(GL_ARRAY_BUFFER, 1)glGetError()glBufferData(GL_ARRAY_BUFFER, 80, 0x00000000, GL_DYNAMIC_DRAW)glGetError()glBindBuffer(GL_ARRAY_BUFFER, 0)glGetError()glGenBuffers(1, 0x0018FC34)glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2)glGetError()glBufferData(GL_ELEMENT_ARRAY_BUFFER, 12, 0x00000000, GL_DYNAMIC_DRAW)glGetError()glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)glGetError()glGenVertexArrays(1, 0x0018FC40)glCreateProgram() [Context 2 - program 1]glBindBuffer(GL_ARRAY_BUFFER, 1)glGetError()glBufferSubData(GL_ARRAY_BUFFER, 0, 80, 0x0018FAA0)glGetError()glBindBuffer(GL_ARRAY_BUFFER, 0)glGetError()glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2)glGetError()glBindVertexArray(1)/////////////HERE! Is where the missing glBufferSubData () call should go.glGetError()glBindBuffer(GL_ARRAY_BUFFER, 1)glGetError()glEnableVertexAttribArray(0)glGetError()glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 20, 0x00000000)glGetError()glEnableVertexAttribArray(1)glGetError()glVertexAttribPointer(1, 2, GL_FLOAT, FALSE, 20, 0x0000000C)glGetError()glBindBuffer(GL_ARRAY_BUFFER, 0)glGetError()glBindVertexArray(0)glGetError()glCreateShader(GL_VERTEX_SHADER) [Context 2 - Shader 2: source code is not available]glGetError()glShaderSource(2, 1, 0x0018F5C4, 0x00000000) [Context 2 - shader 2]glGetError()glCompileShader(2) [Context 2 - shader 2]glGetError()glGetShaderiv(2, GL_COMPILE_STATUS, 0x0018F7E0) [Context 2 - shader 2]glGetError()glCreateShader(GL_FRAGMENT_SHADER) [Context 2 - Shader 3: source code is not available]glGetError()glShaderSource(3, 1, 0x0018F5C4, 0x00000000) [Context 2 - shader 3]glGetError()glCompileShader(3) [Context 2 - shader 3]glGetError()glGetShaderiv(3, GL_COMPILE_STATUS, 0x0018F7E0) [Context 2 - shader 3]glGetError()glBindFragDataLocation(1, 0, 0x0018F7DC)glGetError()glAttachShader(1, 2) [Context 2 - program 1][Context 2 - shader 2]glAttachShader(1, 3) [Context 2 - program 1: shader 2][Context 2 - shader 3]glBindAttribLocation(1, 0, InPosition) [Context 2 - program 1: shader 2, shader 3]glGetError()glBindAttribLocation(1, 1, InTextureCoordinate) [Context 2 - program 1: shader 2, shader 3]glGetError()glLinkProgram(1) [Context 2 - program 1: shader 2, shader 3]glGetObjectParameterivARB(1, GL_LINK_STATUS, 0x0018F7D0) [Context 2 - program 1: shader 2, shader 3]glGetError()glGetObjectParameterivARB(1, GL_VALIDATE_STATUS, 0x0018F7D0) [Context 2 - program 1: shader 2, shader 3]glGetError()glGetObjectParameterivARB(1, GL_ACTIVE_UNIFORMS, 0x0018F7C4) [Context 2 - program 1: shader 2, shader 3]glGetError()glGetProgramiv(1, GL_INFO_LOG_LENGTH, 0x0018F7C8) [Context 2 - program 1: shader 2, shader 3]glGetError()glGetProgramInfoLog(1, 1, 0, ) [Context 2 - program 1: shader 2, shader 3]glGetError()glGetFragDataLocation(1, 0x0018F7DC)glGetAttribLocation(1, InTextureCoordinate) [Context 2 - program 1: shader 2, shader 3]glGetAttribLocation(1, InPosition) [Context 2 - program 1: shader 2, shader 3]glDeleteShader(3) [Context 2 - shader 3]glGetError()glDeleteShader(2) [Context 2 - shader 2]glGetError()glGenTextures(1, {0})glBindTexture(GL_TEXTURE_2D, 1) [Context 2 - Texture 1: No preview available]glGetError()glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) [Context 2 - Texture 1: No preview available]glGetError()glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) [Context 2 - Texture 1: No preview available]glGetError()glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) [Context 2 - Texture 1: No preview available]glGetError()glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) [Context 2 - Texture 1: No preview available]glGetError()glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 100, 100, 0, GL_RED, GL_UNSIGNED_SHORT, 0x00000000) [Context 2 - Texture 1: No preview available]glGetError()glBindTexture(GL_TEXTURE_2D, 0)glClearColor(0.39215687, 0.58431375, 0.92941177, 1)glGetError()glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)glGetError()glUseProgram(1) [Context 2 - program 1: shader 2, shader 3]glGetError()glBindVertexArray(1)glGetError()glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2)glGetError()glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0x00000000)glGetError()glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)glGetError()glBindVertexArray(0)glGetError()glUseProgram(0) [Context 2 - program 0]glGetError()wglSwapBuffers(0x6D012800) [/source]

#4Tocs1001

Posted 30 November 2012 - 04:13 PM

I've been working on a "graphics framework" (I use this term loosely), I've put OpenGL concepts into C++ classes so I can use them more easily, at any rate I decided to give them a simple test of a fullscreen quad. I init opengl to 3.1, set the clear color to blue, and start the renderloop. The quad is set to show up as white, yet I still see blue so the quad is not showing up.

First off here's my code using my framework stuff
[source lang="cpp"]//The quad, it's not there!class ScreenQuad{ Tocs::Graphics::VBO vbo; Tocs::Graphics::IBO ibo; Tocs::Graphics::VAO vao; Tocs::Graphics::Shader QuadShader;public: ScreenQuad(); void Draw (Tocs::Graphics::Texture2D &texture);};struct CrappyVertex{ float x,y,z; float u,v;};//Crappy Fullscreen quad class, meant more as a test than a utilityScreenQuad::ScreenQuad(void) : vbo (4 * sizeof(CrappyVertex)), ibo (6){ CrappyVertex vertices [4] = {{1,1,0,0,0},{-1,1,0,1,0},{1,-1,0,0,1},{-1,-1,0,1,1}}; vbo.Write (vertices,4,0); unsigned short indices[6] = {0,1,2, 1,3,2}; ibo.Write (indices,6,0); VertexFormat format; format.AddMember ("Position",VertexType::Vec3,false); format.AddMember ("TexCoord",VertexType::Vec2,false); vao.Bind (); vao.AddVBO (vbo,format); vao.UnBind (); ShaderCode vertcode (ShaderType::Vertex); vertcode.CompileFromFile ("Quad.vert"); if (!vertcode.Compiled ()) { cout << vertcode.GetCompileErrors () << endl; return; } ShaderCode fragcode (ShaderType::Pixel); fragcode.CompileFromFile ("Quad.frag"); if (!fragcode.Compiled ()) { cout << fragcode.GetCompileErrors () << endl; return; } QuadShader.SetOutput ("Color",0); QuadShader.AddCode (vertcode); QuadShader.AddCode (fragcode); QuadShader.SetAttribute ("InPosition",0); QuadShader.SetAttribute ("InTextureCoordinate",1); QuadShader.Link (); if (!QuadShader.Linked ()) { cout << QuadShader.GetLinkErrors () << endl; } cout << "InPosition: " << QuadShader.GetAttribute ("InPosition") << endl << "InTextureCoordinate: " << QuadShader.GetAttribute ("InTextureCoordinate") << endl << "Color: " << QuadShader.GetOutput ("Color") << endl;}void ScreenQuad::Draw (Tocs::Graphics::Texture2D &texture){ QuadShader.Bind (); //QuadShader["Texture"] = texture; //Segfaults without "Texture" uniform being used. vao.Bind (); ibo.Bind (); GraphicsContext::DrawTriangles (2); ibo.UnBind (); vao.UnBind (); QuadShader.UnBind ();}[/source]

This probably wont help as much because you can't see the OpenGL, so I went inside each function and copied down the OpenGL calls so I could see more clearly the order the functions were being called. And got this.

Note: All OpenGL calls have a Debug error check, all calls are giving GL_NO_ERROR
[source lang="cpp"]glGenVertexArrays (1,&vao.ID);glGenBuffers (1,&vbo.ID);glBindBuffer (GL_ARRAY_BUFFER,vbo.ID);glBufferData (GL_ARRAY_BUFFER,static_cast <GLsizeiptr> (Size),nullptr, GL_DYNAMIC_DRAW);glBindBuffer (GL_ARRAY_BUFFER,0);glGenBuffers (1,&ibo.ID);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glBufferData (GL_ELEMENT_ARRAY_BUFFER,static_cast <GLsizeiptr> (Format.GetSize () * IndiceCount),nullptr, GL_DYNAMIC_DRAW);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);CrappyVertex vertices [4] = {{1,1,0.5,0,0},{-1,1,0.5,1,0},{1,-1,0.5,0,1},{-1,-1,0.5,1,1}};glBindBuffer (GL_ARRAY_BUFFER,vbo.ID); glBufferSubData (GL_ARRAY_BUFFER, 0, 20*4, vertices);glBindBuffer (GL_ARRAY_BUFFER,0);unsigned short indices[6] = {0,1,2, 1,3,2};glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glBufferSubData (GL_ELEMENT_ARRAY_BUFFER,static_cast <GLintptr> (offset * sizeof (unsigned short)),6 * sizeof (unsigned short), static_cast <void *> (indices));glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);glBindVertexArray (vao.ID);glBindBuffer (GL_ARRAY_BUFFER,vbo.ID);int index = 0;unsigned int Offset = 0;for (auto i = Members.begin (); i != Members.end (); ++i){ glEnableVertexAttribArray (index); glVertexAttribPointer (index,(*i).GetType ().GetComponentCount (), (*i).GetType ().GetGLFormat (),(*i).IsNormalized (),Size,reinterpret_cast <GLvoid *> (Offset)); Offset += (*i).Size(); ++index;} //Gets called with GL_FLOAT 3 components, 12 bytes and GL_FLOAT 2 components, 8 bytesglBindBuffer (GL_ARRAY_BUFFER,0);glBindVertexArray (0);QuadShader.ID = glCreateProgram ()vertcode.ID = glCreateShader(GL_VERTEX_SHADER)glShaderSource (vertcode.ID,1,&codecstr,nullptr);glCompileShader (vertcode.ID);fragcode.ID = glCreateShader(GL_FRAGMENT_SHADER)glShaderSource (fragcode.ID,1,&codecstr,nullptr);glCompileShader (fragcode.ID);glBindFragDataLocation (QuadShader.ID,0,"Color");glAttachShader (QuadShader.ID,vertid);glAttachShader (QuadShader.ID,fragid);glBindAttribLocation (QuadShader.ID,0,"InPosition");glBindAttribLocation (QuadShader.ID,1,"InTextureCoordinate");glLinkProgram (QuadShader.ID);////////////////////////////////////////////////////////DRAWglUseProgram (QuadShader.ID);glBindVertexArray (vao.ID);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glDrawElements (GL_TRIANGLES, 2*3, GL_UNSIGNED_SHORT, nullptr);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);glBindVertexArray (0);glUseProgram(0);[/source]
And in case the shader may be the problem here they are.
[source lang="cpp"]//Vert#version 130precision highp float;in vec3 InPosition;in vec2 InTextureCoordinate;out vec2 TextureCoordinate;void main(){ TextureCoordinate = InTextureCoordinate; gl_Position = vec4(InPosition.xy,0,1);} //Frag#version 130precision highp float;uniform sampler2D Texture;in vec2 TextureCoordinate;out vec4 Color;void main(){ //Color = texture2D(Texture,TextureCoordinate); Color = vec4(1,1,1,1);} [/source]
I'm hoping it's something simple I've overlooked and someone will be able to point it out fairly quickly. Any comments, insights, insults, or other thoughts are welcome.

Thanks


EDIT: For a more complete view, I generated a log of the application startup through the first frame with gDEbugger.
[source lang="cpp"]glGetError()wglDeleteContext(0x00010000)wglMakeCurrent(0x6D012800, 0x00010001)glGetString(GL_SHADING_LANGUAGE_VERSION)glGetString(GL_VERSION)glViewport(0, 0, 800, 800)glGetError()glClearColor(0, 0, 0, 0)glGetError()glClearDepth(1000)glGetError()glDisable(GL_DEPTH_TEST)glGetError()glDisable(GL_BLEND)glGetError()glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST)glGetError()glGenBuffers(1, 0x0018FC2C)glGetError()glBindBuffer(GL_ARRAY_BUFFER, 1)glGetError()glBufferData(GL_ARRAY_BUFFER, 80, 0x00000000, GL_DYNAMIC_DRAW)glGetError()glBindBuffer(GL_ARRAY_BUFFER, 0)glGetError()glGenBuffers(1, 0x0018FC34)glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2)glGetError()glBufferData(GL_ELEMENT_ARRAY_BUFFER, 12, 0x00000000, GL_DYNAMIC_DRAW)glGetError()glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)glGetError()glGenVertexArrays(1, 0x0018FC40)glCreateProgram() [Context 2 - program 1]glBindBuffer(GL_ARRAY_BUFFER, 1)glGetError()glBufferSubData(GL_ARRAY_BUFFER, 0, 80, 0x0018FAA0)glGetError()glBindBuffer(GL_ARRAY_BUFFER, 0)glGetError()glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2)glGetError()glBindVertexArray(1)glGetError()glBindBuffer(GL_ARRAY_BUFFER, 1)glGetError()glEnableVertexAttribArray(0)glGetError()glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 20, 0x00000000)glGetError()glEnableVertexAttribArray(1)glGetError()glVertexAttribPointer(1, 2, GL_FLOAT, FALSE, 20, 0x0000000C)glGetError()glBindBuffer(GL_ARRAY_BUFFER, 0)glGetError()glBindVertexArray(0)glGetError()glCreateShader(GL_VERTEX_SHADER) [Context 2 - Shader 2: source code is not available]glGetError()glShaderSource(2, 1, 0x0018F5C4, 0x00000000) [Context 2 - shader 2]glGetError()glCompileShader(2) [Context 2 - shader 2]glGetError()glGetShaderiv(2, GL_COMPILE_STATUS, 0x0018F7E0) [Context 2 - shader 2]glGetError()glCreateShader(GL_FRAGMENT_SHADER) [Context 2 - Shader 3: source code is not available]glGetError()glShaderSource(3, 1, 0x0018F5C4, 0x00000000) [Context 2 - shader 3]glGetError()glCompileShader(3) [Context 2 - shader 3]glGetError()glGetShaderiv(3, GL_COMPILE_STATUS, 0x0018F7E0) [Context 2 - shader 3]glGetError()glBindFragDataLocation(1, 0, 0x0018F7DC)glGetError()glAttachShader(1, 2) [Context 2 - program 1][Context 2 - shader 2]glAttachShader(1, 3) [Context 2 - program 1: shader 2][Context 2 - shader 3]glBindAttribLocation(1, 0, InPosition) [Context 2 - program 1: shader 2, shader 3]glGetError()glBindAttribLocation(1, 1, InTextureCoordinate) [Context 2 - program 1: shader 2, shader 3]glGetError()glLinkProgram(1) [Context 2 - program 1: shader 2, shader 3]glGetObjectParameterivARB(1, GL_LINK_STATUS, 0x0018F7D0) [Context 2 - program 1: shader 2, shader 3]glGetError()glGetObjectParameterivARB(1, GL_VALIDATE_STATUS, 0x0018F7D0) [Context 2 - program 1: shader 2, shader 3]glGetError()glGetObjectParameterivARB(1, GL_ACTIVE_UNIFORMS, 0x0018F7C4) [Context 2 - program 1: shader 2, shader 3]glGetError()glGetProgramiv(1, GL_INFO_LOG_LENGTH, 0x0018F7C8) [Context 2 - program 1: shader 2, shader 3]glGetError()glGetProgramInfoLog(1, 1, 0, ) [Context 2 - program 1: shader 2, shader 3]glGetError()glGetFragDataLocation(1, 0x0018F7DC)glGetAttribLocation(1, InTextureCoordinate) [Context 2 - program 1: shader 2, shader 3]glGetAttribLocation(1, InPosition) [Context 2 - program 1: shader 2, shader 3]glDeleteShader(3) [Context 2 - shader 3]glGetError()glDeleteShader(2) [Context 2 - shader 2]glGetError()glGenTextures(1, {0})glBindTexture(GL_TEXTURE_2D, 1) [Context 2 - Texture 1: No preview available]glGetError()glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) [Context 2 - Texture 1: No preview available]glGetError()glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) [Context 2 - Texture 1: No preview available]glGetError()glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) [Context 2 - Texture 1: No preview available]glGetError()glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) [Context 2 - Texture 1: No preview available]glGetError()glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 100, 100, 0, GL_RED, GL_UNSIGNED_SHORT, 0x00000000) [Context 2 - Texture 1: No preview available]glGetError()glBindTexture(GL_TEXTURE_2D, 0)glClearColor(0.39215687, 0.58431375, 0.92941177, 1)glGetError()glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)glGetError()glUseProgram(1) [Context 2 - program 1: shader 2, shader 3]glGetError()glBindVertexArray(1)glGetError()glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2)glGetError()glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0x00000000)glGetError()glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)glGetError()glBindVertexArray(0)glGetError()glUseProgram(0) [Context 2 - program 0]glGetError()wglSwapBuffers(0x6D012800) [/source]

#3Tocs1001

Posted 30 November 2012 - 03:55 PM

I've been working on a "graphics framework" (I use this term loosely), I've put OpenGL concepts into C++ classes so I can use them more easily, at any rate I decided to give them a simple test of a fullscreen quad. I init opengl to 3.1, set the clear color to blue, and start the renderloop. The quad is set to show up as white, yet I still see blue so the quad is not showing up.

First off here's my code using my framework stuff
[source lang="cpp"]//The quad, it's not there!class ScreenQuad{ Tocs::Graphics::VBO vbo; Tocs::Graphics::IBO ibo; Tocs::Graphics::VAO vao; Tocs::Graphics::Shader QuadShader;public: ScreenQuad(); void Draw (Tocs::Graphics::Texture2D &texture);};struct CrappyVertex{ float x,y,z; float u,v;};//Crappy Fullscreen quad class, meant more as a test than a utilityScreenQuad::ScreenQuad(void) : vbo (4 * sizeof(CrappyVertex)), ibo (6){ CrappyVertex vertices [4] = {{1,1,0,0,0},{-1,1,0,1,0},{1,-1,0,0,1},{-1,-1,0,1,1}}; vbo.Write (vertices,4,0); unsigned short indices[6] = {0,1,2, 1,3,2}; ibo.Write (indices,6,0); VertexFormat format; format.AddMember ("Position",VertexType::Vec3,false); format.AddMember ("TexCoord",VertexType::Vec2,false); vao.Bind (); vao.AddVBO (vbo,format); vao.UnBind (); ShaderCode vertcode (ShaderType::Vertex); vertcode.CompileFromFile ("Quad.vert"); if (!vertcode.Compiled ()) { cout << vertcode.GetCompileErrors () << endl; return; } ShaderCode fragcode (ShaderType::Pixel); fragcode.CompileFromFile ("Quad.frag"); if (!fragcode.Compiled ()) { cout << fragcode.GetCompileErrors () << endl; return; } QuadShader.SetOutput ("Color",0); QuadShader.AddCode (vertcode); QuadShader.AddCode (fragcode); QuadShader.SetAttribute ("InPosition",0); QuadShader.SetAttribute ("InTextureCoordinate",1); QuadShader.Link (); if (!QuadShader.Linked ()) { cout << QuadShader.GetLinkErrors () << endl; } cout << "InPosition: " << QuadShader.GetAttribute ("InPosition") << endl << "InTextureCoordinate: " << QuadShader.GetAttribute ("InTextureCoordinate") << endl << "Color: " << QuadShader.GetOutput ("Color") << endl;}void ScreenQuad::Draw (Tocs::Graphics::Texture2D &texture){ QuadShader.Bind (); //QuadShader["Texture"] = texture; //Segfaults without "Texture" uniform being used. vao.Bind (); ibo.Bind (); GraphicsContext::DrawTriangles (2); ibo.UnBind (); vao.UnBind (); QuadShader.UnBind ();}[/source]

This probably wont help as much because you can't see the OpenGL, so I went inside each function and copied down the OpenGL calls so I could see more clearly the order the functions were being called. And got this.

Note: All OpenGL calls have a Debug error check, all calls are giving GL_NO_ERROR
[source lang="cpp"]glGenVertexArrays (1,&vao.ID);glGenBuffers (1,&vbo.ID);glBindBuffer (GL_ARRAY_BUFFER,vbo.ID);glBufferData (GL_ARRAY_BUFFER,static_cast <GLsizeiptr> (Size),nullptr, GL_DYNAMIC_DRAW);glBindBuffer (GL_ARRAY_BUFFER,0);glGenBuffers (1,&ibo.ID);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glBufferData (GL_ELEMENT_ARRAY_BUFFER,static_cast <GLsizeiptr> (Format.GetSize () * IndiceCount),nullptr, GL_DYNAMIC_DRAW);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);CrappyVertex vertices [4] = {{1,1,0.5,0,0},{-1,1,0.5,1,0},{1,-1,0.5,0,1},{-1,-1,0.5,1,1}};glBindBuffer (GL_ARRAY_BUFFER,vbo.ID); glBufferSubData (GL_ARRAY_BUFFER, 0, 20*4, vertices);glBindBuffer (GL_ARRAY_BUFFER,0);unsigned short indices[6] = {0,1,2, 1,3,2};glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glBufferSubData (GL_ELEMENT_ARRAY_BUFFER,static_cast <GLintptr> (offset * sizeof (unsigned short)),6 * sizeof (unsigned short), static_cast <void *> (indices));glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);glBindVertexArray (vao.ID);glBindBuffer (GL_ARRAY_BUFFER,vbo.ID);int index = 0;unsigned int Offset = 0;for (auto i = Members.begin (); i != Members.end (); ++i){ glEnableVertexAttribArray (index); glVertexAttribPointer (index,(*i).GetType ().GetComponentCount (), (*i).GetType ().GetGLFormat (),(*i).IsNormalized (),Size,reinterpret_cast <GLvoid *> (Offset)); Offset += (*i).Size(); ++index;} //Gets called with GL_FLOAT 3 components, 12 bytes and GL_FLOAT 2 components, 8 bytesglBindBuffer (GL_ARRAY_BUFFER,0);glBindVertexArray (0);QuadShader.ID = glCreateProgram ()vertcode.ID = glCreateShader(GL_VERTEX_SHADER)glShaderSource (vertcode.ID,1,&codecstr,nullptr);glCompileShader (vertcode.ID);fragcode.ID = glCreateShader(GL_FRAGMENT_SHADER)glShaderSource (fragcode.ID,1,&codecstr,nullptr);glCompileShader (fragcode.ID);glBindFragDataLocation (QuadShader.ID,0,"Color");glAttachShader (QuadShader.ID,vertid);glAttachShader (QuadShader.ID,fragid);glBindAttribLocation (QuadShader.ID,0,"InPosition");glBindAttribLocation (QuadShader.ID,1,"InTextureCoordinate");glLinkProgram (QuadShader.ID);////////////////////////////////////////////////////////DRAWglUseProgram (QuadShader.ID);glBindVertexArray (vao.ID);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glDrawElements (GL_TRIANGLES, 2*3, GL_UNSIGNED_SHORT, nullptr);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);glBindVertexArray (0);glUseProgram(0);[/source]
And in case the shader may be the problem here they are.
[source lang="cpp"]//Vert#version 130precision highp float;in vec3 InPosition;in vec2 InTextureCoordinate;out vec2 TextureCoordinate;void main(){ TextureCoordinate = InTextureCoordinate; gl_Position = vec4(InPosition.xy,0,1);} //Frag#version 130precision highp float;uniform sampler2D Texture;in vec2 TextureCoordinate;out vec4 Color;void main(){ //Color = texture2D(Texture,TextureCoordinate); Color = vec4(1,1,1,1);} [/source]
I'm hoping it's something simple I've overlooked and someone will be able to point it out fairly quickly. Any comments, insights, insults, or other thoughts are welcome.

Thanks


EDIT: For a more complete view, I generated a log of the application startup through the first frame with gDEbugger.
[source lang="cpp"]wglDeleteContext(0x00010000) wglMakeCurrent(0x660127D4, 0x00010001) glGetString(GL_SHADING_LANGUAGE_VERSION) glGetString(GL_VERSION) glViewport(0, 0, 800, 800) glGetError() glClearColor(0, 0, 0, 0) glGetError() glClearDepth(1000) glGetError() glDisable(GL_DEPTH_TEST) glGetError() glDisable(GL_BLEND) glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST) glGetError() glGenBuffers(1, 0x002AF8A4) glBindBuffer(GL_ARRAY_BUFFER, 1) glGetError() glGetError() glBufferData(GL_ARRAY_BUFFER, 80, 0x00000000, GL_DYNAMIC_DRAW) glGetError() glBindBuffer(GL_ARRAY_BUFFER, 0) glGetError() glGetError() glGenBuffers(1, 0x002AF8AC) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2) glGetError() glBufferData(GL_ELEMENT_ARRAY_BUFFER, 12, 0x00000000, GL_DYNAMIC_DRAW) glGetError() glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) glGetError() glGenVertexArrays(1, 0x002AF8B8) glCreateProgram() [Context 2 - program 1] glBindBuffer(GL_ARRAY_BUFFER, 1) glGetError() glBufferSubData(GL_ARRAY_BUFFER, 0, 80, 0x002AF718) glGetError() glBindBuffer(GL_ARRAY_BUFFER, 0) glGetError() glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2) glGetError() glGetError() glBindVertexArray(1) glGetError() glBindBuffer(GL_ARRAY_BUFFER, 1) glGetError() glEnableVertexAttribArray(0) glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 20, 0x00000000) glEnableVertexAttribArray(1) glVertexAttribPointer(1, 2, GL_FLOAT, FALSE, 20, 0x0000000C) glBindBuffer(GL_ARRAY_BUFFER, 0) glGetError() glBindVertexArray(0) glGetError() glCreateShader(GL_VERTEX_SHADER) [Context 2 - Shader 2: source code is not available] glShaderSource(2, 1, 0x002AF23C, 0x00000000) [Context 2 - shader 2] glCompileShader(2) [Context 2 - shader 2] glGetShaderiv(2, GL_COMPILE_STATUS, 0x002AF458) [Context 2 - shader 2] glCreateShader(GL_FRAGMENT_SHADER) [Context 2 - Shader 3: source code is not available] glShaderSource(3, 1, 0x002AF23C, 0x00000000) [Context 2 - shader 3] glCompileShader(3) [Context 2 - shader 3] glGetShaderiv(3, GL_COMPILE_STATUS, 0x002AF458) [Context 2 - shader 3] glBindFragDataLocation(1, 0, 0x002AF454) glGetError() glAttachShader(1, 2) [Context 2 - program 1][Context 2 - shader 2] glAttachShader(1, 3) [Context 2 - program 1: shader 2][Context 2 - shader 3] glBindAttribLocation(1, 0, InPosition) [Context 2 - program 1: shader 2, shader 3] glGetError() glBindAttribLocation(1, 1, InTextureCoordinate) [Context 2 - program 1: shader 2, shader 3] glGetError() glLinkProgram(1) [Context 2 - program 1: shader 2, shader 3] glGetObjectParameterivARB(1, GL_LINK_STATUS, 0x002AF448) [Context 2 - program 1: shader 2, shader 3] glGetObjectParameterivARB(1, GL_VALIDATE_STATUS, 0x002AF448) [Context 2 - program 1: shader 2, shader 3] glGetObjectParameterivARB(1, GL_ACTIVE_UNIFORMS, 0x002AF43C) [Context 2 - program 1: shader 2, shader 3] glGetProgramiv(1, GL_INFO_LOG_LENGTH, 0x002AF440) [Context 2 - program 1: shader 2, shader 3] glGetProgramInfoLog(1, 1, 0, ) [Context 2 - program 1: shader 2, shader 3] glGetFragDataLocation(1, 0x002AF454) glGetAttribLocation(1, InTextureCoordinate) [Context 2 - program 1: shader 2, shader 3] glGetAttribLocation(1, InPosition) [Context 2 - program 1: shader 2, shader 3] glDeleteShader(3) [Context 2 - shader 3] glDeleteShader(2) [Context 2 - shader 2] glGenTextures(1, {0}) glBindTexture(GL_TEXTURE_2D, 1) [Context 2 - Texture 1: No preview available] glGetError() glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) [Context 2 - Texture 1: No preview available] glGetError() glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) [Context 2 - Texture 1: No preview available] glGetError() glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) [Context 2 - Texture 1: No preview available] glGetError() glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) [Context 2 - Texture 1: No preview available] glGetError() glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 100, 100, 0, GL_RED, GL_UNSIGNED_SHORT, 0x00000000) [Context 2 - Texture 1: No preview available] glGetError() glBindTexture(GL_TEXTURE_2D, 0) glClearColor(0.39215687, 0.58431375, 0.92941177, 1) glGetError() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) glGetError() glUseProgram(1) [Context 2 - program 1: shader 2, shader 3] glGetError() glBindVertexArray(1) glGetError() glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2) glGetError() glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0x00000000) glGetError() glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) glGetError() glBindVertexArray(0) glGetError() glUseProgram(0) [Context 2 - program 0] glGetError() wglSwapBuffers(0x660127D4) [/source]

#2Tocs1001

Posted 30 November 2012 - 01:33 PM

I've been working on a "graphics framework" (I use this term loosely), I've put OpenGL concepts into C++ classes so I can use them more easily, at any rate I decided to give them a simple test of a fullscreen quad. I init opengl to 3.1, set the clear color to blue, and start the renderloop. The quad is set to show up as white, yet I still see blue so the quad is not showing up.

First off here's my code using my framework stuff
[source lang="cpp"]//The quad, it's not there!class ScreenQuad{ Tocs::Graphics::VBO vbo; Tocs::Graphics::IBO ibo; Tocs::Graphics::VAO vao; Tocs::Graphics::Shader QuadShader;public: ScreenQuad(); void Draw (Tocs::Graphics::Texture2D &texture);};struct CrappyVertex{ float x,y,z; float u,v;};//Crappy Fullscreen quad class, meant more as a test than a utilityScreenQuad::ScreenQuad(void) : vbo (4 * sizeof(CrappyVertex)), ibo (6){ CrappyVertex vertices [4] = {{1,1,0,0,0},{-1,1,0,1,0},{1,-1,0,0,1},{-1,-1,0,1,1}}; vbo.Write (vertices,4,0); unsigned short indices[6] = {0,1,2, 1,3,2}; ibo.Write (indices,6,0); VertexFormat format; format.AddMember ("Position",VertexType::Vec3,false); format.AddMember ("TexCoord",VertexType::Vec2,false); vao.Bind (); vao.AddVBO (vbo,format); vao.UnBind (); ShaderCode vertcode (ShaderType::Vertex); vertcode.CompileFromFile ("Quad.vert"); if (!vertcode.Compiled ()) { cout << vertcode.GetCompileErrors () << endl; return; } ShaderCode fragcode (ShaderType::Pixel); fragcode.CompileFromFile ("Quad.frag"); if (!fragcode.Compiled ()) { cout << fragcode.GetCompileErrors () << endl; return; } QuadShader.SetOutput ("Color",0); QuadShader.AddCode (vertcode); QuadShader.AddCode (fragcode); QuadShader.SetAttribute ("InPosition",0); QuadShader.SetAttribute ("InTextureCoordinate",1); QuadShader.Link (); if (!QuadShader.Linked ()) { cout << QuadShader.GetLinkErrors () << endl; } cout << "InPosition: " << QuadShader.GetAttribute ("InPosition") << endl << "InTextureCoordinate: " << QuadShader.GetAttribute ("InTextureCoordinate") << endl << "Color: " << QuadShader.GetOutput ("Color") << endl;}void ScreenQuad::Draw (Tocs::Graphics::Texture2D &texture){ QuadShader.Bind (); //QuadShader["Texture"] = texture; //Segfaults without "Texture" uniform being used. vao.Bind (); ibo.Bind (); GraphicsContext::DrawTriangles (2); ibo.UnBind (); vao.UnBind (); QuadShader.UnBind ();}[/source]

This probably wont help as much because you can't see the OpenGL, so I went inside each function and copied down the OpenGL calls so I could see more clearly the order the functions were being called. And got this.

Note: All OpenGL calls have a Debug error check, all calls are giving GL_NO_ERROR
[source lang="cpp"]glGenVertexArrays (1,&vao.ID);glGenBuffers (1,&vbo.ID);glBindBuffer (GL_ARRAY_BUFFER,vbo.ID);glBufferData (GL_ARRAY_BUFFER,static_cast <GLsizeiptr> (Size),nullptr, GL_DYNAMIC_DRAW);glBindBuffer (GL_ARRAY_BUFFER,0);glGenBuffers (1,&ibo.ID);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glBufferData (GL_ELEMENT_ARRAY_BUFFER,static_cast <GLsizeiptr> (Format.GetSize () * IndiceCount),nullptr, GL_DYNAMIC_DRAW);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);CrappyVertex vertices [4] = {{1,1,0.5,0,0},{-1,1,0.5,1,0},{1,-1,0.5,0,1},{-1,-1,0.5,1,1}};glBindBuffer (GL_ARRAY_BUFFER,vbo.ID); glBufferSubData (GL_ARRAY_BUFFER, 0, 20*4, vertices);glBindBuffer (GL_ARRAY_BUFFER,0);unsigned short indices[6] = {0,1,2, 1,3,2};glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glBufferSubData (GL_ELEMENT_ARRAY_BUFFER,static_cast <GLintptr> (offset * sizeof (unsigned short)),6 * sizeof (unsigned short), static_cast <void *> (indices));glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);glBindVertexArray (vao.ID);glBindBuffer (GL_ARRAY_BUFFER,vbo.ID);int index = 0;unsigned int Offset = 0;for (auto i = Members.begin (); i != Members.end (); ++i){ glEnableVertexAttribArray (index); glVertexAttribPointer (index,(*i).GetType ().GetComponentCount (), (*i).GetType ().GetGLFormat (),(*i).IsNormalized (),Size,reinterpret_cast <GLvoid *> (Offset)); Offset += (*i).Size(); ++index;} //Gets called with GL_FLOAT 3 components, 12 bytes and GL_FLOAT 2 components, 8 bytesglBindBuffer (GL_ARRAY_BUFFER,0);glBindVertexArray (0);QuadShader.ID = glCreateProgram ()vertcode.ID = glCreateShader(GL_VERTEX_SHADER)glShaderSource (vertcode.ID,1,&codecstr,nullptr);glCompileShader (vertcode.ID);fragcode.ID = glCreateShader(GL_FRAGMENT_SHADER)glShaderSource (fragcode.ID,1,&codecstr,nullptr);glCompileShader (fragcode.ID);glBindFragDataLocation (QuadShader.ID,0,"Color");glAttachShader (QuadShader.ID,vertid);glAttachShader (QuadShader.ID,fragid);glBindAttribLocation (QuadShader.ID,0,"InPosition");glBindAttribLocation (QuadShader.ID,1,"InTextureCoordinate");glLinkProgram (QuadShader.ID);////////////////////////////////////////////////////////DRAWglUseProgram (QuadShader.ID);glBindVertexArray (vao.ID);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glDrawElements (GL_TRIANGLES, 2*3, GL_UNSIGNED_SHORT, nullptr);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);glBindVertexArray (0);glUseProgram(0);[/source]
And in case the shader may be the problem here they are.
[source lang="cpp"]//Vert#version 130precision highp float;in vec3 InPosition;in vec2 InTextureCoordinate;out vec2 TextureCoordinate;void main(){ TextureCoordinate = InTextureCoordinate; gl_Position = vec4(InPosition.xy,0,1);} //Frag#version 130precision highp float;uniform sampler2D Texture;in vec2 TextureCoordinate;out vec4 Color;void main(){ //Color = texture2D(Texture,TextureCoordinate); Color = vec4(1,1,1,1);} [/source]
I'm hoping it's something simple I've overlooked and someone will be able to point it out fairly quickly. Any comments, insights, insults, or other thoughts are welcome.

Thanks

#1Tocs1001

Posted 30 November 2012 - 12:26 PM

I've been working on a "graphics framework" (I use this term loosely), I've put OpenGL concepts into C++ classes so I can use them more easily, at any rate I decided to give them a simple test of a fullscreen quad. I init opengl to 3.1, set the clear color to blue, and start the renderloop. The quad is set to show up as white, yet I still see blue so the quad is not showing up.

First off here's my code using my framework stuff
[source lang="cpp"]//The quad, it's not there!class ScreenQuad{ Tocs::Graphics::VBO vbo; Tocs::Graphics::IBO ibo; Tocs::Graphics::VAO vao; Tocs::Graphics::Shader QuadShader;public: ScreenQuad(); void Draw (Tocs::Graphics::Texture2D &texture);};struct CrappyVertex{ float x,y,z; float u,v;};//Crappy Fullscreen quad class, meant more as a test than a utilityScreenQuad::ScreenQuad(void) : vbo (4 * sizeof(CrappyVertex)), ibo (6){ CrappyVertex vertices [4] = {{1,1,0,0,0},{-1,1,0,1,0},{1,-1,0,0,1},{-1,-1,0,1,1}}; vbo.Write (vertices,4,0); unsigned short indices[6] = {0,1,2, 1,3,2}; ibo.Write (indices,6,0); VertexFormat format; format.AddMember ("Position",VertexType::Vec3,false); format.AddMember ("TexCoord",VertexType::Vec2,false); vao.Bind (); vao.AddVBO (vbo,format); vao.UnBind (); ShaderCode vertcode (ShaderType::Vertex); vertcode.CompileFromFile ("Quad.vert"); if (!vertcode.Compiled ()) { cout << vertcode.GetCompileErrors () << endl; return; } ShaderCode fragcode (ShaderType::Pixel); fragcode.CompileFromFile ("Quad.frag"); if (!fragcode.Compiled ()) { cout << fragcode.GetCompileErrors () << endl; return; } QuadShader.SetOutput ("Color",0); QuadShader.AddCode (vertcode); QuadShader.AddCode (fragcode); QuadShader.SetAttribute ("InPosition",0); QuadShader.SetAttribute ("InTextureCoordinate",1); QuadShader.Link (); if (!QuadShader.Linked ()) { cout << QuadShader.GetLinkErrors () << endl; } cout << "InPosition: " << QuadShader.GetAttribute ("InPosition") << endl << "InTextureCoordinate: " << QuadShader.GetAttribute ("InTextureCoordinate") << endl << "Color: " << QuadShader.GetOutput ("Color") << endl;}void ScreenQuad::Draw (Tocs::Graphics::Texture2D &texture){ QuadShader.Bind (); //QuadShader["Texture"] = texture; //Segfaults without "Texture" uniform being used. vao.Bind (); ibo.Bind (); GraphicsContext::DrawTriangles (2); ibo.UnBind (); vao.UnBind (); QuadShader.UnBind ();}[/source]

This probably wont help as much because you can't see the OpenGL, so I went inside each function and copied down the OpenGL calls so I could see more clearly the order the functions were being called. And got this.
[source lang="cpp"]glGenVertexArrays (1,&vao.ID);glGenBuffers (1,&vbo.ID);glBindBuffer (GL_ARRAY_BUFFER,vbo.ID);glBufferData (GL_ARRAY_BUFFER,static_cast <GLsizeiptr> (Size),nullptr, GL_DYNAMIC_DRAW);glBindBuffer (GL_ARRAY_BUFFER,0);glGenBuffers (1,&ibo.ID);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glBufferData (GL_ELEMENT_ARRAY_BUFFER,static_cast <GLsizeiptr> (Format.GetSize () * IndiceCount),nullptr, GL_DYNAMIC_DRAW);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);CrappyVertex vertices [4] = {{1,1,0.5,0,0},{-1,1,0.5,1,0},{1,-1,0.5,0,1},{-1,-1,0.5,1,1}};glBindBuffer (GL_ARRAY_BUFFER,vbo.ID); glBufferSubData (GL_ARRAY_BUFFER, 0, 20*4, vertices);glBindBuffer (GL_ARRAY_BUFFER,0);unsigned short indices[6] = {0,1,2, 1,3,2};glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glBufferSubData (GL_ELEMENT_ARRAY_BUFFER,static_cast <GLintptr> (offset * sizeof (unsigned short)),6 * sizeof (unsigned short), static_cast <void *> (indices));glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);glBindVertexArray (vao.ID);glBindBuffer (GL_ARRAY_BUFFER,vbo.ID);int index = 0;unsigned int Offset = 0;for (auto i = Members.begin (); i != Members.end (); ++i){ glEnableVertexAttribArray (index); glVertexAttribPointer (index,(*i).GetType ().GetComponentCount (), (*i).GetType ().GetGLFormat (),(*i).IsNormalized (),Size,reinterpret_cast <GLvoid *> (Offset)); Offset += (*i).Size(); ++index;} //Gets called with GL_FLOAT 3 components, 12 bytes and GL_FLOAT 2 components, 8 bytesglBindBuffer (GL_ARRAY_BUFFER,0);glBindVertexArray (0);QuadShader.ID = glCreateProgram ()vertcode.ID = glCreateShader(GL_VERTEX_SHADER)glShaderSource (vertcode.ID,1,&codecstr,nullptr);glCompileShader (vertcode.ID);fragcode.ID = glCreateShader(GL_FRAGMENT_SHADER)glShaderSource (fragcode.ID,1,&codecstr,nullptr);glCompileShader (fragcode.ID);glBindFragDataLocation (QuadShader.ID,0,"Color");glAttachShader (QuadShader.ID,vertid);glAttachShader (QuadShader.ID,fragid);glBindAttribLocation (QuadShader.ID,0,"InPosition");glBindAttribLocation (QuadShader.ID,1,"InTextureCoordinate");glLinkProgram (QuadShader.ID);////////////////////////////////////////////////////////DRAWglUseProgram (QuadShader.ID);glBindVertexArray (vao.ID);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,ibo.ID);glDrawElements (GL_TRIANGLES, 2*3, GL_UNSIGNED_SHORT, nullptr);glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,0);glBindVertexArray (0);glUseProgram(0);[/source]
And in case the shader may be the problem here they are.
[source lang="cpp"]//Vert#version 130precision highp float;in vec3 InPosition;in vec2 InTextureCoordinate;out vec2 TextureCoordinate;void main(){ TextureCoordinate = InTextureCoordinate; gl_Position = vec4(InPosition.xy,0,1);} //Frag#version 130precision highp float;uniform sampler2D Texture;in vec2 TextureCoordinate;out vec4 Color;void main(){ //Color = texture2D(Texture,TextureCoordinate); Color = vec4(1,1,1,1);} [/source]
I'm hoping it's something simple I've overlooked and someone will be able to point it out fairly quickly. Any comments, insights, insults, or other thoughts are welcome.

Thanks

PARTNERS