• Advertisement
Sign in to follow this  

OpenGL OpenGL, GLUT or DirectX?

This topic is 4218 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

Hi. This is my first post on the openGL forum(i'm usually on general programming :) Anyway, I was wondering, for future reference, if I should use OpenGL, openGL + GLUT, or DirectX for any future graphical\game design? I have taken a shine to openGL, but I haven't really dabbled in the art of DirectX. I realise that topic will be subject to many opinions, so, i'd like to hear the pros and\or cons of OpenGL and DirectX etc... Also, what do commercial games use? (don't worry! I'm not going to fool myself into beleiving I can make an awesome 3D blockbuster just yet ;) I'm just curious... Anyway, i've got to get some coke (the essence of life [wink]). Thanking you warmly, Chris

Share this post


Link to post
Share on other sites
Advertisement
I wouldn't be able to tell you about which is best since I have never used anything more than some basic DirectDraw but from general knowledge and frequent informations I received things go generally a bit like this :

-Most Games, if not all these days, for windows are made using DirectX.

-DirectX 10 will be the next big thing for Vista so everyone developping for windows will probably use that in the long run.

-OpenGL is used for all other platforms such as MAC OS and Linux.

-I think, I'm not sure, but I think GLUT is a library meant for small to medium projects which helps in learning OpenGL and allows faster development as long as the project is not too complex. It really depends what you want to do with it.

Hope that helps a bit until someone much more knowledgeable comes in and gives you the hands on facts about it.

Share this post


Link to post
Share on other sites
They both drive the same hardware. They both do essentially the same thing. While its nice to know or be familiar with both, once you understand the concepts of the 3D graphics pipeline, you should be able to switch from one API to another with relative ease.

To that end, I would advocate sticking with what you know the most about already, to further your knowledge of the fundamentals. Some execellent books on the subject of 3D graphics that will help you ensure you know what's really going on:

"The Geometry Toolbox"

"Essential Mathematics for Games and Interactive Applications: A Programmers Guide"

"Fundamentals of Computer Graphics"

Share this post


Link to post
Share on other sites
For the most part, games in Windows are developed under DirectX

Glut is an old (and unsupported) API for small scale development - not really meant for serious development. An alternative is SDL - Simple DirectMedia Layer. This works on all major platforms, and is generally thought of as a "replacement" for DirectX (when combined with OpenGL). Games that use it include Neverwinter Nights and Unreal Tournament 2004.

Use whatever you feel more comfortable with and whatever fits your desires - if you want everyone to play it, use OpenGL. If you want to lock out non-windows users, use DirectX. If there's a feature available in DirectX but not OpenGL that you need, use DirectX, and vice versa.

Share this post


Link to post
Share on other sites
Keep in mind that just because you use one part of DX doesn't mean you have to use all of it, for example Quake3 and Doom3 both use OpenGL as the renderer but use DirectSound for sound fx and I believe directInput for input. So mixing and matching isn't a problem.

Share this post


Link to post
Share on other sites
Thanks for all your help\opinions!

I've been looking into the various advantages\disadvantages of the 2 APIs and i've decided on......[drum roll] .............................................DirectX!
I only want to develop games for Windows and DirectX seems more complete, what with DirectDraw\Play\etc...(that's just my opinion! please don't persecute me for my beleifs!!!)

Just another quick question: Will there be any major differences in the Windows 64 -bit API(Vista) as opposed to the "old" 32-bit version?

Thanks,
Chris

Share this post


Link to post
Share on other sites
It was only recently that I've stumbled upon this great site:
http://www.humus.ca/index.php?page=3D&&start=0

It has a framework that supports:
* OpenGL
* Direct3D
* OpenAL

I had a look in its design and I have to say that its quite clever. You specify what you want to use and with a single interface you draw something on your rendering context without having to fully implement OpenGL or Direct3D! For instance, using the vertex buffer is wrapped nicely in a class for you. For nice sound it uses OpenAL (a pretty good clone of DirectPlay), instead of MP3s it can play Ogg Vorbis, etc.

If you need a good framework... check that one out! Framework 3.
Its got everything you need!
O, and its cross platform with Linux aswell if you use OpenGL.

Even if you don't want this cool framework, check out the rest of the site... has cool demos for both OGL and D3D.

Share this post


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

  • Advertisement
  • Advertisement
  • Popular Tags

  • Advertisement
  • Popular Now

  • Similar Content

    • By QQemka
      Hello. I am coding a small thingy in my spare time. All i want to achieve is to load a heightmap (as the lowest possible walking terrain), some static meshes (elements of the environment) and a dynamic character (meaning i can move, collide with heightmap/static meshes and hold a varying item in a hand ). Got a bunch of questions, or rather problems i can't find solution to myself. Nearly all are deal with graphics/gpu, not the coding part. My c++ is on high enough level.
      Let's go:
      Heightmap - i obviously want it to be textured, size is hardcoded to 256x256 squares. I can't have one huge texture stretched over entire terrain cause every pixel would be enormous. Thats why i decided to use 2 specified textures. First will be a tileset consisting of 16 square tiles (u v range from 0 to 0.25 for first tile and so on) and second a 256x256 buffer with 0-15 value representing index of the tile from tileset for every heigtmap square. Problem is, how do i blend the edges nicely and make some computationally cheap changes so its not obvious there are only 16 tiles? Is it possible to generate such terrain with some existing program?
      Collisions - i want to use bounding sphere and aabb. But should i store them for a model or entity instance? Meaning i have 20 same trees spawned using the same tree model, but every entity got its own transformation (position, scale etc). Storing collision component per instance grats faster access + is precalculated and transformed (takes additional memory, but who cares?), so i stick with this, right? What should i do if object is dynamically rotated? The aabb is no longer aligned and calculating per vertex min/max everytime object rotates/scales is pretty expensive, right?
      Drawing aabb - problem similar to above (storing aabb data per instance or model). This time in my opinion per model is enough since every instance also does not have own vertex buffer but uses the shared one (so 20 trees share reference to one tree model). So rendering aabb is about taking the model's aabb, transforming with instance matrix and voila. What about aabb vertex buffer (this is more of a cosmetic question, just curious, bumped onto it in time of writing this). Is it better to make it as 8 points and index buffer (12 lines), or only 2 vertices with min/max x/y/z and having the shaders dynamically generate 6 other vertices and draw the box? Or maybe there should be just ONE 1x1x1 cube box template moved/scaled per entity?
      What if one model got a diffuse texture and a normal map, and other has only diffuse? Should i pass some bool flag to shader with that info, or just assume that my game supports only diffuse maps without fancy stuff?
      There were several more but i forgot/solved them at time of writing
      Thanks in advance
    • By RenanRR
      Hi All,
      I'm reading the tutorials from learnOpengl site (nice site) and I'm having a question on the camera (https://learnopengl.com/Getting-started/Camera).
      I always saw the camera being manipulated with the lookat, but in tutorial I saw the camera being changed through the MVP arrays, which do not seem to be camera, but rather the scene that changes:
      Vertex Shader:
      #version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec2 aTexCoord; out vec2 TexCoord; uniform mat4 model; uniform mat4 view; uniform mat4 projection; void main() { gl_Position = projection * view * model * vec4(aPos, 1.0f); TexCoord = vec2(aTexCoord.x, aTexCoord.y); } then, the matrix manipulated:
      ..... glm::mat4 projection = glm::perspective(glm::radians(fov), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f); ourShader.setMat4("projection", projection); .... glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp); ourShader.setMat4("view", view); .... model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f)); ourShader.setMat4("model", model);  
      So, some doubts:
      - Why use it like that?
      - Is it okay to manipulate the camera that way?
      -in this way, are not the vertex's positions that changes instead of the camera?
      - I need to pass MVP to all shaders of object in my scenes ?
       
      What it seems, is that the camera stands still and the scenery that changes...
      it's right?
       
       
      Thank you
       
    • By dpadam450
      Sampling a floating point texture where the alpha channel holds 4-bytes of packed data into the float. I don't know how to cast the raw memory to treat it as an integer so I can perform bit-shifting operations.

      int rgbValue = int(textureSample.w);//4 bytes of data packed as color
      // algorithm might not be correct and endianness might need switching.
      vec3 extractedData = vec3(  rgbValue & 0xFF000000,  (rgbValue << 8) & 0xFF000000, (rgbValue << 16) & 0xFF000000);
      extractedData /= 255.0f;
    • By Devashish Khandelwal
      While writing a simple renderer using OpenGL, I faced an issue with the glGetUniformLocation function. For some reason, the location is coming to be -1.
      Anyone has any idea .. what should I do?
    • By Andrey OGL_D3D
      Hi all!
      I try to use the Sun shafts effects via post process in my 3DEngine, but i have some artefacts on final image(Please see attached images).
      The effect contains the following passes:
      1) Depth scene pass;
      2) "Shafts pass" Using DepthPass Texture + RGBA BackBuffer texture.
      3) Shafts pass texture +  RGBA BackBuffer texture.
      Shafts shader for 2 pass:
      // uniform sampler2D FullSampler; // RGBA Back Buffer uniform sampler2D DepthSampler; varying vec2 tex; #ifndef saturate float saturate(float val) {     return clamp(val, 0.0, 1.0); } #endif void main(void) {     vec2 uv = tex;     float sceneDepth = texture2D(DepthSampler, uv.xy).r;     vec4  scene        = texture2D(FullSampler, tex);     float fShaftsMask     = (1.0 - sceneDepth);     gl_FragColor = vec4( scene.xyz * saturate(sceneDepth), fShaftsMask ); } final shader:
      // uniform sampler2D FullSampler; // RGBA Back Buffer uniform sampler2D BlurSampler; // shafts sampler varying vec4 Sun_pos; const vec4    ShaftParams = vec4(0.1,2.0,0.1,2.0); varying vec2 Tex_UV; #ifndef saturate  float saturate(float val) {     return clamp(val, 0.0, 1.0); } #endif vec4 blendSoftLight(vec4 a, vec4 b) {   vec4 c = 2.0 * a * b + a * a * (1.0 - 2.0 * b);   vec4 d = sqrt(a) * (2.0 * b - 1.0) + 2.0 * a * (1.0 - b);       // TODO: To look in Crysis what it the shit???   //return ( b < 0.5 )? c : d;   return any(lessThan(b, vec4(0.5,0.5,0.5,0.5)))? c : d; } void main(void) {     vec4 sun_pos = Sun_pos;     vec2    sunPosProj = sun_pos.xy;     //float    sign = sun_pos.w;     float    sign = 1.0;     vec2    sunVec = sunPosProj.xy - (Tex_UV.xy - vec2(0.5, 0.5));     float    sunDist = saturate(sign) * saturate( 1.0 - saturate(length(sunVec) * ShaftParams.y ));     sunVec *= ShaftParams.x * sign;     vec4 accum;     vec2 tc = Tex_UV.xy;     tc += sunVec;     accum = texture2D(BlurSampler, tc);     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.875;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.75;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.625;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.5;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.375;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.25;     tc += sunVec;     accum += texture2D(BlurSampler, tc) * 0.125;     accum  *= 0.25 * vec4(sunDist, sunDist, sunDist, 1.0);           accum.w += 1.0 - saturate(saturate(sign * 0.1 + 0.9));     vec4    cScreen = texture2D(FullSampler, Tex_UV.xy);           vec4    cSunShafts = accum;     float fShaftsMask = saturate(1.00001 - cSunShafts.w) * ShaftParams.z * 2.0;              float fBlend = cSunShafts.w;     vec4 sunColor = vec4(0.9, 0.8, 0.6, 1.0);     accum =  cScreen + cSunShafts.xyzz * ShaftParams.w * sunColor * (1.0 - cScreen);     accum = blendSoftLight(accum, sunColor * fShaftsMask * 0.5 + 0.5);     gl_FragColor = accum; } Demo project:
      Demo Project
      Shaders for postprocess Shaders/SunShaft/
      What i do wrong ?
      Thanks!
       


  • Advertisement