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函数即可,其余的不用改变。