我正在使用opengl和纹理映射。 问题是,当应用的纹理是512×32像素,每个东西都工作正常,但是当它是128×128时,纹理不能正确应用。Opengl纹理映射和图像资源
纹理不能正确重复,它应用到对象的开始处,而其余的部分没有任何纹理。
在代码:长度参数是约100。
LoadTexture:一个功能读取.bmp文件并返回质地指数。
这是我正在使用的代码。
int LoadTexture(char *filename,int alpha)
{
using namespace std;
int i, j=0; //Index variables
static int num_texture;
ifstream l_file(filename);
unsigned char *l_texture; //The pointer to the memory zone in which we will load the texture
// windows.h gives us these types to work with the Bitmap files
BITMAPFILEHEADER fileheader;
BITMAPINFOHEADER infoheader;
RGBTRIPLE rgb;
num_texture++; // The counter of the current texture is increased
if(!l_file) return (-1); // Open the file for reading
l_file.read(reinterpret_cast<char *>(&fileheader), sizeof(fileheader)); // Read the fileheader
//fseek(l_file, sizeof(fileheader), SEEK_SET); // Jump the fileheader
l_file.read(reinterpret_cast<char *>(&infoheader), sizeof(infoheader)); // and read the infoheader
// Now we need to allocate the memory for our image (width * height * color deep)
l_texture = new byte [infoheader.biWidth * infoheader.biHeight * 4];
// And fill it with zeros
memset(l_texture, 0, infoheader.biWidth * infoheader.biHeight * 4);
// At this point we can read every pixel of the image
for (i=0; i < infoheader.biWidth*infoheader.biHeight; i++)
{
// We load an RGB value from the file
l_file.read(reinterpret_cast<char *>(&rgb), sizeof(rgb));
// And store it
l_texture[j+0] = rgb.rgbtRed; // Red component
l_texture[j+1] = rgb.rgbtGreen; // Green component
l_texture[j+2] = rgb.rgbtBlue; // Blue component
l_texture[j+3] = alpha; // Alpha value
j += 4; // Go to the next position
}
l_file.close(); // Closes the file stream
glBindTexture(GL_TEXTURE_2D, num_texture); // Bind the ID texture specified by the 2nd parameter
// The next commands sets the texture parameters
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // If the u,v coordinates overflow the range 0,1 the image is repeated
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // The magnification function ("linear" produces better results)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); //The minifying function
// Finally we define the 2d texture
glTexImage2D(GL_TEXTURE_2D, 0, 4, infoheader.biWidth, infoheader.biHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);
// And create 2d mipmaps for the minifying function
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, infoheader.biWidth, infoheader.biHeight, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);
delete [] l_texture; // Free the memory we used to load the texture
return num_texture; // Returns the current texture OpenGL ID
}
和这里就是我怎么做的贴图坐标
void drawStreetStraight(Vector2d & point1,Vector2d & point2,Vector2d & point3,Vector2d & point4,double length)
{
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECR);
glBindTexture(GL_TEXTURE_2D,streetTexture);
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3d(point1.x,0,point1.y);
glTexCoord2f(1,0);
glVertex3d(point2.x,0,point2.y);
glTexCoord2f(1,length/2.0);
glVertex3d(point3.x,0,point3.y);
glTexCoord2f(0,length/2.0);
glVertex3d(point4.x,0,point4.y);
glEnd();
glDisable(GL_TEXTURE_2D);
}
纹理的范围是从0到1不能/ 2长度添加到它。为什么你在glVertex3d中给出z的y坐标值? – 2011-05-23 10:24:07
第一个问题:增加长度/ 2重复即:我想重复纹理,所以我这样做(长度/ 2)。超过1你得到重复效果或钳位(根据你的代码)。 第二个问题:我的对象(道路)铺设在XZ坐标上,Y = 0,它配置了2个坐标点(x,y)。 – 2011-05-23 10:33:40
为什么在glTexEnvf调用中有GL_DECR? – bombardier 2011-05-23 12:40:39