opengl学习及问题总结

http://www.yakergong.net/nehe/   nehe中文地址。

http://yarin.blog.51cto.com/1130898/381843 nehe中文翻译的凹凸映射的一片文章。

glLoadIdentity()函数的作用是是视点恢复到画面的中心位置,但是我在使用的时候有时会造成没有办法显示图像。正在思考这个问题。

glTranslatef(x,y,z) 的作用是使视角的原点定位到x,y,z位置上。

glColor3f() 的有效期是再次调用这个函数之前。

1.在看opengl超级宝典的时候入门的初学者总是很疑惑为什么总是出现1>LINK : fatal error LNK1104: 无法打开文件“freeglut_static.lib”这个错误:解决的办法就是去掉gltools.h中的

#define FREEGLUT_STATIC

这个宏定义,改为使用共享库。

2. 无法定位glewInit于glew32.dll。

这是由于glew.lib与glew.dll的版本不同造成的。解决方法就是使版本统一。可能会出现版本统一了,但问题依然出现。我就遇到了这个问题,最后查出问题出现在我在system目录下也放置了一个glew32.dll,windows在加载dll文件的时候不是首先寻找同目录下,而是system下搜寻,没有相应的dll文件再在同目录下搜寻dll文件。解决方法,自然是把system目录下的dll文件删掉。

4.如何使用多贴图。

#include<glew.h>
#include <GL/wglew.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
//虽然下面的代码很简单,写的很烂,但是是我看opengl多日的成果,我很有成就感,对我的项目很有帮助。
/*	Create checkerboard texture	*/
#define	checkImageWidth 64
#define	checkImageHeight 64
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
#include<opencv\cv.h>
#include<opencv\highgui.h>

#ifdef GL_VERSION_1_1
static GLuint texName;
#endif

//void makeCheckImage(void)
//{
//   int i, j, c;
//    
//   for (i = 0; i < checkImageHeight; i++) {
//      for (j = 0; j < checkImageWidth; j++) {
//         c = ((((i&0x8)==0)^((j&0x8))==0))*255;
//         checkImage[i][j][0] = (GLubyte) c;
//         checkImage[i][j][1] = (GLubyte) c;
//         checkImage[i][j][2] = (GLubyte) c;
//         checkImage[i][j][3] = (GLubyte) 255;
//      }
//   }
//}
//
//void init(void)
//{    
//   glClearColor (0.0, 0.0, 0.0, 0.0);
//   glShadeModel(GL_FLAT);
//   glEnable(GL_DEPTH_TEST);
//
//   makeCheckImage();
//   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
//
//#ifdef GL_VERSION_1_1
//   glGenTextures(1, &texName);
//   glBindTexture(GL_TEXTURE_2D, texName);
//#endif
//
//   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
//   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
//   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
//   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
//#ifdef GL_VERSION_1_1
//   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight, 
//                0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
//#else
//   glTexImage2D(GL_TEXTURE_2D, 0, 4, checkImageWidth, checkImageHeight, 
//                0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
//#endif
//}
IplImage *forwardImg =NULL;
IplImage *backgroundImg = NULL;
GLuint forwardTex;
GLuint backgroundTex ;
void makeCheckImages(void)
{
	forwardImg = cvLoadImage("hello.png",-1);
	if(forwardImg == NULL)
		exit(-1);
	backgroundImg = cvLoadImage("background.jpg");
	if(backgroundImg == NULL)
		exit(-2);
	
	glGenTextures(1,&forwardTex);
	glBindTexture(GL_TEXTURE_2D,forwardTex);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,forwardImg->width,forwardImg->height,0,GL_RGBA,
		GL_UNSIGNED_BYTE,forwardImg->imageData);
	//backgroud;
	glGenTextures(1,&backgroundTex);
	glBindTexture(GL_TEXTURE_2D, backgroundTex);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
	glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,backgroundImg->width,backgroundImg->height,0,
		GL_RGB,GL_UNSIGNED_BYTE,backgroundImg->imageData
		);

}
int maxTextureNum= 0;
void init(void)
{    
    glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB,&maxTextureNum);
    glMultiTexCoord1fARB	= (PFNGLMULTITEXCOORD1FARBPROC)		wglGetProcAddress("glMultiTexCoord1fARB");
	glMultiTexCoord2fARB	= (PFNGLMULTITEXCOORD2FARBPROC)		wglGetProcAddress("glMultiTexCoord2fARB");
	glMultiTexCoord3fARB	= (PFNGLMULTITEXCOORD3FARBPROC)		wglGetProcAddress("glMultiTexCoord3fARB");
	glMultiTexCoord4fARB	= (PFNGLMULTITEXCOORD4FARBPROC)		wglGetProcAddress("glMultiTexCoord4fARB");
	glActiveTextureARB		= (PFNGLACTIVETEXTUREARBPROC)		wglGetProcAddress("glActiveTextureARB");
	glClientActiveTextureARB= (PFNGLCLIENTACTIVETEXTUREARBPROC)	wglGetProcAddress("glClientActiveTextureARB");		
	makeCheckImages();	
	
	glEnable(GL_TEXTURE_2D);							// Enable Texture Mapping
	glShadeModel(GL_SMOOTH);							// Enable Smooth Shading
	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);				// Black Background
	glClearDepth(1.0f);									// Depth Buffer Setup
	glEnable(GL_DEPTH_TEST);							// Enables Depth Testing
	glDepthFunc(GL_LEQUAL);								// The Type Of Depth Testing To Do
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculations


}
void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   //glActiveTextureARB(GL_TEXTURE0_ARB);
   glEnable(GL_TEXTURE_2D);
   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);//这句话起到了至关重要的作用。不注释这句话见图1.,注释掉这句话见图2.
	glBindTexture(GL_TEXTURE_2D, backgroundTex);
	//glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
	//glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_REPLACE);	

   glBegin(GL_QUADS);
   glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
   glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
   glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
   glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);

   glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
   glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
   glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);
   glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
   glEnd();
   
   glDepthFunc(GL_ALWAYS);		
	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
	glEnable(GL_BLEND);
	glDisable(GL_LIGHTING);
	glLoadIdentity();	

	glBindTexture(GL_TEXTURE_2D,forwardTex);

	glBegin(GL_QUADS);
		glTexCoord2f(0.0f,0.0f);	glVertex3f(0.23f, -0.0f,-1.0f);
		glTexCoord2f(1.0f,0.0f);	glVertex3f(0.53f, -0.4f,-1.0f);
		glTexCoord2f(1.0f,1.0f);	glVertex3f(0.53f, -0.25f,-1.0f);
		glTexCoord2f(0.0f,1.0f);	glVertex3f(0.23f, -0.25f,-1.0f);
	glEnd();		

   glFlush();
   glDepthFunc(GL_LEQUAL);
   glDisable(GL_TEXTURE_2D);
}

void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glTranslatef(0.0, 0.0, -3.6);
}

void keyboard (unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         break;
      default:
         break;
   }
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
   	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
   	glutInitWindowSize(250, 250);
   	glutInitWindowPosition(100, 100);
   	glutCreateWindow(argv[0]);

	GLenum err = glewInit();
       if(err != GLEW_OK)
       {
              exit(-2);
       }
   init();
  
   glutReshapeFunc(reshape);
   glutDisplayFunc(display);
   glutKeyboardFunc (keyboard);
   glutMainLoop();
   return 0; 
}

图1:                                                                                                                                         图2.

                                                                

由上图可以看出应该注释掉上面的代码上的那句话。


5.opengl的屏幕出现黑屏的解决方法:

(1)检查在glBegin()函数和glEnd()函数中间是不是写了在opengl红宝书p30页中列举函数的另外的其他函数。

(2)规定的坐标太大,被opengl窗口截掉了。主要是对glTranslatef(),glRotatef(),gulLookAt()函数不理解造成。


6.opengl的多线程是一个比较复杂的活,与普通的程序调用多线程相比要复杂,尤其在使用贴图功能时候,在调用glGenTextures()函数的时候总是返回一个0值。解决方法:

http://www.cnblogs.com/mazhenyu/archive/2010/04/29/1724190.html



如何消除难看的dos窗口?

很简单,不用很复杂的技术。只要把win32程序的入口函数Winmain函数变为main函数即可,其余的不用改变。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值