• Advertisement
  • Popular Tags

  • Popular Now

  • Advertisement
  • Similar Content

    • By fleissi
      Hey guys!

      I'm new here and I recently started developing my own rendering engine. It's open source, based on OpenGL/DirectX and C++.
      The full source code is hosted on github:
      https://github.com/fleissna/flyEngine

      I would appreciate if people with experience in game development / engine desgin could take a look at my source code. I'm looking for honest, constructive criticism on how to improve the engine.
      I'm currently writing my master's thesis in computer science and in the recent year I've gone through all the basics about graphics programming, learned DirectX and OpenGL, read some articles on Nvidia GPU Gems, read books and integrated some of this stuff step by step into the engine.

      I know about the basics, but I feel like there is some missing link that I didn't get yet to merge all those little pieces together.

      Features I have so far:
      - Dynamic shader generation based on material properties
      - Dynamic sorting of meshes to be renderd based on shader and material
      - Rendering large amounts of static meshes
      - Hierarchical culling (detail + view frustum)
      - Limited support for dynamic (i.e. moving) meshes
      - Normal, Parallax and Relief Mapping implementations
      - Wind animations based on vertex displacement
      - A very basic integration of the Bullet physics engine
      - Procedural Grass generation
      - Some post processing effects (Depth of Field, Light Volumes, Screen Space Reflections, God Rays)
      - Caching mechanisms for textures, shaders, materials and meshes

      Features I would like to have:
      - Global illumination methods
      - Scalable physics
      - Occlusion culling
      - A nice procedural terrain generator
      - Scripting
      - Level Editing
      - Sound system
      - Optimization techniques

      Books I have so far:
      - Real-Time Rendering Third Edition
      - 3D Game Programming with DirectX 11
      - Vulkan Cookbook (not started yet)

      I hope you guys can take a look at my source code and if you're really motivated, feel free to contribute :-)
      There are some videos on youtube that demonstrate some of the features:
      Procedural grass on the GPU
      Procedural Terrain Engine
      Quadtree detail and view frustum culling

      The long term goal is to turn this into a commercial game engine. I'm aware that this is a very ambitious goal, but I'm sure it's possible if you work hard for it.

      Bye,

      Phil
    • By tj8146
      I have attached my project in a .zip file if you wish to run it for yourself.
      I am making a simple 2d top-down game and I am trying to run my code to see if my window creation is working and to see if my timer is also working with it. Every time I run it though I get errors. And when I fix those errors, more come, then the same errors keep appearing. I end up just going round in circles.  Is there anyone who could help with this? 
       
      Errors when I build my code:
      1>Renderer.cpp 1>c:\users\documents\opengl\game\game\renderer.h(15): error C2039: 'string': is not a member of 'std' 1>c:\program files (x86)\windows kits\10\include\10.0.16299.0\ucrt\stddef.h(18): note: see declaration of 'std' 1>c:\users\documents\opengl\game\game\renderer.h(15): error C2061: syntax error: identifier 'string' 1>c:\users\documents\opengl\game\game\renderer.cpp(28): error C2511: 'bool Game::Rendering::initialize(int,int,bool,std::string)': overloaded member function not found in 'Game::Rendering' 1>c:\users\documents\opengl\game\game\renderer.h(9): note: see declaration of 'Game::Rendering' 1>c:\users\documents\opengl\game\game\renderer.cpp(35): error C2597: illegal reference to non-static member 'Game::Rendering::window' 1>c:\users\documents\opengl\game\game\renderer.cpp(36): error C2597: illegal reference to non-static member 'Game::Rendering::window' 1>c:\users\documents\opengl\game\game\renderer.cpp(43): error C2597: illegal reference to non-static member 'Game::Rendering::window' 1>Done building project "Game.vcxproj" -- FAILED. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========  
       
      Renderer.cpp
      #include <GL/glew.h> #include <GLFW/glfw3.h> #include "Renderer.h" #include "Timer.h" #include <iostream> namespace Game { GLFWwindow* window; /* Initialize the library */ Rendering::Rendering() { mClock = new Clock; } Rendering::~Rendering() { shutdown(); } bool Rendering::initialize(uint width, uint height, bool fullscreen, std::string window_title) { if (!glfwInit()) { return -1; } /* Create a windowed mode window and its OpenGL context */ window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); if (!window) { glfwTerminate(); return -1; } /* Make the window's context current */ glfwMakeContextCurrent(window); glViewport(0, 0, (GLsizei)width, (GLsizei)height); glOrtho(0, (GLsizei)width, (GLsizei)height, 0, 1, -1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glfwSwapInterval(1); glEnable(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glEnable(GL_TEXTURE_2D); glLoadIdentity(); return true; } bool Rendering::render() { /* Loop until the user closes the window */ if (!glfwWindowShouldClose(window)) return false; /* Render here */ mClock->reset(); glfwPollEvents(); if (mClock->step()) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glfwSwapBuffers(window); mClock->update(); } return true; } void Rendering::shutdown() { glfwDestroyWindow(window); glfwTerminate(); } GLFWwindow* Rendering::getCurrentWindow() { return window; } } Renderer.h
      #pragma once namespace Game { class Clock; class Rendering { public: Rendering(); ~Rendering(); bool initialize(uint width, uint height, bool fullscreen, std::string window_title = "Rendering window"); void shutdown(); bool render(); GLFWwindow* getCurrentWindow(); private: GLFWwindow * window; Clock* mClock; }; } Timer.cpp
      #include <GL/glew.h> #include <GLFW/glfw3.h> #include <time.h> #include "Timer.h" namespace Game { Clock::Clock() : mTicksPerSecond(50), mSkipTics(1000 / mTicksPerSecond), mMaxFrameSkip(10), mLoops(0) { mLastTick = tick(); } Clock::~Clock() { } bool Clock::step() { if (tick() > mLastTick && mLoops < mMaxFrameSkip) return true; return false; } void Clock::reset() { mLoops = 0; } void Clock::update() { mLastTick += mSkipTics; mLoops++; } clock_t Clock::tick() { return clock(); } } TImer.h
      #pragma once #include "Common.h" namespace Game { class Clock { public: Clock(); ~Clock(); void update(); bool step(); void reset(); clock_t tick(); private: uint mTicksPerSecond; ufloat mSkipTics; uint mMaxFrameSkip; uint mLoops; uint mLastTick; }; } Common.h
      #pragma once #include <cstdio> #include <cstdlib> #include <ctime> #include <cstring> #include <cmath> #include <iostream> namespace Game { typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; typedef unsigned long ulong; typedef float ufloat; }  
      Game.zip
    • By lxjk
      Hi guys,
      There are many ways to do light culling in tile-based shading. I've been playing with this idea for a while, and just want to throw it out there.
      Because tile frustums are general small compared to light radius, I tried using cone test to reduce false positives introduced by commonly used sphere-frustum test.
      On top of that, I use distance to camera rather than depth for near/far test (aka. sliced by spheres).
      This method can be naturally extended to clustered light culling as well.
      The following image shows the general ideas

       
      Performance-wise I get around 15% improvement over sphere-frustum test. You can also see how a single light performs as the following: from left to right (1) standard rendering of a point light; then tiles passed the test of (2) sphere-frustum test; (3) cone test; (4) spherical-sliced cone test
       

       
      I put the details in my blog post (https://lxjk.github.io/2018/03/25/Improve-Tile-based-Light-Culling-with-Spherical-sliced-Cone.html), GLSL source code included!
       
      Eric
    • By Fadey Duh
      Good evening everyone!

      I was wondering if there is something equivalent of  GL_NV_blend_equation_advanced for AMD?
      Basically I'm trying to find more compatible version of it.

      Thank you!
    • By Jens Eckervogt
      Hello guys, 
       
      Please tell me! 
      How do I know? Why does wavefront not show for me?
      I already checked I have non errors yet.
      using OpenTK; using System.Collections.Generic; using System.IO; using System.Text; namespace Tutorial_08.net.sourceskyboxer { public class WaveFrontLoader { private static List<Vector3> inPositions; private static List<Vector2> inTexcoords; private static List<Vector3> inNormals; private static List<float> positions; private static List<float> texcoords; private static List<int> indices; public static RawModel LoadObjModel(string filename, Loader loader) { inPositions = new List<Vector3>(); inTexcoords = new List<Vector2>(); inNormals = new List<Vector3>(); positions = new List<float>(); texcoords = new List<float>(); indices = new List<int>(); int nextIdx = 0; using (var reader = new StreamReader(File.Open("Contents/" + filename + ".obj", FileMode.Open), Encoding.UTF8)) { string line = reader.ReadLine(); int i = reader.Read(); while (true) { string[] currentLine = line.Split(); if (currentLine[0] == "v") { Vector3 pos = new Vector3(float.Parse(currentLine[1]), float.Parse(currentLine[2]), float.Parse(currentLine[3])); inPositions.Add(pos); if (currentLine[1] == "t") { Vector2 tex = new Vector2(float.Parse(currentLine[1]), float.Parse(currentLine[2])); inTexcoords.Add(tex); } if (currentLine[1] == "n") { Vector3 nom = new Vector3(float.Parse(currentLine[1]), float.Parse(currentLine[2]), float.Parse(currentLine[3])); inNormals.Add(nom); } } if (currentLine[0] == "f") { Vector3 pos = inPositions[0]; positions.Add(pos.X); positions.Add(pos.Y); positions.Add(pos.Z); Vector2 tc = inTexcoords[0]; texcoords.Add(tc.X); texcoords.Add(tc.Y); indices.Add(nextIdx); ++nextIdx; } reader.Close(); return loader.loadToVAO(positions.ToArray(), texcoords.ToArray(), indices.ToArray()); } } } } } And It have tried other method but it can't show for me.  I am mad now. Because any OpenTK developers won't help me.
      Please help me how do I fix.

      And my download (mega.nz) should it is original but I tried no success...
      - Add blend source and png file here I have tried tried,.....  
       
      PS: Why is our community not active? I wait very longer. Stop to lie me!
      Thanks !
  • Advertisement
  • Advertisement
Sign in to follow this  

OpenGL Opengl Vbo Errors

This topic is 1973 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hey, I'm working on a minecraft-like voxel engine. I keep my block type information in chunks, before creating vectors, and then sending that information off into the GPU as a vbo. This was working fine, but after generating too many different vbo objects (well the pointer that you bind, with the buffer), the game kept crashing. I ignored this for a while, but i've fixed all my other bugs on my list, and this one needs to be addressed.
In order to solve it, I tried running the game without drawing the VBOs, and it didn't crash after alot of time. So from this, I figured having too many vbos was the problem, then I read various things, and people seemed to agree on reducing the calls to bindBuffer, or shoving all your objects(Th into one vbo (ideally) before sending it off. The render information is static, so this shouldn't be too difficult.
In order to solve it, I used indexes, and created just one vboPointer, then for every chunk I had, I just generated it in one of the indexes at a time. There can be anywhere from 30 to 1000 chunks loaded depending on the renderDistance.
Also deleting the buffers seemed to cause it to crash too. So after some research, I figured this was because it releases the buffer position for any future use. I think I tried generating it again, and had no luck.
I would like some clarity on vbo useage, do vbo indexes work for large numbers? Has uanyone had the bg where multiple vbo objects don't work? What should be the best approach for this? Minecraft uses display lists, but don't vbos give a performance boost?
Also, I heard the calls to bindBuffer will take a fair amount of processing, so is it better to bind these on a thread to completely reduce loading times?
One possible solution is too use not one vbo per chunk (16x16x16 blocks), or one for all of them, but one per X-Z position or something like that. But it's very hard to debug vbo errors when I can't understand the problem. Feels like i'm just trying anything, not making any progress on this.

class VboData {
int[] quadLength; // Sizes of Arrays
int vboIndex = -1;
int maxIndex = 0; // Stores the total number of vbos in it
int[] vboQuadID;
int[] vboColorID;
int[] vboNormalID;
int[] vboTexID;
boolean hasGenVbo = false;
VboData() {
//maxIndexTotal = maxChunks;
quadLength = new int[maxIndexTotal];
}
VboData(int maxIndex_) {
maxIndex = maxIndex_;
//maxIndexTotal = maxChunks;
quadLength = new int[maxIndexTotal];
}
void dumpMemory() {

}
int getQuadLength(int index) {
if (maxIndexTotal > -1)
return quadLength[index];
else return 0;
}
void genAllVBO() {
if (!hasGenVbo) {
println("Total: " + maxIndexTotal);
vboQuadID = new int[maxIndexTotal];
vboColorID = new int[maxIndexTotal];
vboNormalID = new int[maxIndexTotal];
vboTexID = new int[maxIndexTotal];
gl.glGenBuffers(maxIndexTotal, vboQuadID, 0 );
gl.glGenBuffers(maxIndexTotal, vboNormalID, 0);
gl.glGenBuffers(maxIndexTotal, vboTexID, 0);
gl.glGenBuffers(maxIndexTotal, vboColorID, 0 );
hasGenVbo = true;
}
}
void clearMemory(int vboIndex_) {
/*if (quadLength[vboIndex_] > 0) {
gl.glDeleteBuffers(1, vboQuadID, 0 );
gl.glDeleteBuffers(1, vboNormalID, 0);
gl.glDeleteBuffers(1, vboTexID, 0);
gl.glDeleteBuffers(1, vboColorID, 0 );
}*/
}
void genAllVBOs(Vector vboVertex, Vector vboColor, Vector vboNormal, Vector vboTexture, int vboIndex_) {
if (vboIndex_ < maxIndexTotal)
vboIndex = vboIndex_;
quadLength[vboIndex_] = vboVertex.size();
genAllVBO();
genVBO(vboVertex, vboNormal, vboTexture, vboColor);
}
void genVBO(Vector vboVertex, Vector vboNormal, Vector vboTexture, Vector vboColor) {
int quadLength2 = vboVertex.size();
if (quadLength2 > 0 && vboIndex > -1) {
int normalLength = vboNormal.size();
int texLength = vboTexture.size();
int colorLength = vboColor.size();

gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vboQuadID[vboIndex] );
gl.glBufferData( GL.GL_ARRAY_BUFFER, quadLength2 * 3 * BufferUtil.SIZEOF_FLOAT, myVertex_to_float_buffer( vboVertex ), GL.GL_DYNAMIC_DRAW );
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0); // This resets the gl pointer to the start
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vboNormalID[vboIndex] );
gl.glBufferData( GL.GL_ARRAY_BUFFER, normalLength * 3 * BufferUtil.SIZEOF_FLOAT, myNormal_to_float_buffer( vboNormal ), GL.GL_DYNAMIC_DRAW );
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vboTexID[vboIndex] );
gl.glBufferData( GL.GL_ARRAY_BUFFER, texLength * 2 * BufferUtil.SIZEOF_FLOAT, myTexture_to_float_buffer( vboTexture ), GL.GL_DYNAMIC_DRAW );
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);

gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vboColorID[vboIndex] );
gl.glBufferData( GL.GL_ARRAY_BUFFER, colorLength * 4 * BufferUtil.SIZEOF_FLOAT, myColor_to_float_buffer( vboColor ), GL.GL_DYNAMIC_DRAW);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);
}
}
}
class RenderData {
int vboIndex = 0; // It's position in the vbo array
Vector vboVertex;
Vector vboColor;
Vector vboNormal;
Vector vboTexture;
RenderData() {
vboVertex = new Vector();
vboColor = new Vector();
vboNormal = new Vector();
vboTexture = new Vector();
}
void setMax() {
//if (vboVertex.size() != 0)
//quadLength = vboVertex.size();
}
void setIndex(int index) {
if (index < maxIndexTotal && index > -1)
vboIndex = index;
}

void clearMemory() {
clearVectors();
/*
vboVertex = null;
vboNormal = null;
vboTexture = null;
vboColor = null;*/
}
void clearVectors() {
vboVertex = new Vector();
vboNormal = new Vector();
vboTexture = new Vector();
vboColor = new Vector();
}
}
void renderVBO(VboData vbo,Texture tex, int quadLength, int vboIndex) {
//if (vbo.quadLength > 0) {
//println(render.quadLength);
if (isRenderVBO && quadLength > 0 && vboIndex > -1) {
tex.enable();
tex.bind();
gl.glPushMatrix();

if (isShader) glsl.startShader();
// Enables opengl to draw vertex points from memory
gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
gl.glEnableClientState(GL.GL_COLOR_ARRAY);
gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY);

// Points to vertexes in memory
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vbo.vboTexID[vboIndex]);
gl.glTexCoordPointer(2,GL.GL_FLOAT,0,0);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vbo.vboColorID[vboIndex]);
gl.glColorPointer(4,GL.GL_FLOAT,0,0);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vbo.vboNormalID[vboIndex]);
gl.glNormalPointer(GL.GL_FLOAT,0,0);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vbo.vboQuadID[vboIndex]);
gl.glVertexPointer(3,GL.GL_FLOAT,0,0);
// Draws the vertexes from memory - hence why needed point
gl.glDrawArrays(GL.GL_QUADS, 0, quadLength);
// Resets the binded buffer
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);
// Ends the opengl drawing

// Disables the client state
gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL.GL_NORMAL_ARRAY);
gl.glDisableClientState(GL.GL_COLOR_ARRAY);
gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY);

if (isShader) glsl.endShader();
gl.glPopMatrix();
tex.disable();
}
}

Share this post


Link to post
Share on other sites
Advertisement
you may get better FPS by not using indices, or by super-optimizing indices which may be a waste of time
deleting VBOs is completely safe, and completely necessary to keep from using too much vram
consider using columns of the entire world as a final VBO, then you will have let's say 32x32 VBOs, and you need only bind a few of them for each render
in minecraft 32x32 sectors x 16x16 blocks is the size of the world on "far render distance" setting
remember that the memory requirement for the game increases exponentially with each ring of sectors
you also need to parallellize the pipeline that assembles the world into vbo data
but you can only call gl* functions on the render threadi
that means that it's pointless to try to parallellize anything in the renderer, and instead focusing on optimizing hard on what the renderer has to do
and lift some weight off of it
ideally, the rendering thread should only do rendering, and nothing else =)
you can only call gl* functions from the same thread as the opengl context was created on, otherwise you are in trouble

you can use occlusion query objects to find out what isnt visible 1 frame from when you render them
this will let you draw alot less 1 frame after drawing everything in the frustum
Edited by Kaptein

Share this post


Link to post
Share on other sites
Ahh thank you for your advice! It's very spefic to what I needed. Before reading this I already took the initiative to put the rendering just on one single thread, this seemed to improve it alot, ie it crashes less.
What do you mean by super-optimizing indices?
I put all my chunks into one single vbo, using indexes to the pointer array. Is it necessary to use sectors of vbos rather then just one?
Yeah I read that its no use as opengl doesnt work well with threading 'that means that it's pointless to try to parallellize anything in the renderer, and instead focusing on optimizing hard on what the renderer has to do and lift some weight off of it'!
I'm curious as too the occlusion, but that would require alot of updates to the vbos, is this what minecraft does? How it says chunk updates in its debug gui? Is it because it uses cpu useage and causes opengl to render less things, thus improving fps... It's just the calls of glBindBuffer are very expensive for time, so implementing these things and getting better fps has been a largely trial and error thing for me.

Share this post


Link to post
Share on other sites
YESS!!! I finished redoing most of my code, and putting only rendering in the main thread. I had a little bit of extra stuff in the rendering thread left, and after removing it it works the same as many other voxel like games i've been trying to make my game as smooth as. Thank you!

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement