Jump to content
  • Advertisement
Sign in to follow this  
Noobwaker

OpenGL glFrustum?

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

I tried to draw a white square in a window, but I must be doing something wrong, since it doesn't work. When I debug it, I get an access violation here:
void ResizeWind(void){
	glViewport(0, 0, (int)windW, (int)windH); //<-- I think it's here
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glFrustum(-windW/2., -windH/2., windW/2., windH/2., scrnDist, windD);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
I can't figure out what I'm doing wrong. The rest of the code.
#include "windows.h"
#include "gl\gl.h"
#include "math.h"
#include "time.h"
#include "string.h"

HGLRC           hRC=NULL;
HDC             hDC=NULL;
HWND            hWnd=NULL;
HINSTANCE       hInst;
short	FPSVal=1000/40,key[256];
double	scrnDist=20.,windH=240.,windW=320.,windD=100.;
long	timer1;
char	className[]="Thingy", windTitle[]="Thingy";


LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Stuff(void){

}

void GLDraw(void){
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor4d(1.,1.,1.,1.);
	glLoadIdentity();
	glBegin(GL_TRIANGLE_STRIP);
		glVertex3f(50.,50.,50.);
		glVertex3f(-50.,50.,50.);
		glVertex3f(50.,-50.,50.);
		glVertex3f(-50.,-50.,50.);
	glEnd();
	return;
}

void ResizeWind(void){
	glViewport(0, 0, (int)windW, (int)windH);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glFrustum(-windW/2., -windH/2., windW/2., windH/2., scrnDist, windD);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void GLSetup(void){
	//glEnable(GL_TEXTURE_2D);
	//glEnable(GL_CULL_FACE);
	//glClearDepth(1.);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glShadeModel(GL_FLAT);
	glClearColor(0.,0.,0.,0.);
	//glEnable(GL_ALPHA_TEST);
	//glAlphaFunc(GL_GEQUAL,.9);
	//glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
	//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
	ResizeWind();
}

void DestroyWind(void){
	wglMakeCurrent(NULL,NULL);
	wglDeleteContext(hRC);
	ReleaseDC(hWnd,hDC);
	DestroyWindow(hWnd);
	UnregisterClass(className,hInst);
}

short MakeWind(void){
	int			PixelFormat;
	WNDCLASS	wc;
	DWORD		dwExStyle, dwStyle;
	RECT 		WindRect;
	WindRect.left=(long)0;
	WindRect.right=(long)windW;
	WindRect.top=(long)0;
	WindRect.bottom=(long)windH;
	hInst = GetModuleHandle(NULL);
	wc.style = CS_OWNDC;
	wc.lpfnWndProc = (WNDPROC) WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;
	wc.hIcon = LoadIcon(NULL, NULL);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = NULL;
	wc.lpszMenuName = NULL;
	wc.lpszClassName = className;
	if (!RegisterClass(&wc)){
		MessageBox(NULL,"Unable to RegisterClass","Oh Noes!",MB_OK|MB_ICONEXCLAMATION);
		return 0;
	}
	dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
	dwStyle=WS_OVERLAPPEDWINDOW;
	AdjustWindowRectEx(&WindRect, dwStyle, FALSE, dwExStyle);
	if (!(hWnd=CreateWindowEx(dwExStyle,
					className,
					windTitle,
					WS_CLIPSIBLINGS |
					WS_CLIPCHILDREN |
					dwStyle,
					0, 0,
					WindRect.right-WindRect.left,
					WindRect.bottom-WindRect.top,
					NULL,
					NULL,
					hInst,
					NULL))){
		DestroyWind();
		MessageBox(NULL,"Unable to Make Window","...",MB_OK|MB_ICONEXCLAMATION);
		return 0;
	}
	static	PIXELFORMATDESCRIPTOR pfd={
		sizeof(PIXELFORMATDESCRIPTOR),
		1,
		PFD_DRAW_TO_WINDOW |
		PFD_SUPPORT_OPENGL |
		PFD_DOUBLEBUFFER,
		PFD_TYPE_RGBA,
		16,					//Color Depth
		0, 0, 0, 0, 0, 0,	//Color Bits
		0,					//Alpha Buffer
		0,					//Shift Bit
		0,					//Accumulation Buffer
		0, 0, 0, 0,			//Accumulation Bits
		16,					//Depth Buffer
		0,					//Stencil Buffer
		0,					//Auxiliary Buffer
		PFD_MAIN_PLANE,
		0,
		0, 0, 0				/*Layer Masks*/};
	hDC=GetDC(hWnd);
	if(!(PixelFormat=ChoosePixelFormat(hDC,&pfd))){
		DestroyWind();
		MessageBox(NULL,"Unable to Find a PixelFormat","Pixels are Good",MB_OK|MB_ICONEXCLAMATION);
		return 0;
	}
	if(!SetPixelFormat(hDC,PixelFormat,&pfd)){
		DestroyWind();
		MessageBox(NULL,"Unable to Set PixelFormat","Grr...",MB_OK|MB_ICONEXCLAMATION);
		return 0;
	}
	hRC=wglCreateContext(hDC);
	wglMakeCurrent(hDC,hRC);
	ShowWindow(hWnd,SW_SHOW);
	SetForegroundWindow(hWnd);
	SetFocus(hWnd);
	GLSetup();
	return 1;
}

int WINAPI WinMain(HINSTANCE hInst,	HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow){
	srand(time(NULL));
	rand();
	timer1=clock()-FPSVal/2;
	MSG	msg;
	short done=0;
	if (!MakeWind()){
		return 0;
	}
	while(!done){
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
			if (msg.message==WM_QUIT){
				done=1;
			}
			else{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}
		else{
			if (GetAsyncKeyState(27)!=0){//Esc
				done=1;
			}
			else{
				if((clock()-timer1)>FPSVal){
					timer1=timer1+FPSVal;
					Stuff();
					GLDraw();
					SwapBuffers(hDC);
				}
				sleep(1);
			}
		}
	}
	DestroyWind();
	return (msg.wParam);
}

LRESULT CALLBACK WndProc(HWND hWnd,	UINT uMsg, WPARAM wParam, LPARAM lParam){
	switch (uMsg)
	{
		case WM_CLOSE:
		{
			PostQuitMessage(0);
			return 0;
		}
		/*case WM_SIZE:
		{
			ResizeWind(LOWORD(lParam),HIWORD(lParam));
			return 0;
		}*/
	}
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

Share this post


Link to post
Share on other sites
Advertisement
I see two possible problems.
Quote:
glFrustum(-windW/2., -windH/2., windW/2., windH/2., scrnDist, windD);
It looks like you think the glFrustum parameters are (left, bottom, right, top, zNear, zFar) but they are actually (left, right, bottom, top, zNear, zFar).
Quote:
glVertex3f(50.,50.,50.);
glVertex3f(-50.,50.,50.);
glVertex3f(50.,-50.,50.);
glVertex3f(-50.,-50.,50.);
You are rendering the quad at Z = 50.0, but the default positive Z axis comes out of the screen so it's rendering behind the camera. I think what you want is to render it at Z = -50.0.

Share this post


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

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!