我一直在寻找一个简单的解决方案,以添加精灵到我的OpenGl GLUT简单的月球着陆器游戏在c++和它似乎我必须使用bmp的,因为他们最容易加载和使用他们作为纹理的矩形。我究竟如何加载BMP的纹理呢?
3lxsmp7m1#
看我的简单c实现函数加载纹理。
GLuint LoadTexture( const char * filename ) { GLuint texture; int width, height; unsigned char * data; FILE * file; file = fopen( filename, "rb" ); if ( file == NULL ) return 0; width = 1024; height = 512; data = (unsigned char *)malloc( width * height * 3 ); //int size = fseek(file,); fread( data, width * height * 3, 1, file ); fclose( file ); for(int i = 0; i < width * height ; ++i) { int index = i*3; unsigned char B,R; B = data[index]; R = data[index+2]; data[index] = R; data[index+2] = B; } glGenTextures( 1, &texture ); glBindTexture( GL_TEXTURE_2D, texture ); glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT ); gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,GL_RGB, GL_UNSIGNED_BYTE, data ); free( data ); return texture; }
函数返回纹理数据。将纹理数据存储在变量
GLuint texture; texture= LoadTexture( "your_image_name.bmp" );
现在可以使用glBindTexture绑定纹理
glBindTexture (GL_TEXTURE_2D, texture);
ax6ht2ek2#
从OpenGL_3_2_Utils中检查我的纹理加载器(纹理加载器. h+纹理加载器. cpp):https://github.com/mortennobel/OpenGL_3_2_Utils这两个文件不依赖于任何其他文件,并且可以在任何版本的OpenGL(和任何平台)上无缝运行。示例用法可以在文件注解中找到。
2eafrhcq3#
可以使用GLAUX和SOIL(Simple OpenGL Image Library)库,也可以使用other image libriries for OpenGL库。
ffscu2ro4#
如何在GLUT上加载一个bmp作为纹理使用?另一个非常简单的解决方案是使用STB library,它可以在GitHub - nothings/stb中找到。只需要一个源文件,头文件"stb_image. h",不需要链接任何库文件或编译任何其他源文件。包括头文件,并通过设置预处理器定义STB_IMAGE IMPLEMENTATION启用图像读取:
STB_IMAGE IMPLEMENTATION
#define STB_IMAGE_IMPLEMENTATION #include <stb_image.h>
图像文件可以通过函数stbi_load读取:
stbi_load
const char *filename = .....; // path and filename int req_channels = 3; // 3 color channels of BMP-file int width = 0, height = 0, channels = 0; stbi_uc *image = stbi_load( filename, &width, &height, &channels, 3 );
将图像加载到纹理对象时,必须将GL_UNPACK_ALIGNMENT设置为1。默认情况下GL_UNPACK_ALIGNMENT为4,因此图像的每一行被假定为4字节对齐。BMP文件的像素通常为3字节,并且被紧密压缩,这将导致未对齐。加载映像后,可通过stbi_image_free释放内存:
GL_UNPACK_ALIGNMENT
stbi_image_free
GLuint texture_obj = 0; if ( image != nullptr ) { glGenTextures(1, &texture_obj); glBindTexture(GL_TEXTURE_2D, texture_obj); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // default stbi_image_free( image ); }
ogsagwnx5#
GLuint LoadTexture(GLuint tex, const char * filename, int width, int height) { //bmp 24 bit unsigned char * data; unsigned char R,G,B; FILE * file; //open .bmp file = fopen(filename, "rb"); if(file == NULL)return 0; //get memory for data data =(unsigned char *)malloc(width * height * 3); //data skip offset fseek(file,128,0); //read file to data fread(data, width * height * 3, 1, file); //close file fclose(file); //transpose R,G,B values int index; for(int i = 0; i < width * height ; ++i) { index = i*3; B = data[index]; G = data[index+1]; R = data[index+2]; data[index] = R; data[index+1] = G; data[index+2] = B; } //create a texture glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height,GL_RGB, GL_UNSIGNED_BYTE, data); //texture filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //free memory free(data); return 0; } void init(void) { //texture loading, bmp 24 bit LoadTexture(1, "01.bmp", 316, 316); LoadTexture(2, "02.bmp", 316, 316); LoadTexture(3, "05.bmp", 316, 316); LoadTexture(4, "03.bmp", 316, 316); LoadTexture(5, "06.bmp", 316, 316); LoadTexture(6, "04.bmp", 316, 316); . . . . . . . . . . . .
Linux操作系统gcc立方体. c-o立方体-lglut -lGL -lGLUwindowstcc cube.c -o cube.exe -LC:\tcc\库-日志文件132-lglu 32-lglu 32-Wl,-子系统=窗口
5条答案
按热度按时间3lxsmp7m1#
看我的简单c实现函数加载纹理。
函数返回纹理数据。将纹理数据存储在变量
现在可以使用glBindTexture绑定纹理
ax6ht2ek2#
从OpenGL_3_2_Utils中检查我的纹理加载器(纹理加载器. h+纹理加载器. cpp):
https://github.com/mortennobel/OpenGL_3_2_Utils
这两个文件不依赖于任何其他文件,并且可以在任何版本的OpenGL(和任何平台)上无缝运行。示例用法可以在文件注解中找到。
2eafrhcq3#
可以使用GLAUX和SOIL(Simple OpenGL Image Library)库,也可以使用other image libriries for OpenGL库。
ffscu2ro4#
如何在GLUT上加载一个bmp作为纹理使用?
另一个非常简单的解决方案是使用STB library,它可以在GitHub - nothings/stb中找到。
只需要一个源文件,头文件"stb_image. h",不需要链接任何库文件或编译任何其他源文件。
包括头文件,并通过设置预处理器定义
STB_IMAGE IMPLEMENTATION
启用图像读取:图像文件可以通过函数
stbi_load
读取:将图像加载到纹理对象时,必须将
GL_UNPACK_ALIGNMENT
设置为1。默认情况下
GL_UNPACK_ALIGNMENT
为4,因此图像的每一行被假定为4字节对齐。BMP文件的像素通常为3字节,并且被紧密压缩,这将导致未对齐。加载映像后,可通过
stbi_image_free
释放内存:ogsagwnx5#
Linux操作系统
gcc立方体. c-o立方体-lglut -lGL -lGLU
windows
tcc cube.c -o cube.exe -LC:\tcc\库-日志文件132-lglu 32-lglu 32-Wl,-子系统=窗口