这两天简单的用了一下纹理,把我遇到的一些问题记下。
1. glTexImage2D 的第三个参数 internal_format不能是 GL_BGR?
查了一下,好像是不行。
http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml
2. 纹理的属性设置必须在glutCreateWindow也就是创建窗口之后?
我用OpenGL生成纹理,生成纹理并设置属性
glGenTextures(1, &TextureID);
glBindTexture(GL_TEXTURE_2D, TextureID);
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
这些动作放在glutCreateWindow之前调用的话,纹理没有贴上去。放到之后调用则成功。估计在glutCreateWindow之中有某些关于设 置纹理相关的动作或者跟分配显存相关的动作?
3. 纹理坐标的起点在左下角还是左上角?
这个我觉得无所谓,主要看你怎么获取纹理点的实际像素位置。比如说一个点的纹理坐标起点在左下角(u,v),而图片的存储是原点在左上角 (长宽分别为width, height),那么所求纹理的像素坐标为 (u*width, (1-v)*height)。否则为(u*width, v*height)。同理纹理坐标起点在左 下角的情况。所以在需要自己生成纹理像素位置的时候,如果感觉不对劲,那么上面两种方法都试一下看看。
在下面的网址和大多数地方说大多数说纹理坐标的原点在左上角
http://blogs.inetium.com/blogs/mhodnick/archive/2006/04/13/65.aspx
http://nexe.gamedev.net/directKnowledge/default.asp?p=texture%20coordinates
而在
http://www.gamedev.net/reference/articles/article947.asp上看到OpenGL中一般假定
纹理坐标是下面这样的?
0,1--1,1
| |
0,0--1,0
即左下角。
OpenGL中的实际纹理像素位置不是我们自己生成的,估计就是按照(u*width, v*height),所以,我们必须按照所使用的纹理坐标的起点 来生成纹理图像,使得纹理图像的起点跟纹理坐标的起点同在左下角或同在左上角。即,如果我们在程序中使用如上面的左下角原点,那么 我们导入的图片存储的原点也必须在左下角。而如果我们用的纹理坐标是左上角是起点,那么纹理图像起点应该也在左上角。
4. 没有指定纹理坐标却贴上纹理了?
glut带的几个画图函数画出来的图形都是带纹理坐标的。如glutSolidTeapot(...),如果你已经启用纹理了并绑定了,那么你再调用 glutSolidTeapot(...)的话,画出来的茶壶会贴有纹理,令我很意外(我本来不想把纹理也贴到这里的)。所以如果你不希望这样的话,在 glutSolidTeapot(...)之后再启用纹理吧。glutSolidTeapot(...)里面已经含有纹理坐标的指定了,估计该函数里面是画一堆的三角形,指定每 个点空间坐标前制订了该点的纹理坐标。