现在的位置: 首页 > 综合 > 正文

关于纹理的一些认识

2013年11月08日 ⁄ 综合 ⁄ 共 1825字 ⁄ 字号 评论关闭

这两天简单的用了一下纹理,把我遇到的一些问题记下。

 

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(...)里面已经含有纹理坐标的指定了,估计该函数里面是画一堆的三角形,指定每      个点空间坐标前制订了该点的纹理坐标。

抱歉!评论已关闭.