我初始化GL时启用GL_TEXTURE_2D.然后我用这个函数加载纹理:
gluint loadTexture(std::string filepath){ SDL_Surface *image; if ( image = SDL_LoadBMP( filepath.c_str() ) ) { gluint tex_ID; glGenTextures( 1,&tex_ID ); glBindTexture( GL_TEXTURE_2D,tex_ID ); glTexImage2D( GL_TEXTURE_2D,3,image->w,image->h,GL_RGB,GL_UNSIGNED_BYTE,image->pixels ); SDL_FreeSurface(image); glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_liNEAR ); glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_liNEAR ); textures.emplace(getfilename(filepath),tex_ID); glBindTexture(GL_TEXTURE_2D,0); return tex_ID; } else { // std::cout << "[!!] Could not open " << filepath << "! \n"; return -1; }}
加载纹理,然后将纹理名称放在地图中,文件名作为键.该映射是全局定义为std :: map< std :: string,gluint>纹理.我可以遍历地图并验证GL正确分配纹理名称.最后,我继续绘制我的四边形:
glBindTexture(GL_TEXTURE_2D,textures["MY_IMAGE.BMP"]);glBegin(GL_QUADS);glTexCoord2f(0.0,0.0);glVertex3d(0.0,0.0,iNode->verticIEs[1]);glTexCoord2f(1.0,0.0);glVertex3d(1.0,iNode->verticIEs[2]);glTexCoord2f(1.0,1.0);glVertex3d(1.0,1.0,iNode->verticIEs[3]);glTexCoord2f(0.0,1.0);glVertex3d(0.0,iNode->verticIEs[4]);glEnd();
一些值得注意的事情:
>在绘制之前已经定义了这些四边形的颜色.如果我
注释掉所有格式的颜色定义
glcolor3ub(r,g,b),四边形渲染为黑色.
>如果我调用gListexture(textures [“MY_IMAGE.BMP”]),则返回false.
>纹理名称仍然正确存储在地图中.
>我正在使用OpenGL 2.1.
纹理是否以某种方式在内部删除?我的渲染有问题吗?
如果需要,我愿意提供更多代码.
编辑:
我不知道我做了什么……
现在我的渲染看起来像这样:
Note: When loading a 24-bit windows BMP file,pixel data points are loaded as blue,green,red,and NOT red,blue (as one might expect).
因此,提供给glTexImage2D的格式参数需要是GL_BGR.
总结以上是内存溢出为你收集整理的c – OpenGL纹理的奇怪事件全部内容,希望文章能够帮你解决c – OpenGL纹理的奇怪事件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)