簡體   English   中英

我無法使用 GL_TEXTURE_CUBE_MAP 和 GL_REPEAT 重復紋理

[英]I can't repeat the texture using GL_TEXTURE_CUBE_MAP and GL_REPEAT

經過兩天的閱讀和嘗試,我能夠使用 GL_TEXTURE_CUBE_MAP 對立方體進行紋理處理:

紋理立方體

然后我決定用立方體制作一個平行六面體,其中相應的紋理在長邊重復。 我得到類似或更糟的結果:

拉伸不良的質地

我想得到這樣的結果:

重復紋理

有可能嗎?

這是代碼的重要部分:

void Create( void ) {
    glGenTextures( 1, &id );
    glBindTexture( GL_TEXTURE_CUBE_MAP, id );
    glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );

    const RGB bk_cols[ ] = { {207,193,0}, {133,96,169}, {0,166,81}, {0,84,166}, {158,11,15}, {137,137,137} };
    const char letters[ ] = { 'x', 'y', 'z' };
    RGB* rgb = new RGB[ 16 * 16 + 16 ];
    for( unsigned int i = 0; i < 6; i++ ) {
        glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE,
            CreateLetter16x16( rgb, {0,250,0}, bk_cols[i], {0,0,0}, letters[ i >> 1 ], (i & 1 ? false : true) ) );
    }
    delete [ ] rgb;

    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT/*GL_CLAMP_TO_EDGE*/ );
    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT/*GL_CLAMP_TO_EDGE*/ );
    glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE );
}

void DrawTexturedCube( void ) {
    float v = 2.0;
    float p = 6.0;
    // All the faces that are not front-faces are discarded.
    // This is a good test of vertex sequence.
    glEnable( GL_CULL_FACE );
    // Of course a depth test is needed here.
    glEnable( GL_DEPTH_TEST );

    // Must be enabled, else textures doesn't work
    glEnable( GL_TEXTURE_CUBE_MAP );
    // If you want your image to be unaffected by the current color,
    // you must change the texture environment parameter to decal
    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );

    // Select texture
    glBindTexture( GL_TEXTURE_CUBE_MAP, sq_txt.id );

    glBegin( GL_QUADS );
    // Right
    glTexCoord3f( 1,-1,-1); glVertex3f( p,-v,-v);
    glTexCoord3f( 1, 1,-1); glVertex3f( p, v,-v);
    glTexCoord3f( 1, 1, 1); glVertex3f( p, v, v);
    glTexCoord3f( 1,-1, 1); glVertex3f( p,-v, v);
    // Left
    glTexCoord3f(-1,-1,-1); glVertex3f(-p,-v,-v);
    glTexCoord3f(-1,-1, 1); glVertex3f(-p,-v, v);
    glTexCoord3f(-1, 1, 1); glVertex3f(-p, v, v);
    glTexCoord3f(-1, 1,-1); glVertex3f(-p, v,-v);
    // Top
    glTexCoord3f(-1, 1, 1); glVertex3f(-p, v, v);
    glTexCoord3f( 1, 1, 1); glVertex3f( p, v, v);
    glTexCoord3f( 1, 1,-1); glVertex3f( p, v,-v);
    glTexCoord3f(-1, 1,-1); glVertex3f(-p, v,-v);
    // Bottom
    glTexCoord3f(-1,-1,-1); glVertex3f(-p,-v,-v);
    glTexCoord3f( 1,-1,-1); glVertex3f( p,-v,-v);
    glTexCoord3f( 1,-1, 1); glVertex3f( p,-v, v);
    glTexCoord3f(-1,-1, 1); glVertex3f(-p,-v, v);
    // Front
    float xn = -3.0;
    float xp =  3.0;
    float yn = -1.0;
    float yp =  1.0;
    float zz =  1.0;
    glTexCoord3f(xn,yn,zz); glVertex3f(-p,-v, v);
    glTexCoord3f(xp,yn,zz); glVertex3f( p,-v, v);
    glTexCoord3f(xp,yp,zz); glVertex3f( p, v, v);
    glTexCoord3f(xn,yp,zz); glVertex3f(-p, v, v);
    // Back
    glTexCoord3f( 1,-1,-1); glVertex3f( p,-v,-v);
    glTexCoord3f(-1,-1,-1); glVertex3f(-p,-v,-v);
    glTexCoord3f(-1, 1,-1); glVertex3f(-p, v,-v);
    glTexCoord3f( 1, 1,-1); glVertex3f( p, v,-v);

    glEnd();

    // Restore default parameters
    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
    // Must be disabled, else colors doesn't work ( Everything will be textured ).
    glDisable( GL_TEXTURE_CUBE_MAP );


    // --------------------------------------------------------------------

    float k = v+.01f;
    // Disable fill
    glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
    // Set line width
    glLineWidth( 3 );
    glBegin( GL_QUADS );
    glColor3f( .9f, 0, 0 );
    glVertex3f( k,-k,-k); glVertex3f( k, k,-k); glVertex3f( k, k, k); glVertex3f( k,-k, k); // Right
    glVertex3f(-k,-k,-k); glVertex3f(-k,-k, k); glVertex3f(-k, k, k); glVertex3f(-k, k,-k); // Left
    glVertex3f(-k, k, k); glVertex3f( k, k, k); glVertex3f( k, k,-k); glVertex3f(-k, k,-k); // Top
    glVertex3f(-k,-k,-k); glVertex3f( k,-k,-k); glVertex3f( k,-k, k); glVertex3f(-k,-k, k); // Bottom
    glVertex3f(-k,-k, k); glVertex3f( k,-k, k); glVertex3f( k, k, k); glVertex3f(-k, k, k); // Front
    glVertex3f( k,-k,-k); glVertex3f(-k,-k,-k); glVertex3f(-k, k,-k); glVertex3f( k, k,-k); // Back
    glEnd();
    // Restore fill
    glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
    // Restore default line width
    glLineWidth( 1 );

    // Restore default state
    glDisable( GL_DEPTH_TEST );

    // Restore default state
    glDisable( GL_CULL_FACE );
}

重復過濾是一種紋理采樣環繞模式。 環繞模式解釋了紋理空間之外的紋理坐標如何工作。

但是立方體貼圖紋理坐標的定義方式(它們是從立方體中心指向該立方體內部某個位置的向量),它們基本上不會超出立方體貼圖面的大小。 因此,重復過濾是一種空操作,在功能上與鉗位到邊緣相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM