GL_TEXTURE_RECTANGLE_ARB

Căt*_*ilă 1 opengl textures

我尝试使用GL_TEXTURE_RECTANGLE_ARB使用数据原始纹理:

void Display::tex(){

GLubyte Texture[16] =
{    
0,0,0,0, 0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF, 0,0,0,0
};
GLuint Nom;
glLoadIdentity();//load identity matrix
glTranslatef(0.0f,0.0f,-4.0f);//move forward 4 units

glEnable(GL_DEPTH_TEST);    //Active le depth test
glDisable( GL_CULL_FACE );

glEnable (GL_TEXTURE_RECTANGLE_ARB);

glPixelStorei(GL_UNPACK_ROW_LENGTH, 2);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glGenTextures(1, &Nom);

glBindTexture(GL_TEXTURE_RECTANGLE_ARB, Nom);

glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,

                GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, 2, 2,

                0, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, Texture);
angle  = 0.01 * glutGet ( GLUT_ELAPSED_TIME );
glRotatef(angle,0,1,1);

glBegin(GL_QUADS);  //Et c'est parti pour le cube !

glTexCoord2i(0,0);glVertex3i(-1,-1,-1);
glTexCoord2i(1,0);glVertex3i(+1,-1,-1);
glTexCoord2i(1,1);glVertex3i(+1,+1,-1);
glTexCoord2i(0,1);glVertex3i(-1,+1,-1);

//1 face

glTexCoord2i(0,0);glVertex3i(-1,-1,+1);
glTexCoord2i(1,0);glVertex3i(+1,-1,+1);
glTexCoord2i(1,1);glVertex3i(+1,+1,+1);
glTexCoord2i(0,1);glVertex3i(-1,+1,+1);

//2 faces

glTexCoord2i(0,0);glVertex3i(+1,-1,-1);
glTexCoord2i(1,0);glVertex3i(+1,-1,+1);
glTexCoord2i(1,1);glVertex3i(+1,+1,+1);
glTexCoord2i(0,1);glVertex3i(+1,+1,-1);

//3 faces

glTexCoord2i(0,0);glVertex3i(-1,-1,-1);
glTexCoord2i(1,0);glVertex3i(-1,-1,+1);
glTexCoord2i(1,1);glVertex3i(-1,+1,+1);
glTexCoord2i(0,1);glVertex3i(-1,+1,-1);

//4 faces

glTexCoord2i(1,0);glVertex3i(-1,+1,-1);
glTexCoord2i(1,1);glVertex3i(+1,+1,-1);
glTexCoord2i(0,1);glVertex3i(+1,+1,+1);
glTexCoord2i(0,0);glVertex3i(-1,+1,+1);

//5 faces

glTexCoord2i(1,0);glVertex3i(-1,-1,+1);
glTexCoord2i(1,1);glVertex3i(+1,-1,+1);
glTexCoord2i(0,1);glVertex3i(+1,-1,-1);
glTexCoord2i(0,0);glVertex3i(-1,-1,-1);

//6 faces
glEnd();

glFlush();
}
Run Code Online (Sandbox Code Playgroud)

结果不是很好:

http://shareimage.ro/images/xdkyd12oty44c0qpuo1b.png

立方体应该具有纹理4平方(2黑色和2白色)的所有面.

我不知道错误在哪里...

son*_*ong 5

GL_ARB_texture_rectangle扩展使用依赖于维度的纹理坐标.使用[0..W]x[0..H]纹理坐标范围,而不是标准化坐标范围[0..1] x [0..1].

例如,在四边形上绘制完整图像;

glTexCoord2f(0, 0);                     glVertex3f(...); // top-left
glTexCoord2f(0, imageHeight);           glVertex3f(...); // bottom-left
glTexCoord2f(imageWidth, imageHeight);  glVertex3f(...); // bottom-right
glTexCoord2f(imageWidth, 0);            glVertex3f(...); // top-right
Run Code Online (Sandbox Code Playgroud)

请注意,使用GL_ARB_texture_rectangle扩展有一些限制.

  1. 不支持Mipmap过滤.
  2. 纹理边框不受支持.
  3. 不支持GL_REPEAT包装模式.
  4. 不支持调色板纹理.
  5. 纹理coods由[0..w] x [0..h]寻址.

幸运的是,OpenGL还提供了GL_ARB_texture_non_power_of_two扩展来解决上述限制,同时它仍然支持NPOT(Non Power Of Two)纹理.

GL_ARB_texture_non_power_of_two的最大优点是;

  1. GL_ARB_texture_non_power_of_two使用传统的归一化纹理坐标,[0..1] x [0..1].

  2. 它不需要额外的纹理目标标记,GLITEXTURE_RECTANGLE_ARB用于glEnable(),glTexImage*D(),glBindTexture()等等.也就是说,您仍然可以像往常一样使用GLOTEXTURE_2D进行NPOT纹理.