![](/img/trans.png)
[英]Is it okay to have a SDL_Surface and SDL_Texture for each sprite?
[英]SDL_surface to OpenGL texture
嘿,我有這個腳本來加載 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 函數調用該函數時,它只是不加載任何圖像(顯示時它只是改變繪圖顏色),並且當從 main 函數之外的任何函數調用時,程序崩潰。 正是這一行使程序崩潰:
2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);
任何人都可以看到這個錯誤嗎?
我敢打賭,您需要先轉換 SDL_Surface,然后再嘗試將其塞入 OpenGL 紋理。 這里有一些東西可以讓你大致了解:
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 );
我在這里找到了原始代碼。 GameDev 上可能還有其他一些有用的帖子。
問題可能在於調用glTexImage2D
第三個參數( internalformat
)。
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
類的GL_RGB
,因為宏的實際值與顏色分量的數量無關。
允許值的列表在參考手冊中: 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
同樣,默認的GL_REPLACE紋理混合模式會將當前的glColor與傳入的texel RGB值相乘。 結果:glColor3f(0,0,0)將在紋理應為:)的地方為黑色:)
在繪制帶紋理的幾何圖形之前,請確保先使用glColor3f(1,1,1)。
一些較舊的硬件(令人驚訝的是,在我今年購買的新機器上運行的 emscripten 的 opengl ES 2.0 仿真)似乎不支持尺寸不是 2 的冪的紋理。 結果證明這是我被困了一段時間的問題(我得到了一個黑色矩形而不是我想要的精靈)。 因此,在將圖像大小調整為具有 2 的冪的尺寸后,海報的問題可能會消失。
我不確定您是否在代碼片段之外的某個地方執行此操作,但是您是否已致電
glEnable(GL_TEXTURE_2D);
在某一點?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.