Sign in to follow this  
tmason

OpenGL Working with UV coordinates when they are not in the range of 0 - 1

Recommended Posts

tmason    326
Hello,

I am using a loading library which supplies UV coordinates as shown below.

Note that these coordinates are not in the range of 0.0 - 1.0

Therefore the textures aren't mapping properly and the end results suck.

I tried using GLSL's clamp as shown below in the fragment shader but that doesn't work.

How do I work with these UV coordinates?

Thank you for your time:

GLSL shader snippet:
 
MaterialTextureColor = texture2D(MainTextureSampler, clamp(TextureCoordinates, 0, 1));
UV Coordinates:

Note that this is just a textual representation, the coordinates are floats within C++/OpenGL when loaded.
 
UV Point: S: -53.0558 T: -15.3896
UV Point: S: 5.99937 T: -15.3896
UV Point: S: -3.84315 T: 2.00539
UV Point: S: -3.84315 T: 2.00539
UV Point: S: 5.99937 T: -15.3896
UV Point: S: 5.99937 T: 2.00539
UV Point: S: -53.0558 T: -15.3896
UV Point: S: -3.84315 T: 2.00539
UV Point: S: -53.0558 T: 4.29541
UV Point: S: -3.84315 T: 4.29541
UV Point: S: -53.0558 T: 4.29541
UV Point: S: -3.84315 T: 2.00539
UV Point: S: -3.84315 T: -2.00539
UV Point: S: -53.0558 T: -4.29541
UV Point: S: -3.84315 T: -4.29541
UV Point: S: -3.84315 T: -2.00539
UV Point: S: 5.99937 T: 15.3896
UV Point: S: -53.0558 T: 15.3896
UV Point: S: 5.99937 T: 15.3896
UV Point: S: -3.84315 T: -2.00539
UV Point: S: 5.99937 T: -2.00539
UV Point: S: -3.84315 T: -2.00539
UV Point: S: -53.0558 T: 15.3896
UV Point: S: -53.0558 T: -4.29541
UV Point: S: -2.00539 T: -0.492126
UV Point: S: 15.3896 T: -0.492126
UV Point: S: 15.3896 T: 3.75462e^-009
UV Point: S: 15.3896 T: 3.75462e^-009
UV Point: S: -2.00539 T: 3.75462e^-009
UV Point: S: -2.00539 T: -0.492126
UV Point: S: -3.84315 T: -0.492126
UV Point: S: 5.99937 T: -0.492126
UV Point: S: 5.99937 T: 3.75462e^-009
UV Point: S: 5.99937 T: 3.75462e^-009
UV Point: S: -3.84315 T: 3.75462e^-009
UV Point: S: -3.84315 T: -0.492126
UV Point: S: -4.29541 T: -0.492126
UV Point: S: -2.00539 T: -0.492126
UV Point: S: -2.00539 T: 3.75462e^-009
UV Point: S: -2.00539 T: 3.75462e^-009
UV Point: S: -4.29541 T: 3.75462e^-009
UV Point: S: -4.29541 T: -0.492126
UV Point: S: -53.0557 T: -0.492126
UV Point: S: -3.84315 T: -0.492126
UV Point: S: -53.0557 T: 3.75462e^-009
UV Point: S: -3.84315 T: 3.75462e^-009
UV Point: S: -53.0557 T: 3.75462e^-009
UV Point: S: -3.84315 T: -0.492126
UV Point: S: -15.3896 T: -0.492126
UV Point: S: 4.29541 T: -0.492126
UV Point: S: 4.29541 T: 3.75462e^-009
UV Point: S: 4.29541 T: 3.75462e^-009
UV Point: S: -15.3896 T: 3.75462e^-009
UV Point: S: -15.3896 T: -0.492126
UV Point: S: 5.99937 T: 0.492126
UV Point: S: -53.0558 T: 0.492126
UV Point: S: -53.0558 T: -3.75462e^-009
UV Point: S: -53.0558 T: -3.75462e^-009
UV Point: S: 5.99937 T: -3.75462e^-009
UV Point: S: 5.99937 T: 0.492126
Edited by tmason

Share this post


Link to post
Share on other sites
JordanBonser    839

That seems like a pretty strange representation, are you sure there is not a problem with the file or the way it is being exported from the program it is being created in?

 

The only other thing I could think of is finding out what the number range is and then doing a pre-process step to convert the UV  co-ordinates in the 0 to 1 range. 

Share this post


Link to post
Share on other sites
tmason    326
JordanBonser, on 09 Jul 2014 - 08:31 AM, said:JordanBonser, on 09 Jul 2014 - 08:31 AM, said:

That seems like a pretty strange representation, are you sure there is not a problem with the file or the way it is being exported from the program it is being created in?

 

The only other thing I could think of is finding out what the number range is and then doing a pre-process step to convert the UV  co-ordinates in the 0 to 1 range. 

 

 

I am using AutoDESK's FBX library; and I am using their example code like so:

bool lUnmappedUV;
pMesh->GetPolygonVertexUV(lPolygonIndex, lVerticeIndex, lUVName, lCurrentUV, lUnmappedUV);
lUVs[lVertexCount * UV_STRIDE] = static_cast<float>(lCurrentUV[0]);
lUVs[lVertexCount * UV_STRIDE + 1] = static_cast<float>(lCurrentUV[1]);

I'll look for the number range, that might help.

 

Thank you.

Edited by tmason

Share this post


Link to post
Share on other sites
JordanBonser    839

I'm not familiar with the FBX SDK but a quick look up shows me that the last parameter says whether the UV's are actually mapped to the vertex and also that the GetPolygonVertexUV returns a bool to say whether it succeeds. 

 

I would check both of these to ensure that there isn't something going wrong and that the data is being filled correctly. 

Share this post


Link to post
Share on other sites
tmason    326

I'm not familiar with the FBX SDK but a quick look up shows me that the last parameter says whether the UV's are actually mapped to the vertex and also that the GetPolygonVertexUV returns a bool to say whether it succeeds. 
 
I would check both of these to ensure that there isn't something going wrong and that the data is being filled correctly.


Thank you for checking; I can verify that (1) the UVs are mapped to the vertex (lUnmappedUV equals false in my sample above) and (2) the function returns a success (true) value.

Not sure what else is happening...

Share this post


Link to post
Share on other sites
HappyCoder    5052

It is fine to have uv coordinates outside the range of 0-1. When you create the texture you are sampling, you can specify how samples outside the range are handled.

glTexParameter

gTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

What do you mean that the texture aren't mapping properly? You may need to flip your v texture coordinate. This is because opengl has the origin at the bottom left for textures and most other APIs use the top left. To switch between the two all you need to do is subract the vertical coordinate from one.

texCoord.v = 1 - texCoord.v

Share this post


Link to post
Share on other sites
tmason    326

It is fine to have uv coordinates outside the range of 0-1. When you create the texture you are sampling, you can specify how samples outside the range are handled.
glTexParameter

gTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

Tried that; same result. Picture will be posted below of what I get.
 

What do you mean that the texture aren't mapping properly? You may need to flip your v texture coordinate. This is because opengl has the origin at the bottom left for textures and most other APIs use the top left. To switch between the two all you need to do is subract the vertical coordinate from one.

texCoord.v = 1 - texCoord.v

I tried this as well.
 

bool lUnmappedUV;
bool SuccessFail = false;
SuccessFail = pMesh->GetPolygonVertexUV(lPolygonIndex, lVerticeIndex, lUVName, lCurrentUV, lUnmappedUV);
lUVs[lVertexCount * UV_STRIDE] = 1 - static_cast<float>(lCurrentUV[0]);
lUVs[lVertexCount * UV_STRIDE + 1] = static_cast<float>(lCurrentUV[1]);

Note my original post though; coordinates vary all over the place.

I get ranges all over the place which I suspect is why clamping doesn't work as well.

Anyway, here is an image of what I mean when I say it doesn't work:

 

Bad_Texture_Coordinates.png

Share this post


Link to post
Share on other sites
tmason    326
I thought it might be easier to see a simpler example of what I have going on.

Here is a very simple model's coordinates for vertices, normals, and UV's:

Vertex:  X: -1 Y: -1 Z: -1 Normal:  X: 0 Y: 0 Z: -1 UV Point:  S: 0.998895 T: 0.992545
Vertex:  X: 1 Y: 1 Z: -1 Normal:  X: 0 Y: 0 Z: -1 UV Point:  S: 0.0232662 T: 0.0169165
Vertex:  X: 1 Y: -1 Z: -1 Normal:  X: 0 Y: 0 Z: -1 UV Point:  S: 0.998895 T: 0.0169165
Vertex:  X: 1 Y: 1 Z: -1 Normal:  X: 0 Y: 0 Z: -1 UV Point:  S: 0.0232662 T: 0.0169165
Vertex:  X: -1 Y: -1 Z: -1 Normal:  X: 0 Y: 0 Z: -1 UV Point:  S: 0.998895 T: 0.992545
Vertex:  X: -1 Y: 1 Z: -1 Normal:  X: 0 Y: 0 Z: -1 UV Point:  S: 0.023266 T: 0.992545
Vertex:  X: -1 Y: 1 Z: 1 Normal:  X: 2.98023e-008 Y: 0 Z: 1 UV Point:  S: 0.333333 T: 0.666667
Vertex:  X: 0.999999 Y: -1 Z: 1 Normal:  X: 2.98023e-008 Y: 0 Z: 1 UV Point:  S: 0 T: 0.333333
Vertex:  X: 1 Y: 0.999999 Z: 1 Normal:  X: 2.98023e-008 Y: 0 Z: 1 UV Point:  S: 0.333333 T: 0.333333
Vertex:  X: 0.999999 Y: -1 Z: 1 Normal:  X: 2.98023e-008 Y: 0 Z: 1 UV Point:  S: 0 T: 0.333333
Vertex:  X: -1 Y: 1 Z: 1 Normal:  X: 2.98023e-008 Y: 0 Z: 1 UV Point:  S: 0.333333 T: 0.666667
Vertex:  X: -1 Y: -1 Z: 1 Normal:  X: 2.98023e-008 Y: 0 Z: 1 UV Point:  S: 4.96705e-008 T: 0.666667
Vertex:  X: 1 Y: 0.999999 Z: 1 Normal:  X: 1 Y: -2.98023e-007 Z: 4.47034e-008 UV Point:  S: 0.333333 T: 0.333333
Vertex:  X: 1 Y: -1 Z: -1 Normal:  X: 1 Y: -2.98023e-007 Z: 4.47034e-008 UV Point:  S: 0.666667 T: 1.98682e-008
Vertex:  X: 1 Y: 1 Z: -1 Normal:  X: 1 Y: -2.98023e-007 Z: 4.47034e-008 UV Point:  S: 0.666667 T: 0.333333
Vertex:  X: 1 Y: -1 Z: -1 Normal:  X: 1 Y: -2.98023e-007 Z: 4.47034e-008 UV Point:  S: 0.666667 T: 1.98682e-008
Vertex:  X: 1 Y: 0.999999 Z: 1 Normal:  X: 1 Y: -2.98023e-007 Z: 4.47034e-008 UV Point:  S: 0.333333 T: 0.333333
Vertex:  X: 0.999999 Y: -1 Z: 1 Normal:  X: 1 Y: -2.98023e-007 Z: 4.47034e-008 UV Point:  S: 0.333333 T: 0
Vertex:  X: 0.999999 Y: -1 Z: 1 Normal:  X: -2.83122e-007 Y: -1 Z: -1.78814e-007 UV Point:  S: 0 T: 1.29143e-007
Vertex:  X: -1 Y: -1 Z: -1 Normal:  X: -2.83122e-007 Y: -1 Z: -1.78814e-007 UV Point:  S: 0.333333 T: 0.333333
Vertex:  X: 1 Y: -1 Z: -1 Normal:  X: -2.83122e-007 Y: -1 Z: -1.78814e-007 UV Point:  S: 2.98023e-008 T: 0.333333
Vertex:  X: -1 Y: -1 Z: -1 Normal:  X: -2.83122e-007 Y: -1 Z: -1.78814e-007 UV Point:  S: 0.333333 T: 0.333333
Vertex:  X: 0.999999 Y: -1 Z: 1 Normal:  X: -2.83122e-007 Y: -1 Z: -1.78814e-007 UV Point:  S: 0 T: 1.29143e-007
Vertex:  X: -1 Y: -1 Z: 1 Normal:  X: -2.83122e-007 Y: -1 Z: -1.78814e-007 UV Point:  S: 0.333333 T: 0
Vertex:  X: -1 Y: 1 Z: 1 Normal:  X: -1 Y: 2.38419e-007 Z: -1.3411e-007 UV Point:  S: 0.666667 T: 8.9407e-008
Vertex:  X: -1 Y: -1 Z: -1 Normal:  X: -1 Y: 2.38419e-007 Z: -1.3411e-007 UV Point:  S: 1 T: 0.333333
Vertex:  X: -1 Y: -1 Z: 1 Normal:  X: -1 Y: 2.38419e-007 Z: -1.3411e-007 UV Point:  S: 0.666667 T: 0.333333
Vertex:  X: -1 Y: -1 Z: -1 Normal:  X: -1 Y: 2.38419e-007 Z: -1.3411e-007 UV Point:  S: 1 T: 0.333333
Vertex:  X: -1 Y: 1 Z: 1 Normal:  X: -1 Y: 2.38419e-007 Z: -1.3411e-007 UV Point:  S: 0.666667 T: 8.9407e-008
Vertex:  X: -1 Y: 1 Z: -1 Normal:  X: -1 Y: 2.38419e-007 Z: -1.3411e-007 UV Point:  S: 1 T: 0
Vertex:  X: -1 Y: 1 Z: 1 Normal:  X: 2.38419e-007 Y: 1 Z: 1.63913e-007 UV Point:  S: 0.333333 T: 0.666667
Vertex:  X: 1 Y: 1 Z: -1 Normal:  X: 2.38419e-007 Y: 1 Z: 1.63913e-007 UV Point:  S: 0.666667 T: 0.333333
Vertex:  X: -1 Y: 1 Z: -1 Normal:  X: 2.38419e-007 Y: 1 Z: 1.63913e-007 UV Point:  S: 0.666667 T: 0.666667
Vertex:  X: 1 Y: 1 Z: -1 Normal:  X: 2.38419e-007 Y: 1 Z: 1.63913e-007 UV Point:  S: 0.666667 T: 0.333333
Vertex:  X: -1 Y: 1 Z: 1 Normal:  X: 2.38419e-007 Y: 1 Z: 1.63913e-007 UV Point:  S: 0.333333 T: 0.666667
Vertex:  X: 1 Y: 0.999999 Z: 1 Normal:  X: 2.38419e-007 Y: 1 Z: 1.63913e-007 UV Point:  S: 0.333333 T: 0.333333
The MVP Matrix for this model:

x: 1,000.0 y: 0.0, z: 0.0, w: 0.0

x: 1,000.0 y: -0.00162920682 , z: -1000.0, w: 0.0

x: 0.0 y: 200.0, z: -3.25841356e-005, w: 0.0

x: 0.0 y: 0.0, z: 0.0, w: 1.0
The wireframe of the model:

Wire_Frame.png

The texture:

Seamless-Dark-Wood-Texturevertical-Woode

The resultant final image with texture:

Final_Image.png

Share this post


Link to post
Share on other sites
Rootus    851

Hello!

 

Since the geometry data of your simple model seem to be correct, the texturing problem revealed by your final image may be caused by a faulty OpenGL code specifying this geometry (I think maybe somewhere in glTexCoord calls).

Edited by Rootus

Share this post


Link to post
Share on other sites
tmason    326

Hello!

 

Since the geometry data of your simple model seem to be correct, the texturing problem revealed by your final image may be caused by a faulty OpenGL code specifying this geometry (I think maybe somewhere in glTexCoord calls).

 

Thank you for your reply. I have created forum posts on AutoDESK's FBX SDK forums which is the library I use but they haven't replied back.

 

The code is based on their example so I will see if there is another example out there somewhere.

Share this post


Link to post
Share on other sites
L. Spiro    25621
How did you print those new set of vertices?
The original UV’s you printed are very obviously not correct.
The second set has the correct values but in the wrong places.

Are you correctly indexing into the pools of normals, control points, and UV’s?
Because you know that there are 4 ways to determine which UV to use and the file can use any of them, and it appears that you have valid values, but mismatched between vertices (correct value, wrong place).


L. Spiro

Share this post


Link to post
Share on other sites
tmason    326

How did you print those new set of vertices?
The original UV’s you printed are very obviously not correct.
The second set has the correct values but in the wrong places.

Are you correctly indexing into the pools of normals, control points, and UV’s?
Because you know that there are 4 ways to determine which UV to use and the file can use any of them, and it appears that you have valid values, but mismatched between vertices (correct value, wrong place).


L. Spiro

 

You hinted at the correct problem to solve.

 

I fixed this by actually setting the correct offset for my normals and UV's in the call to glVertexAttribPointer() and now everything works.

 

Thanks to everyone for all of your help.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Similar Content

    • By Zaphyk
      I am developing my engine using the OpenGL 3.3 compatibility profile. It runs as expected on my NVIDIA card and on my Intel Card however when I tried it on an AMD setup it ran 3 times worse than on the other setups. Could this be a AMD driver thing or is this probably a problem with my OGL code? Could a different code standard create such bad performance?
    • By Kjell Andersson
      I'm trying to get some legacy OpenGL code to run with a shader pipeline,
      The legacy code uses glVertexPointer(), glColorPointer(), glNormalPointer() and glTexCoordPointer() to supply the vertex information.
      I know that it should be using setVertexAttribPointer() etc to clearly define the layout but that is not an option right now since the legacy code can't be modified to that extent.
      I've got a version 330 vertex shader to somewhat work:
      #version 330 uniform mat4 osg_ModelViewProjectionMatrix; uniform mat4 osg_ModelViewMatrix; layout(location = 0) in vec4 Vertex; layout(location = 2) in vec4 Normal; // Velocity layout(location = 3) in vec3 TexCoord; // TODO: is this the right layout location? out VertexData { vec4 color; vec3 velocity; float size; } VertexOut; void main(void) { vec4 p0 = Vertex; vec4 p1 = Vertex + vec4(Normal.x, Normal.y, Normal.z, 0.0f); vec3 velocity = (osg_ModelViewProjectionMatrix * p1 - osg_ModelViewProjectionMatrix * p0).xyz; VertexOut.velocity = velocity; VertexOut.size = TexCoord.y; gl_Position = osg_ModelViewMatrix * Vertex; } What works is the Vertex and Normal information that the legacy C++ OpenGL code seem to provide in layout location 0 and 2. This is fine.
      What I'm not getting to work is the TexCoord information that is supplied by a glTexCoordPointer() call in C++.
      Question:
      What layout location is the old standard pipeline using for glTexCoordPointer()? Or is this undefined?
       
      Side note: I'm trying to get an OpenSceneGraph 3.4.0 particle system to use custom vertex, geometry and fragment shaders for rendering the particles.
    • By markshaw001
      Hi i am new to this forum  i wanted to ask for help from all of you i want to generate real time terrain using a 32 bit heightmap i am good at c++ and have started learning Opengl as i am very interested in making landscapes in opengl i have looked around the internet for help about this topic but i am not getting the hang of the concepts and what they are doing can some here suggests me some good resources for making terrain engine please for example like tutorials,books etc so that i can understand the whole concept of terrain generation.
       
    • By KarimIO
      Hey guys. I'm trying to get my application to work on my Nvidia GTX 970 desktop. It currently works on my Intel HD 3000 laptop, but on the desktop, every bind textures specifically from framebuffers, I get half a second of lag. This is done 4 times as I have three RGBA textures and one depth 32F buffer. I tried to use debugging software for the first time - RenderDoc only shows SwapBuffers() and no OGL calls, while Nvidia Nsight crashes upon execution, so neither are helpful. Without binding it runs regularly. This does not happen with non-framebuffer binds.
      GLFramebuffer::GLFramebuffer(FramebufferCreateInfo createInfo) { glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); textures = new GLuint[createInfo.numColorTargets]; glGenTextures(createInfo.numColorTargets, textures); GLenum *DrawBuffers = new GLenum[createInfo.numColorTargets]; for (uint32_t i = 0; i < createInfo.numColorTargets; i++) { glBindTexture(GL_TEXTURE_2D, textures[i]); GLint internalFormat; GLenum format; TranslateFormats(createInfo.colorFormats[i], format, internalFormat); // returns GL_RGBA and GL_RGBA glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, createInfo.width, createInfo.height, 0, format, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); DrawBuffers[i] = GL_COLOR_ATTACHMENT0 + i; glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, textures[i], 0); } if (createInfo.depthFormat != FORMAT_DEPTH_NONE) { GLenum depthFormat; switch (createInfo.depthFormat) { case FORMAT_DEPTH_16: depthFormat = GL_DEPTH_COMPONENT16; break; case FORMAT_DEPTH_24: depthFormat = GL_DEPTH_COMPONENT24; break; case FORMAT_DEPTH_32: depthFormat = GL_DEPTH_COMPONENT32; break; case FORMAT_DEPTH_24_STENCIL_8: depthFormat = GL_DEPTH24_STENCIL8; break; case FORMAT_DEPTH_32_STENCIL_8: depthFormat = GL_DEPTH32F_STENCIL8; break; } glGenTextures(1, &depthrenderbuffer); glBindTexture(GL_TEXTURE_2D, depthrenderbuffer); glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, createInfo.width, createInfo.height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthrenderbuffer, 0); } if (createInfo.numColorTargets > 0) glDrawBuffers(createInfo.numColorTargets, DrawBuffers); else glDrawBuffer(GL_NONE); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "Framebuffer Incomplete\n"; glBindFramebuffer(GL_FRAMEBUFFER, 0); width = createInfo.width; height = createInfo.height; } // ... // FBO Creation FramebufferCreateInfo gbufferCI; gbufferCI.colorFormats = gbufferCFs.data(); gbufferCI.depthFormat = FORMAT_DEPTH_32; gbufferCI.numColorTargets = gbufferCFs.size(); gbufferCI.width = engine.settings.resolutionX; gbufferCI.height = engine.settings.resolutionY; gbufferCI.renderPass = nullptr; gbuffer = graphicsWrapper->CreateFramebuffer(gbufferCI); // Bind glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); // Draw here... // Bind to textures glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textures[1]); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, textures[2]); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, depthrenderbuffer); Here is an extract of my code. I can't think of anything else to include. I've really been butting my head into a wall trying to think of a reason but I can think of none and all my research yields nothing. Thanks in advance!
    • By Adrianensis
      Hi everyone, I've shared my 2D Game Engine source code. It's the result of 4 years working on it (and I still continue improving features ) and I want to share with the community. You can see some videos on youtube and some demo gifs on my twitter account.
      This Engine has been developed as End-of-Degree Project and it is coded in Javascript, WebGL and GLSL. The engine is written from scratch.
      This is not a professional engine but it's for learning purposes, so anyone can review the code an learn basis about graphics, physics or game engine architecture. Source code on this GitHub repository.
      I'm available for a good conversation about Game Engine / Graphics Programming
  • Popular Now