Giter Club home page Giter Club logo

cell's Introduction

Cell - Graphics engine

Welcome to the development repository of Cell, an open-source OpenGL graphics engine aimed to serve as an educational repository for learning how a larger graphics engine can be structured and organized. A large focus of Cell is building an engine that is both easy to use and read. Cell also aims to provide both flexible and properly maintainable code. Note that this project is not finished, so code may still be vague nor are there proper build files yet.

Logo of Cell Graphics Engine

The engine will be heavily commented and documented from within the source code itself, to motivate new graphics programmers to take a look at any of its inner workings, without feeling too overwhelming.

Cell Preview

Feature List (complete:base-functionality)

  • Fully functioning (custom) math library (vectors, matrices, transformations, utility functions):

    1. Linear algebra: n-dimensional vectors, nxn-dimensional matrices, transformations, utility.
    2. Trigonemetry: unit circle utility functions, radian/degree conversions.
    3. Utility functions: lerp, step, smoothstep, smootherstep, clamp etc.
  • Engine utility namespace:

    1. High-precision performance analysis and measurement.
    2. Random numbers.
  1. Configure and enable debugging and logging utility.
  2. Shader object w/ custom pre-processor (defines, includes):
    1. Include other shader files.
    2. Parse active vertex attributes and uniform variables, retrieve location and store in shader object.
    3. Easy to use state configuration per shader.
    4. Support multiple build paths.
  3. Material pipeline; configure render state in materials, together with shader, uniform configuration and samplers used.
    1. Allow for easy access of materials and storage; include set of default materials (default material, glass material etc.)
  4. Define Mesh object and encompassing Model class.
    1. Define set of basic shape mesh generation; plane, cube, disk, sphere, cylinder, torus (donut)
    2. Load artist defined 3D models w/ Assimp.
      • Note: Assimp is built as a static library that is statically linked/merged with Cell. I also built the static zlib library for the ingration to work properly with Assimp (both 32 bit).
  5. Flexible Framebuffer configuration utility:
    1. Including CubeMap use and generation (reflection probes, point shadow-maps)
    2. Post-processing.
  6. Create Render Buffer, draw commands encapsulated in push to render buffer w/ relevant state:
    1. Define list of render push commands (material, mesh)
    2. Collect all render commands and seperate by pass.
    3. Sort render commands per pass; execute (batch where necessary) to minimize state changes.
  7. Configure Deferred rendering pipeline:
    1. Configure render buffer w/ geometry pass.
    2. Build fully functional shaders w/ Blinn-Phong (now PBR) lighting.
    3. Normal mapping.
    4. Environment lighting.
    5. Environment reflection support.
    6. Directional shadows
    7. Number of lights optimization.
    8. Per-object motion blur.
  8. Functioning PBR render pipeline.
    1. Calculate diffuse integral and store into cubemap.
    2. Prefilter environment map w/ integral and store into cubemap as diffuse integral.
    3. Pre-calculate active BRDF in 2D LUT (approach by Unreal for split sum approximation).
    4. Irradiance reflection probe(s): pre-calculate environment lighting approximation at any scene location.
  9. Post-processing
    1. HDR/Gamma/Tone-mapping
    2. Bloom
    3. SSR
    4. Vignette
    5. SSAO
  10. Optimization:
    1. Store material-independent uniforms in UBO; together with barely changing shader parameters.
    2. Per-object Frustum culling.
    3. Cache GL state.
  11. GUI
    1. IMGUI

Feature List (work-in-progress)

  • Engine utility namespace:
    1. Logging.
  • Flexible OpenGL initialization.
  1. Add Camera functionality; add multiple camera variations: FPS, FlightSim, ArcBall.
  2. Configure Deferred rendering pipeline:
    1. Fog.

Feature List (todo)

  1. Skeletal animation:
    1. Define Bone structure on top of current scene hierarchy system.
    2. Load skeletal mesh from Assimp as skeletal hierarchy as well? Think of different design solutions that would work well in current environment.
    3. Animation blending.
  2. Complete code cleanup (re-factor where relevant), focussing on readability and maintainability. There are still a lot of items that do work, but could be better organized.
  3. Document the entire engine, describing architectural and semantic choices where relevant. Also include a walkthrough guide describing the best file order to start reading/understanding the engine.
  4. Configure cross-platform build files (there's currently 0 build support).

cell's People

Contributors

htmlboss avatar joeydevries avatar mmjoeydevries avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cell's Issues

How to configure the project

is there a step by step how to compile, run, required libs....
i have spent some time now trying to compile the code and been having issues with assimp and zilb.

tx.

Licence File is empty

The readme suggests open source, but there doesn't seem to be any indication of what licence you are releasing this under.

Adding directx/opengl es to cell

Hey joey.

Opengl is great but what do you think about having directx/opengl es too? I might be able to implement directx versions of the classes in your project and all you have to do is ask in the constructor of cell for which backend to choose.
Vulkan is new so most of the android devices don't support it. So isn't it a good idea to make your engine( with opengl es) also run on android?

Shadows is losing resolution with distance

I tried running your engine, and i gotta say, it's a very good structured engine!
So i wanted to give it a go, with another demo using my own models.
However, something is off with the shadows.
It looks like the shadows is losing resolution from the center.

Center:
layer 1

Away:
layer 3

Do you know what is causing this? I believed it was something to do with the shadow depth framebuffer, but it doesn't seem to be the case. The shadow depth rendertarget is completely normal. It seems so odd, I've never run into something like this.

dirLight.shadowBias = 0.0004;
dirLight.shadowSize = math::vec2(8192, 8192);
dirLight.shadowFrustumDimension = 100;
dirLight.shadowFrustumFar = 85;
dirLight.shadowFrustumNear = -45.0;
dirLight.Direction = math::vec3(-0.25f, -0.375f, -0.20f);

Nim port

Hi Joey!

Would you be open to a Nim port of this project? I'd like to also use BGFX as the rendering API rather than OpenGL.

If you're cool with the above - I'll probably get started this evening.

Thanks!

-Zach

Logical Error in Calculating Quaternion to axis angle.

In quaternion.h

inline vec4 quaternion::ToAxisAngle()
    {
        vec4 result;
        
        const float angle  = 2.0f * acos(w);
        const float length = sqrt(1.0f - angle*angle);

        result.xyz = vec3(x, y, z) / length;
        result.w   = angle;

        return result;
}

At the time calculating length it should be length = sqrt(1.0f - w*w); . And we should also check for length != 0. As per your previous code we can get angle greater than 1 so at that time the length will be undefined.

SSR shader authoring

Hello Joey, I see that you are using my Screen Space Reflections shader implementation, I'm glad that you found it useful, and I'm ok with you using it without any changes to my original code as shown here and here, but I would also like to see a link or some kind of credits to the original author inside the shader, since it's licensed under GNU General Public License v3.0

Greetings

mesh/sphere.cpp

hi bro, I find a tiny bug in file sphere.cpp:18
float xSegment = (float)x / (float)ySegments;
it should divide with xSegments not ySegments.

I just find it while copy this part into my project haha. I need to thank you for your great work! and tell u, we are still with u.

Ephemeral black rectangle on Screen

Hi Joey,

I noticed random black rectangles jumping off on the screen when I tested the app on my Quadro 2000 GPU. Did you find the effect on your device when running the app? If yes but hard to pin a black rectangle, you can move camera into any of 4 point light volumes.

If so, you can change only 'brdf.glsl' to avoid it. First add a epsilon to the denominator of DistributionGGX, the only one function of 3 GGXs where both the nominator and denominator can possibly equal to 0. Secondly, change expression 'pow(1.0 - cosTheta, 5.0)' to 'pow(max(1.0 - cosTheta, 0.0), 5.0)'. Here the cosTheta = dot(N, V) can be a little bigger than 1.0. The behavior of pow can be found here: [https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-pow](pow function in HLSL).

Specifically the black rectangle was caused by blur shader expanding NAN in our color buffer. If there is any NAN in the input color attachment the blur process will enlarge it and the pixels neighboring NAN one will become NAN too after this pass. After final pass all NAN pixels form the black rectangle on the screen. The NAN pixel is generally caused by undefined behaviors in shader, like 0/0 or pow(-1, 5).

These are potential glitches I found, not all of them. Wish it helps anyone confused by annoying black area :).

Incorrect quaternion vector rotation

I was looking at the code for quaternion vector rotation (multiplication) (line 141, math/linear_algebra/quaternion.h), and it seems to me that the formula shown in the comment was incorrectly applied in the implementation. I didn't test the engine directly but I wrote my own version of quaternions and tested that.

The correct implementation would probably look something like this:

return (2*(quat.w*quat.w)- 1.0f)vec + 2.0f(dot(quat.r, vec)quat.r + quat.wcross(quat.r, vec));

This version worked for me

Demo Not Loading

Hello!
I tried to compile and run demo project, but I only get a black window when running it.

How to fix?

Windows 7, 64-bit
Geforce GTX 1080
nVidia drivers 385.69

Demo dump:

INIT: Initializing GLFW
INIT: GLFW initialized
INIT: Initializing render system
INIT: OpenGL functions succesfully loaded.
INIT: Version - Major: 4 Minor: 3
INIT: Driver: NVIDIA Corporation Renderer: GeForce GTX 1080/PCIe/SSE2
INIT: Initializing debug Output.
INIT: Debug output initialized.
ERROR: Fragment shader compilation error at: post process!
0(41) : error C7011: implicit cast from "int" to "bool"
0(56) : error C7011: implicit cast from "int" to "bool"
0(69) : error C7011: implicit cast from "int" to "bool"
0(84) : error C7011: implicit cast from "int" to "bool"
0(88) : error C7011: implicit cast from "int" to "bool"

ERROR: Shader program linking error:
Fragment info

0(41) : error C7011: implicit cast from "int" to "bool"
0(56) : error C7011: implicit cast from "int" to "bool"
0(69) : error C7011: implicit cast from "int" to "bool"
0(84) : error C7011: implicit cast from "int" to "bool"
0(88) : error C7011: implicit cast from "int" to "bool"
(0) : error C2003: incompatible options for link

ERROR: Vertex shader compilation error at: default!
0(53) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(53) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Shader program linking error:
Vertex info

0(53) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(53) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

INIT: Loading texture file at: textures/checkerboard.png.
INIT: Succesfully loaded: textures/checkerboard.png.
INIT: Loading texture file at: textures/norm.png.
INIT: Succesfully loaded: textures/norm.png.
INIT: Loading texture file at: textures/black.png.
INIT: Succesfully loaded: textures/black.png.
INIT: Loading texture file at: textures/checkerboard.png.
INIT: Succesfully loaded: textures/checkerboard.png.
ERROR: Vertex shader compilation error at: glass!
0(50) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(50) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Fragment shader compilation error at: glass!
0(91) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(91) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Shader program linking error:
Vertex info

0(50) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(50) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

Fragment info

0(91) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(91) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

INIT: Loading texture file at: textures/glass.png.
INIT: Succesfully loaded: textures/glass.png.
INIT: Loading texture file at: textures/pbr/plastic/normal.png.
INIT: Succesfully loaded: textures/pbr/plastic/normal.png.
INIT: Loading texture file at: textures/pbr/plastic/metallic.png.
INIT: Succesfully loaded: textures/pbr/plastic/metallic.png.
INIT: Loading texture file at: textures/pbr/plastic/roughness.png.
INIT: Succesfully loaded: textures/pbr/plastic/roughness.png.
INIT: Loading texture file at: textures/pbr/plastic/ao.png.
INIT: Succesfully loaded: textures/pbr/plastic/ao.png.
ERROR: Vertex shader compilation error at: alpha blend!
0(50) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(50) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Fragment shader compilation error at: alpha blend!
0(91) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(91) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Shader program linking error:
Vertex info

0(50) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(50) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

Fragment info

0(91) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(91) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

ERROR: Vertex shader compilation error at: alpha discard!
0(50) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(50) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Fragment shader compilation error at: alpha discard!
0(91) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(91) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Shader program linking error:
Vertex info

0(50) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(50) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

Fragment info

0(91) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(91) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

ERROR: Vertex shader compilation error at: deferred ambient!
0(46) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(46) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Fragment shader compilation error at: deferred ambient!
0(219) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(219) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Shader program linking error:
Vertex info

0(46) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(46) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

Fragment info

0(219) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(219) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

ERROR: Vertex shader compilation error at: deferred directional!
0(46) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(46) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Fragment shader compilation error at: deferred directional!
0(163) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(163) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Shader program linking error:
Vertex info

0(46) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(46) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

Fragment info

0(163) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(163) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

ERROR: Vertex shader compilation error at: deferred point!
0(46) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(46) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Fragment shader compilation error at: deferred point!
0(122) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(122) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Shader program linking error:
Vertex info

0(46) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(46) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

Fragment info

0(122) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(122) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

ERROR: Vertex shader compilation error at: debug light!
0(43) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(43) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Shader program linking error:
Vertex info

0(43) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(43) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

ERROR: Fragment shader compilation error at: pbr:capture!
0(48) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(48) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Shader program linking error:
Fragment info

0(48) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(48) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

INIT: Render system initialized
ERROR: Vertex shader compilation error at: plasma orb!
0(49) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(49) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Fragment shader compilation error at: plasma orb!
0(47) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(47) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Shader program linking error:
Vertex info

0(49) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(49) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

Fragment info

0(47) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(47) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

INIT: Loading texture file at: textures/perlin.png.
INIT: Succesfully loaded: textures/perlin.png.
ERROR: Vertex shader compilation error at: background!
0(43) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(43) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable

ERROR: Shader program linking error:
Vertex info

0(43) : error C7532: layout qualifier 'binding' requires "#version 420" or later
0(43) : error C0000: ... or #extension GL_ARB_shading_language_420pack : enable
(0) : error C2003: incompatible options for link

INIT: Loading mesh file at: meshes/sponza/sponza.obj.
INIT: Succesfully loaded: meshes/sponza/sponza.obj.
INIT: Loading texture file at: meshes/sponza/textures\sponza_thorn_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_thorn_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\vase_plant.tga.
INIT: Succesfully loaded: meshes/sponza/textures\vase_plant.tga.
INIT: Loading texture file at: meshes/sponza/textures\vase_round.tga.
INIT: Succesfully loaded: meshes/sponza/textures\vase_round.tga.
INIT: Loading texture file at: meshes/sponza/textures\background.tga.
INIT: Succesfully loaded: meshes/sponza/textures\background.tga.
INIT: Loading texture file at: meshes/sponza/textures\gi_flag.tga.
WARNING: Texture failed to load at path: meshes/sponza/textures\gi_flag.tga
INIT: Succesfully loaded: meshes/sponza/textures\gi_flag.tga.
INIT: Loading texture file at: meshes/sponza/textures\gi_flag.tga.
WARNING: Texture failed to load at path: meshes/sponza/textures\gi_flag.tga
INIT: Succesfully loaded: meshes/sponza/textures\gi_flag.tga.
INIT: Loading texture file at: meshes/sponza/textures\spnza_bricks_a_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\spnza_bricks_a_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_arch_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_arch_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_ceiling_a_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_ceiling_a_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_column_a_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_column_a_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_floor_a_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_floor_a_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_column_c_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_column_c_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_details_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_details_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_column_b_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_column_b_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_flagpole_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_flagpole_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_fabric_green_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_fabric_green_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_fabric_blue_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_fabric_blue_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_fabric_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_fabric_diff.tga.
INIT: Loading texture file at: meshes/sponza/textures\sponza_curtain_blue_diff.tga.
INIT: Succesfully loaded: meshes/sponza/textures\sponza_curtain_blue_diff.tga.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.