经过两天的阅读和尝试,我能够使用GL_TEXTURE_CUBE_MAP对立方体进行纹理化:
Textured Cube
然后我决定用立方体做一个平行六面体,其中相应的纹理在长边上重复。我得到了类似或更糟的结果:
Poorly stretched texture
而我想得到这样一个结果:
Repeated texture
这可能吗?
下面是代码的基本部分:
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 );
}
1条答案
按热度按时间wnavrhmk1#
重复过滤是一种纹理采样包裹模式。包裹模式解释了纹理空间之外的纹理坐标是如何工作的。
但是立方体贴图纹理坐标的定义方式(它们是从立方体中心指向立方体内部某个位置的向量),它们基本上不会超出立方体贴图的面大小。因此重复过滤是一个无操作,功能上与箝位到边缘相同。