嘿,我有这个脚本加载SDL_Surface并将其保存为OpenGL纹理:
typedef GLuint texture;
texture load_texture(std::string fname){
SDL_Surface *tex_surf = IMG_Load(fname.c_str());
if(!tex_surf){
return 0;
}
texture ret;
glGenTextures(1, &ret);
glBindTexture(GL_TEXTURE_2D, ret);
glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
SDL_FreeSurface(tex_surf);
return ret;
}
问题在于它无法正常工作。当我从main函数调用该函数时,它只是不加载任何图像(当显示它只是转动绘图颜色时),并且当从主函数外部的任何函数调用时,程序崩溃。 正是这条线使程序崩溃:
2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);
有人可以看到这个错误吗?
答案 0 :(得分:2)
我敢打赌,在尝试将其转换为OpenGL纹理之前,您需要转换SDL_Surface。这里应该给你一般的想法:
SDL_Surface* originalSurface; // Load like an other SDL_Surface
int w = pow(2, ceil( log(originalSurface->w)/log(2) ) ); // Round up to the nearest power of two
SDL_Surface* newSurface =
SDL_CreateRGBSurface(0, w, w, 24, 0xff000000, 0x00ff0000, 0x0000ff00, 0);
SDL_BlitSurface(originalSurface, 0, newSurface, 0); // Blit onto a purely RGB Surface
texture ret;
glGenTextures( 1, &ret );
glBindTexture( GL_TEXTURE_2D, ret );
glTexImage2D( GL_TEXTURE_2D, 0, 3, w, w, 0, GL_RGB,
GL_UNSIGNED_BYTE, newSurface->pixels );
I found the original code here。可能还有一些other useful posts on GameDev。
答案 1 :(得分:0)
我不确定你是否在代码片段之外的某个地方这样做,但是你打电话给
glEnable(GL_TEXTURE_2D);
在某个时候?
答案 2 :(得分:0)
此外,默认的GL_REPLACE纹理混合模式会将当前的glColor与输入的纹素RGB值相乘。结果:glColor3f(0,0,0)会给你黑色纹理应该是:)
在绘制纹理几何体之前,请确保glColor3f(1,1,1)。
答案 3 :(得分:0)
问题可能出在对internalformat
的调用的第三个参数(glTexImage2D
)上。
glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);
您必须使用诸如GL_RGB
或GL_RGBA
之类的常量,因为宏的实际值与颜色分量的数量无关。
参考手册https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml中提供了允许值的列表。
这似乎是一个经常犯的错误。也许某些驱动程序很聪明并且可以更正此错误,所以对于某些人来说错误的路线可能仍然有用。
/usr/include/GL/gl.h:473:#define GL_RGB 0x1907
/usr/include/GL/gl.h:474:#define GL_RGBA 0x1908
答案 4 :(得分:0)
一些较旧的硬件(令人惊讶的是,在我今年购买的新机器上运行的 emscripten 的 opengl ES 2.0 仿真)似乎不支持尺寸不是 2 的幂的纹理。结果证明这是我被困了一段时间的问题(我得到了一个黑色矩形而不是我想要的精灵)。因此,在将图像大小调整为 2 的幂后,海报的问题可能会消失。