您的位置:首页 > 运维架构

opengl学习及问题总结

2013-07-17 18:15 447 查看
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函数即可,其余的不用改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: