Thread: OpenGL vs. DirectX ???

  1. #16
    Crazy Fool Perspective's Avatar
    Join Date
    Jan 2003
    Location
    Canada
    Posts
    2,640
    Originally posted by confuted
    It looks like you're forgetting to link some libraries.

    And there are things DirectX can do that OpenGL can not. For one, I don't think OpenGL has support for shaders (pixel/vertex) while DirectX does. Also, DirectX has support for your graphics looking good, while OpenGL does not DirectX also runs better on most video cards than OpenGL, since the cards are optimized with DX in mind.
    confuted, your just making up 'facts' left and right. this is unlike you. you should verify that the things you are saying are correct before you say them. Youre gonna corrupt the minds of trusting, unknowing noobies.

  2. #17
    Pursuing knowledge confuted's Avatar
    Join Date
    Jun 2002
    Posts
    1,916
    Perspective, not exactly. I have an NVidia card with the latest drivers, and I know it runs DirectX stuff quite well, and runs OpenGL stuff like crap. It could just be me, but my experience points to DirectX stuff running a lot faster. (20x-30x faster, actually)
    Away.

  3. #18
    *******argv[] - hu? darksaidin's Avatar
    Join Date
    Jul 2003
    Posts
    314
    Originally posted by confuted
    Perspective, not exactly. I have an NVidia card with the latest drivers, and I know it runs DirectX stuff quite well, and runs OpenGL stuff like crap. It could just be me, but my experience points to DirectX stuff running a lot faster. (20x-30x faster, actually)
    That is just you. Either you use a software rasterizer or there is something wrong with your driver. As far as I remember, some older versions of the Unreal Engine had problems with OpenGL/Glide. Other than that craptastic game, I don't know anything thats faster in Direct3D mode.
    Actually, a lot of people already tested this and found little to zero difference in the API speed. Just google for "opengl vs. directx" If at all, OpenGL should be faster because it is closer to the hardware (you have to code for a specific codepath, DirectX selects it at runtime afaik).

  4. #19
    Registered User
    Join Date
    May 2003
    Posts
    1,619
    Originally posted by darksaidin
    I may be a bit biased, but as long as games like Quake and Doom3 prefer OpenGL over DirectX, I'll stick with OpenGL =)
    They may well prefer it simply because the cost of moving between APIs is very large.

    As to documentation, DirectX has adequate references on MSDN. Yes, you're not going to learn DirectX very easily from online tutorials. Buy a book. I think many are spoiled in the net age; something as complicated as DirectX, or COM programming, or the STL, etc. can't be distilled small enough to be easily digested in tutorial form. A 6 page website done by an amateur author won't hold a candle to an 800 page book written (we hope) by a professional. Be aware, there are lots of crappy books, but a good book will blow all tutorials out of the water. A good tutorial shows how to do a task, a good book can spend 10 pages discussing why we do it, and how the code works in detail.

    I think it's like the difference between a good recipe and a good cooking show/good author, like Alton Brown. If you have a good recipe, follow it exactly, and want to only do that recipe, then you're set. For example, I can post an excellent recipe for very chewy chocolate chip oatmeal cookies. But if you wanted, say, a good chewy peanut butter cookie, my recipe is useless. If, instead, I explained why and how we make the cookie chewy, you can easily adapt another recipe to suit your needs.

    Overall, internet tutorials aren't truly a good way to learn anything of more than trivial difficulty; they just aren't the same.

  5. #20
    Pursuing knowledge confuted's Avatar
    Join Date
    Jun 2002
    Posts
    1,916
    Cat, you're wrong. It's possible to learn even advanced stuff online. There is a lot of interest in 3d graphics programming. There are tons of tutorials on just generally "why" we do different things in an engine, without any API specific code. And then there are tutorials which tell you how to write the code for the API. Then there's the official documentation, which is the source of the knowledge for any book authors. It's not like the book authors are making up the techniques - it's all documented in the SDK and such beforehand. It's just a matter of reading. A lot of people do better with a book, because all the information is presented to them right there and it's easy - I'll give you that. But I refuse to say that it's impossible to learn it without a book, because if it was, nobody would know it.
    Away.

  6. #21
    *******argv[] - hu? darksaidin's Avatar
    Join Date
    Jul 2003
    Posts
    314
    So we've come from "DirectX vs. OpenGL" to "Online Tutorials vs. Good Old Books". Are these both derived from the same baseclass?

    Code:
    class CVersus {
      public:
        void YouAreWrong(void) { return; }
        void IAmRight(void) { return; }
      private:
        string DoNotKnowWhatOtherTalksAbout(string Message) { return string("this is all wrong, I am right") }
    }
    Some might insist that YouAreWrong actually takes arguments or has a return value, but thats probably the same as in the "int main" case.

    edit: nothing against any of the posters who replied to this thread, but thats just how "x vs. y" normally develops.
    Last edited by darksaidin; 08-16-2003 at 08:14 AM.

  7. #22
    Registered User
    Join Date
    Aug 2003
    Posts
    56
    Uhhh, It still doesnt make my compiler work.

    Although, I can get the Dev C++ Compiler to put up a window for OpenGL. But, when I replace the code with the tutorials it doesnt work.

    You guys keep on "discussing" OGL and DX "differences" I'm going back to HelloWorld.cpp! LOL!

    Was I supposed to load makefile and layout as resource files?
    -something tells me "NO"

    And, I couldnt find out where to those -gl parameters.


    So... Lets switch this thread to ;

    Compilers :: Free vs Bought

    and its corollary "Which is your favorite?"

    Is there a compiler out there that will compile more than others?

    And, is there one that has backwards compatability towards older calls, functions, and what nots?

    I got an error on a tic tac toe game. When I compiled the source it gave back this;

    223 c:\Blah Blah\main.cpp
    name lookup of `u' changed for new ANSI `for' scoping
    218 c:\Blah Blah\main.cpp
    using obsolete binding at `u'


    For this code:
    Code:
    #include <windows.h>
    #include <stdio.h>
    
    LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
    int displayboard(HDC hdc);
    int displaypieces(HDC hdc, char board[9]);
    int displaymove(HDC hdc, int space);
    int detectwin(HWND hwnd, HDC hdc, char board[9]);
    
    const char szWinName[]="MyWin";	/* name of window class */
    const char pipe='|';
    const char dash='-';
    const char plus='+';
    
    int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
    {
    	HWND hwnd;
    	MSG msg;
    	WNDCLASSEX wcl;
    
    	/* Define a window class. */
    	wcl.cbSize= sizeof(WNDCLASSEX);
    
    	wcl.hInstance= hThisInst;		/* handle to this instance	*/
    	wcl.lpszClassName= szWinName;	/* window class name		*/
    	wcl.lpfnWndProc= WindowFunc;	/* window function			*/
    	wcl.style= 0;					/* default style			*/
    
    	wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);	/* standard icon	*/
    	wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO);		/* small icon		*/
    	wcl.hCursor = LoadCursor(NULL, IDC_ARROW);		/* cursor style		*/
    
    	wcl.lpszMenuName = NULL;	/* no menu						*/
    	wcl.cbClsExtra = 0;			/* no extra information needed	*/
    	wcl.cbWndExtra = 0;			/* no extra information needed	*/
    
    	wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 	/* Make the window background white	*/
    
    
    	/* Register the window class	*/
    	if(!RegisterClassEx(&wcl)) return 0;
    
    	/* Now that a window class has been registered, a window can be created */
    	hwnd = CreateWindow(
    		szWinName,				/* name of window class						*/
    		"Tic Tac Toe",			/* title									*/
    		WS_OVERLAPPEDWINDOW&~WS_SIZEBOX,	/* window style					*/
    		(GetSystemMetrics(SM_CXSCREEN)/2)-160,			/* X coordinate - default	*/
    		(GetSystemMetrics(SM_CYSCREEN)/2)-170,			/* Y coordinate - default	*/
    		320,					/* width									*/
    		340,					/* height									*/
    		HWND_DESKTOP,			/* no parent window							*/
    		NULL,					/* no menu									*/
    		hThisInst,				/* handle of this instance of the program	*/
    		NULL					/* no additional arguments					*/
    	);
    
    	/* Display the Window		*/
    	ShowWindow(hwnd, nWinMode);
    	UpdateWindow(hwnd);
    
    	/* Create the message loop.	*/
    	while(GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);	/* translate keyboard messages	*/
    		DispatchMessage(&msg);	/* return control to Windows	*/
    	}
    	return msg.wParam;
    }
    
    /*	This function is called by Windows and is passed
    	messages from the message queue.
    */
    
    LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HDC hdc;
    	PAINTSTRUCT paintstruct;
    	static char board[9]={' ',' ',' ',' ',' ',' ',' ',' ',' '};
    	static int space=4;
    	static char turn='X';
    
    	switch(message)	{
    		case WM_CHAR:
    			if ((char)wParam==13)
    			{
    				if (board[space]==' ')
    				{
    					board[space]=turn;
    					if (turn=='X')
    						turn='O';
    					else
    						turn='X';
    					InvalidateRect(hwnd,NULL,0);
    				}
    			}
    		case WM_KEYDOWN:			/* process keystroke			*/
    			switch((char)wParam){
    			case VK_UP:
    				
    				space-=3;
    				if (space<0)
    					space+=9;
    				InvalidateRect(hwnd,NULL,0);
    				break;
    			case VK_DOWN:
    				space+=3;
    				if (space>8)
    					space-=9;
    				InvalidateRect(hwnd,NULL,0);
    				break;
    			case VK_LEFT:
    				space-=1;
    				if (space<0)
    					space+=9;
    				InvalidateRect(hwnd,NULL,0);
    				break;
    			case VK_RIGHT:
    				space+=1;
    				if (space>8)
    					space-=9;
    				InvalidateRect(hwnd,NULL,0);
    				break;
    			}
    		case WM_PAINT:			/* process a repaint request	*/
    			hdc = BeginPaint(hwnd, &paintstruct);	/* get DC			*/
    			displayboard(hdc);
    			displaypieces(hdc,board);
    			displaymove(hdc,space);
    			switch(detectwin(hwnd,hdc,board))
    			{
    				case IDYES:
    				{
    					for(int t=0;t<9;t++)
    						board[t]=' ';
    					space=4;
    					turn='X';
    					InvalidateRect(hwnd,NULL,0);
    					break;
    				}
    				case IDNO:
    				{
    					PostQuitMessage(0);
    					break;
    				}
    			}			
    			EndPaint(hwnd, &paintstruct);			/* release DC		*/
    			break;
    		case WM_LBUTTONDOWN:
    			break;
    		case WM_DESTROY:	/* terminate the program		*/
    			PostQuitMessage(0);
    			break;
    		default:
    			return DefWindowProc(hwnd, message, wParam, lParam);
    	}
    	return 0;
    }
    
    int displayboard(HDC hdc)
    {
    	char str[255];
    	TextOut(hdc,100,10,"Tic Tac Toe",11);
    	TextOut(hdc,100,30,"Version 1.0",11);
    	TextOut(hdc,100,60,&pipe,1);
    	TextOut(hdc,200,60,&pipe,1);
    	TextOut(hdc,100,80,&pipe,1);
    	TextOut(hdc,200,80,&pipe,1);
    	TextOut(hdc,100,100,&pipe,1);
    	TextOut(hdc,200,100,&pipe,1);
    	sprintf(str,"------------------------------------------------------");
    	TextOut(hdc,20,120,str,strlen(str));
    	TextOut(hdc,100,140,&pipe,1);
    	TextOut(hdc,200,140,&pipe,1);
    	TextOut(hdc,100,160,&pipe,1);
    	TextOut(hdc,200,160,&pipe,1);
    	TextOut(hdc,100,180,&pipe,1);
    	TextOut(hdc,200,180,&pipe,1);
    	TextOut(hdc,20,200,str,strlen(str));
    	TextOut(hdc,100,220,&pipe,1);
    	TextOut(hdc,200,220,&pipe,1);
    	TextOut(hdc,100,240,&pipe,1);
    	TextOut(hdc,200,240,&pipe,1);
    	TextOut(hdc,100,260,&pipe,1);
    	TextOut(hdc,200,260,&pipe,1);
    	return 0;
    }
    
    int displaypieces(HDC hdc, char board[9])
    {
    	int t=0;
    	int x=0;
    	int y=0;
    	char str;
    
    	for(t=0;t<9;t++)
    	{
    		x=50+100*(t%3);
    		y=80+((int)(t/3))*80;
    		str=board[t];
    		TextOut(hdc,x,y,&str,1);
    		if (board[t]==' ')
    			for(int u=1;u<10;u++)
    				TextOut(hdc,x+u,y,&str,1);
    	}
    	return 0;
    }
    
    int displaymove(HDC hdc, int space)
    {
    	int x=0;
    	int y=0;
    	char str=' ';
    	for(int t=0;t<9;t++)\
    	{
    		x=100*(t%3);
    		y=80*((int)(t/3));
    	for(int u=10;u<99;u++)   //line 218
    		{
    			TextOut(hdc,x+u,y+60,&str,1);
    			TextOut(hdc,x+u,y+100,&str,1);
    		}
    		for(u=1;u<9;u++)  //line 223
    		{
    			TextOut(hdc,x+90+u,y+80,&str,1);
    			TextOut(hdc,x+10+u,y+80,&str,1);
    		}
    
    	}
    	str='*';
    	x=100*(space%3);
    	y=80*((int)(space/3));
    	for(int u=10;u<91;u+=10)
    	{
    		TextOut(hdc,x+u,y+60,&str,1);
    		TextOut(hdc,x+u,y+100,&str,1);
    	}
    	TextOut(hdc,x+90,y+80,&str,1);
    	TextOut(hdc,x+10,y+80,&str,1);
    
    	return 0;
    }
    
    int detectwin(HWND hwnd, HDC hdc, char board[9])
    {
    	char str[255];
    	/*horizontal ones*/
    	if (board[0]==board[1]&&board[1]==board[2]&&board[0]!=' ')
    	{
    		sprintf(str,"%c wins!",board[0]);
    		return MessageBox(hwnd,"Play again?",str,MB_YESNO|MB_ICONQUESTION);
    	}
    	if (board[3]==board[4]&&board[4]==board[5]&&board[3]!=' ')
    	{
    		sprintf(str,"%c wins!",board[3]);
    		return MessageBox(hwnd,"Play again?",str,MB_YESNO|MB_ICONQUESTION);
    	}
    	if (board[6]==board[7]&&board[7]==board[8]&&board[6]!=' ')
    	{
    		sprintf(str,"%c wins!",board[6]);
    		return MessageBox(hwnd,"Play again?",str,MB_YESNO|MB_ICONQUESTION);
    	}
    	/* vertical ones now*/
    	if (board[0]==board[3]&&board[3]==board[6]&&board[0]!=' ')
    	{
    		sprintf(str,"%c wins!",board[0]);
    		return MessageBox(hwnd,"Play again?",str,MB_YESNO|MB_ICONQUESTION);
    	}
    	if (board[1]==board[4]&&board[4]==board[7]&&board[1]!=' ')
    	{
    		sprintf(str,"%c wins!",board[1]);
    		return MessageBox(hwnd,"Play again?",str,MB_YESNO|MB_ICONQUESTION);
    	}
    	if (board[2]==board[5]&&board[5]==board[8]&&board[2]!=' ')
    	{
    		sprintf(str,"%c wins!",board[2]);
    		return MessageBox(hwnd,"Play again?",str,MB_YESNO|MB_ICONQUESTION);
    	}
    	/*diagonals*/
    	if (board[0]==board[4]&&board[4]==board[8]&&board[0]!=' ')
    	{
    		sprintf(str,"%c wins!",board[0]);
    		return MessageBox(hwnd,"Play again?",str,MB_YESNO|MB_ICONQUESTION);
    	}
    	if (board[2]==board[4]&&board[4]==board[6]&&board[2]!=' ')
    	{
    		sprintf(str,"%c wins!",board[2]);
    		return MessageBox(hwnd,"Play again?",str,MB_YESNO|MB_ICONQUESTION);
    	}
    	/* make sure board isn't full */
    	for(int t=0;t<9;t++)
    		if (board[t]==' ')
    			return 0;
    	return MessageBox(hwnd,"Play again?","Draw!",MB_YESNO|MB_ICONQUESTION); /*board is full*/
    }
    Last edited by Grumpy_Old_Man; 08-16-2003 at 09:03 AM.

  8. #23
    Pursuing knowledge confuted's Avatar
    Join Date
    Jun 2002
    Posts
    1,916
    Which compiler are you using?

    Code:
    int displaymove(HDC hdc, int space)
    {
    	int x=0;
    	int y=0;
    	char str=' ';
    	for(int t=0;t<9;t++)\
    	{
    		x=100*(t%3);
    		y=80*((int)(t/3));
    	        for(int u=10 ;u<99;u++)   //line 218
    		{
    			TextOut(hdc,x+u,y+60,&str,1);
    			TextOut(hdc,x+u,y+100,&str,1);
    		}
    		for(u=1;u<9;u++)  //line 223
    		{
    			TextOut(hdc,x+90+u,y+80,&str,1);
    			TextOut(hdc,x+10+u,y+80,&str,1);
    		}
    
    	}
    	str='*';
    	x=100*(space%3);
    	y=80*((int)(space/3));
    	for(int u=10 ;u<91;u+=10)
    	{
    		TextOut(hdc,x+u,y+60,&str,1);
    		TextOut(hdc,x+u,y+100,&str,1);
    	}
    	TextOut(hdc,x+90,y+80,&str,1);
    	TextOut(hdc,x+10,y+80,&str,1);
    
    	return 0;
    }
    Unless you're using MSVC, those both need to be
    Code:
    for(int u= /* ... */   )
    I also fixed your indentation for one line

    edit: and the reason that code will work with MSVC is because MSVC didn't comply with the standard correctly (It may have been fixed since version 6, I'm not sure)
    Away.

  9. #24
    Registered User
    Join Date
    May 2003
    Posts
    1,619
    Originally posted by confuted
    Cat, you're wrong. It's possible to learn even advanced stuff online. There is a lot of interest in 3d graphics programming. There are tons of tutorials on just generally "why" we do different things in an engine, without any API specific code. And then there are tutorials which tell you how to write the code for the API. Then there's the official documentation, which is the source of the knowledge for any book authors. It's not like the book authors are making up the techniques - it's all documented in the SDK and such beforehand. It's just a matter of reading. A lot of people do better with a book, because all the information is presented to them right there and it's easy - I'll give you that. But I refuse to say that it's impossible to learn it without a book, because if it was, nobody would know it.
    I never said you couldn't learn about products from their documentation -- of course you can. If you already understood the fundamentals and mathematics of 3D graphics, you could learn DirectX in its entirety based solely on the rather large set of information about it from Microsoft. And I've learned things in that fashion before, and a good engineer or programmer can gain a lot of insight from the docs.

    However, the simple fact of the matter is that learning in this way is hard, especially if you don't have the prerequisite knowledge about mathematics or 3D graphics in general. Even with that knowlege, effectively learning by reading the documentation is a skill not a lot of people have developed. So rather than recommend people try to reinvent the wheel, and muddle their way through the documentation themselves, I choose to recommend that people pick up a really good book on each topic. The authors have already invested a lot of time into exploring the API, they've read the documentation and written many programs, and now they're writing to share that knowledge in a way that is easier to digest than the official documentation. It's mostly the same information (although they often include more details about the historical development of the topic, the fundamentals, the context within which the API was created, etc.) but it's presented in a much more effective way.

    I also think you'd have to read a huge number of tutorials to reach the same knowledge level that you would have after reading one book, and it would be easier to digest the book. Also, this is coupled with the difficulty of finding good tutorials -- I'd say as musch as 50% of tutorials that I've seen on C++ programming are inaccurate or have glaring omissions on important points. Those that are technically correct often are contrived, poor from a stylistic point of view, and full of bad habits. And even the good ones often suffer from the poor teaching habits of the writers -- too many people think that simply vomiting information at someone and trusting that they absorb it is a valid teaching style; I think (as someone who is currently paying his way through grad school by teaching) it takes a lot more to effectively teach.

    Finding a tutorial that is factually correct, that teaches good style, that is well-written and meaningful, and that presents the information in a way that is easy to learn is a daunting task. I agree, there are many terrible books, but the difference is, you often need only one or two good books to learn a topic completely; to learn a topic completely with tutorials will take more than two good sets of tutorials, and finding enough good authors to cover an area is difficult. It's relatively easy to find a good book on any given area, and that's usually all you need.

  10. #25
    Registered User
    Join Date
    Aug 2003
    Posts
    56
    I am Using Bloodshed Dev-C++(version 4).

    And it gives me grief with almost all the tutorial code that I have found. MSVC isnt an option for me right now....

    Is there a compiler that will execute code even if it finds errors?

  11. #26
    Pursuing knowledge confuted's Avatar
    Join Date
    Jun 2002
    Posts
    1,916
    Yes, there is. There is Miracle C++, but it's not a Miracle, and you don't want a compiler that will make an .exe out of something which has errors. I think that a lot of tutorial code is written by people with MSVC (not all, of course), so you might want to get used to converting the little things. Did you try doing this, like I suggested?

    Code:
    for(int u=10 ;u<99;u++)   //line 218
    {
    	TextOut(hdc,x+u,y+60,&str,1);
    	TextOut(hdc,x+u,y+100,&str,1);
    }
    for(int u=1;u<9;u++)  //line 223
    {
    	TextOut(hdc,x+90+u,y+80,&str,1);
    	TextOut(hdc,x+10+u,y+80,&str,1);
    }
    Away.

  12. #27
    Registered User
    Join Date
    Aug 2003
    Posts
    56
    BTW CAT?

    Do you have any homework online?
    Perhaps you could throw in a link or two?

    The books I have are:

    Thinking in C++ by Bruce Eckel

    C++ by Sharam Hekmat

    The C++ Programming Language, Third Edition
    by Bjarne Stroustrup

    And a boatload of other lesser writings and tutorials.

    What is the collective thoughts and opinions about these 3 books?

    Which one will provide the most productive information
    -and-

    What does everyone else recommend for reading, tutorialling, and general information?

  13. #28
    Registered User
    Join Date
    Aug 2003
    Posts
    56
    LOL! The code now compiles with those changes, however [seems like there is always a 'however'] now when i go from the compiler to the linker I get this;

    c:\windows\TEMP\ccXNXegb.o(.text+0x94):main.cpp: undefined reference to `GetStockObject@4'
    c:\windows\TEMP\ccXNXegb.o(.text+0x4d4):main.cpp: undefined reference to `TextOutA@20'
    c:\windows\TEMP\ccXNXegb.o(.text+0x4ee):main.cpp: undefined reference to `TextOutA@20'
    c:\windows\TEMP\ccXNXegb.o(.text+0x508):main.cpp: undefined reference to `TextOutA@20'
    c:\windows\TEMP\ccXNXegb.o(.text+0x525):main.cpp: undefined reference to `TextOutA@20'
    c:\windows\TEMP\ccXNXegb.o(.text+0x53f):main.cpp: undefined reference to `TextOutA@20'
    c:\windows\TEMP\ccXNXegb.o(.text+0x55c):main.cpp: more undefined references to `TextOutA@20' follow

  14. #29
    Registered User
    Join Date
    Aug 2003
    Posts
    56
    Is there a way to go from exe --> cpp?

    Perhaps by 'decompiling' a working .exe supplied with the source code, I could see a difference that isnt getting translated.

  15. #30
    Pursuing knowledge confuted's Avatar
    Join Date
    Jun 2002
    Posts
    1,916
    change
    Code:
    #include <stdio.h>
    to this
    Code:
    #include <stdio>
    using namespace std;
    Away.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Going from DirectX to OpenGL
    By Wraithan in forum Game Programming
    Replies: 19
    Last Post: 02-24-2006, 11:07 AM
  2. Allegro, OpenGL.. or even DirectX?
    By Zeusbwr in forum C++ Programming
    Replies: 1
    Last Post: 11-14-2004, 08:16 AM
  3. Which is better: OpenGL or DirectX
    By Stan100 in forum Game Programming
    Replies: 2
    Last Post: 05-09-2003, 04:43 PM
  4. OpenGL 2 or DirectX ?
    By alex6852 in forum A Brief History of Cprogramming.com
    Replies: 9
    Last Post: 01-02-2003, 02:31 PM
  5. So.. what's the difference between DirectX and OpenGL?
    By QuestionC in forum Game Programming
    Replies: 6
    Last Post: 01-19-2002, 06:18 PM