Note that there are some explanatory texts on larger screens.

plurals
  1. POOpenGL Draws Nothing When Sent Too Much Data?
    primarykey
    data
    text
    <p>I seem to have ran into a strange issue with OpenGL. Everything works fine with my class until I make the map too big (around 800x800 is the max), and then OpenGL doesn't draw anything. I have made calls to glGetBufferSubData, and as far as I could tell the data seemed correct in both the vertex and index buffers, yet nothing is being drawn? At first I assumed an overflow somewhere in my code, but according to std::numeric_limits my vertex and index iterators don't seem to come anywhere close to the max size of a (signed) int. I use a lot of wrapper classes around OpenGL objects, but they are very simple, usually inline calls to their OpenGL equivalent. Same for the "M_" typedefs around primitive types. Below are the main loop I render in, the class where I believe the issue lies, and 2 screenshots of the output.</p> <p>Correct output: <a href="http://i.imgur.com/cvC1T7L.png" rel="nofollow">http://i.imgur.com/cvC1T7L.png</a></p> <p>Blank ouput, after expanding map: <a href="http://i.imgur.com/MmmNgj4.png" rel="nofollow">http://i.imgur.com/MmmNgj4.png</a></p> <p>Main loop:</p> <pre><code>int main(){ //open window Memento::MainWindow&amp; main_window = Memento::MainWindow::GetInstance(); Memento::MainWindow::Init(); main_window.SetTitle("Memento"); main_window.Open(); //matrices glmx_mat4 ortho_matrix = {}; glmx_mat4_ortho(0.0f, 800.0f, 600.0f, 0.0f, 5.0f, 25.0f, ortho_matrix); glmx_mat4 modelview_matrix = {}; glmx_mat4_identity(modelview_matrix); glmx_vec3 translate_vec = {0.0f, 0.0f, -10.0f}; glmx_mat4_translate(modelview_matrix, translate_vec, modelview_matrix); glmx_mat4_multiply(ortho_matrix, modelview_matrix, ortho_matrix); //shaders Memento::GLShader default_vert_shader("default.vert", GL_VERTEX_SHADER); default_vert_shader.Compile(); Memento::GLShader default_frag_shader("default.frag", GL_FRAGMENT_SHADER); default_frag_shader.Compile(); //program Memento::GLProgram default_program; default_program.Create(); default_program.AttachShader(default_vert_shader); default_program.AttachShader(default_frag_shader); Memento::GLVertexArray default_vert_array; default_vert_array.Create(); default_vert_array.Bind(); //BufferGameMap class- where I believe the issue lies Memento::TextureAtlas atlas1("atlas/cat_image.png", "atlas/cat_source.xml"); Memento::BufferGameMap map1("tryagain.tmx", atlas1); //bind buffers map1.GetVertexBuffer().Bind(); map1.GetIndexBuffer().Bind(); //upload vertex attributes default_vert_array.EnableIndex(0); default_vert_array.IndexData(0, 2, GL_FLOAT, NULL, 8 * sizeof(Memento::M_float)); default_vert_array.BindIndex(default_program, 0, "map_vert"); //link, validate, and use program default_program.Link(); default_program.Validate(); default_program.Use(); //upload matrix as uniform glUniformMatrix4fv(default_program.GetUniformLocation("modelviewprojection_matrix"), 1, GL_FALSE, ortho_matrix); //main draw loop while(not glfwGetKey(GLFW_KEY_ESC)){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDrawElements(GL_TRIANGLES, map1.GetIndexBufferLength(), GL_UNSIGNED_INT, NULL); glfwSwapBuffers(); } //close window &amp; exit main_window.Close(); return (0); } </code></pre> <p>BufferGameMap class (issue is probably here!):</p> <pre><code>Memento::BufferGameMap::BufferGameMap(std::string const&amp; file, const Memento::TextureAtlas&amp; atlas): TmxMap::GameMap(), background_color_color4(), vertex_buffer(), index_buffer(), vertex_buffer_len(0), index_buffer_len(0){ Create(file, atlas); } Memento::M_void Memento::BufferGameMap::Create(std::string const&amp; file, const Memento::TextureAtlas&amp; atlas){ if(IsCreated())Destroy(); TmxMap::GameMap::CreateFromFile(file); std::vector&lt;TmxMap::Layer&gt; const&amp; layers = GetLayers(); if(not layers.empty()){ const std::vector&lt;TmxMap::Layer&gt;::const_iterator layers_end = layers.end(); std::vector&lt;TmxMap::Layer&gt;::const_iterator layers_iter = layers.begin(); Memento::M_float* vertex_buffer_data = NULL; Memento::M_uint* index_buffer_data = NULL; for(; layers_iter != layers_end; ++layers_iter){ vertex_buffer_len += layers_iter -&gt; GetMapTiles().size() * (4 * (2 + 2 + 2 + 2)); index_buffer_len += layers_iter -&gt; GetMapTiles().size() * 6; } vertex_buffer_data = new Memento::M_float[vertex_buffer_len]; index_buffer_data = new Memento::M_uint[index_buffer_len]; //fill data to send to the gl Memento::M_sizei vertex_buffer_iter = 0, index_buffer_iter = 0, index_buffer_quad_iter = 0; //map data const Memento::M_uint map_size_x = GetMapSize().x, map_size_y = GetMapSize().y; const Memento::M_float map_tile_size_x = GetTileSize().x, map_tile_size_y = GetTileSize().y; //per layer data std::vector&lt;TmxMap::MapTile&gt; const* map_tiles = NULL; std::vector&lt;TmxMap::MapTile&gt;::const_iterator map_tiles_iter, map_tiles_end; //per tile data Memento::M_float map_origin_x = 0.0f, map_origin_y = 0.0f; for(layers_iter = layers.begin(); layers_iter != layers_end; ++layers_iter){ map_tiles = &amp;layers_iter -&gt; GetMapTiles(); for(map_tiles_iter = map_tiles -&gt; begin(), map_tiles_end = map_tiles -&gt; end(); map_tiles_iter != map_tiles_end; ++map_tiles_iter, vertex_buffer_iter += 4 * (2 + 2 + 2 + 2), index_buffer_iter += 6, index_buffer_quad_iter += 4){ map_origin_x = static_cast&lt;Memento::M_float&gt;(map_tiles_iter -&gt; map_tile_index / map_size_y) * map_tile_size_x; map_origin_y = static_cast&lt;Memento::M_float&gt;(map_tiles_iter -&gt; map_tile_index % map_size_y) * map_tile_size_y; vertex_buffer_data[vertex_buffer_iter] = map_origin_x; vertex_buffer_data[vertex_buffer_iter + 1] = map_origin_y; //========================================================= vertex_buffer_data[vertex_buffer_iter + 8] = map_origin_x; vertex_buffer_data[vertex_buffer_iter + 9] = map_origin_y + map_tile_size_y; //========================================================= vertex_buffer_data[vertex_buffer_iter + 16] = map_origin_x + map_tile_size_x; vertex_buffer_data[vertex_buffer_iter + 17] = map_origin_y + map_tile_size_y; //========================================================= vertex_buffer_data[vertex_buffer_iter + 24] = map_origin_x + map_tile_size_x; vertex_buffer_data[vertex_buffer_iter + 25] = map_origin_y; //========================================================= index_buffer_data[index_buffer_iter] = index_buffer_quad_iter; index_buffer_data[index_buffer_iter + 1] = index_buffer_quad_iter + 1; index_buffer_data[index_buffer_iter + 2] = index_buffer_quad_iter + 2; index_buffer_data[index_buffer_iter + 3] = index_buffer_quad_iter; index_buffer_data[index_buffer_iter + 4] = index_buffer_quad_iter + 2; index_buffer_data[index_buffer_iter + 5] = index_buffer_quad_iter + 3; } } vertex_buffer.Create(GL_ARRAY_BUFFER, GL_STATIC_DRAW); vertex_buffer.Bind(); vertex_buffer.AllocateRef(vertex_buffer_len * sizeof(Memento::M_float), static_cast&lt;const Memento::M_void*&gt;(vertex_buffer_data)); vertex_buffer.Unbind(); index_buffer.Create(GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW); index_buffer.Bind(); index_buffer.AllocateRef(index_buffer_len * sizeof(Memento::M_uint), static_cast&lt;const Memento::M_void*&gt;(index_buffer_data)); index_buffer.Unbind(); delete[] vertex_buffer_data; delete[] index_buffer_data; } } </code></pre> <p>Vertex shader:</p> <pre><code>#version 140 precision highp float; uniform mat4 modelviewprojection_matrix; in vec2 map_vert; void main(){ gl_Position = modelviewprojection_matrix * vec4(map_vert, 0, 1); } </code></pre> <p>Fragment shader:</p> <pre><code>#version 140 precision highp float; out vec4 frag_color; void main(){ frag_color = vec4(0.4, 0.2, 0.6, 0.5); } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload