1

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();
}

結果はあまり良くありません:

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

立方体は、テクスチャが4つの正方形(2つの黒と2つの白)のすべての面を持っている必要があります。

エラーがどこにあるのかわかりません...

4

3 に答える 3

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

GL_ARB_texture_rectangle拡張機能の使用にはいくつかの制限があることに注意してください。

  1. ミップマップフィルタリングはサポートされていません。
  2. テクスチャの境界線はサポートされていません。
  3. GL_REPEATラップモードはサポートされていません。
  4. パレットテクスチャはサポートされていません。
  5. テクスチャフードは[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. 追加のテクスチャターゲットトークン、glEnable()、glTexImage * D()、glBindTexture()などのGL_TEXTURE_RECTANGLE_ARBは必要ありませんつまり、NPOTテクスチャには通常どおりGL_TEXTURE_2Dを使用できます。

于 2012-07-06T14:12:45.093 に答える
1

テクスチャ長方形を使用すると、テクスチャ座標は絶対ピクセル位置になります。あなたの場合、テクスチャ座標は0,0 2,02,20,2になります

于 2012-07-06T13:35:09.267 に答える
0

現在機能しています。次を参照してください。

GLubyte Texture[16] =
{
0,0xFF,0,0xFF, 0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF, 0,0,0,0
};
GLuint Nom;
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );   //Efface le framebuffer et le depthbuffer
glMatrixMode(GL_MODELVIEW);     //Un petit gluLookAt()...
glLoadIdentity();//load identity matrix
glTranslatef(0.0f,0.0f,-4.0f);//move forward 4 units
angle  = 0.1 * glutGet ( GLUT_ELAPSED_TIME );
glRotatef(angle,0,2,2);
glEnable(GL_TEXTURE_2D);
glEnable (GL_TEXTURE_RECTANGLE_ARB);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 2);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1,&Nom);  //Génère un n° de texture
glBindTexture(GL_TEXTURE_2D,Nom);   //Sélectionne ce n°
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 4, 4, 0, GL_RGB,GL_UNSIGNED_BYTE, Texture);
glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // GL_CLAMP_TO_EDGE
glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // GL_CLAMP_TO_EDGE
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, 2, 2, 0, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, Texture);
glBegin(GL_QUADS);
glTexCoord2i(0,0);glVertex3i(-1,-1,-1);
glTexCoord2i(2,0);glVertex3i(+1,-1,-1);
glTexCoord2i(2,2);glVertex3i(+1,+1,-1);
glTexCoord2i(0,2);glVertex3i(-1,+1,-1);
//1 face
glTexCoord2i(0,0);glVertex3i(-1,-1,+1);
glTexCoord2i(2,0);glVertex3i(+1,-1,+1);
glTexCoord2i(2,2);glVertex3i(+1,+1,+1);
glTexCoord2i(0,2);glVertex3i(-1,+1,+1);
//2 faces
glTexCoord2i(0,0);glVertex3i(+1,-1,-1);
glTexCoord2i(2,0);glVertex3i(+1,-1,+1);
glTexCoord2i(2,2);glVertex3i(+1,+1,+1);
glTexCoord2i(0,2);glVertex3i(+1,+1,-1);
//3 faces
glTexCoord2i(0,0);glVertex3i(-1,-1,-1);
glTexCoord2i(2,0);glVertex3i(-1,-1,+1);
glTexCoord2i(2,2);glVertex3i(-1,+1,+1);
glTexCoord2i(0,2);glVertex3i(-1,+1,-1);
glEnd();
glDisable(GL_TEXTURE_2D);
于 2012-08-04T23:12:04.023 に答える