簡體   English   中英

SDL_surface 到 OpenGL 紋理

[英]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_RGBGL_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 的冪的尺寸后,海報的問題可能會消失。

請參閱: https : //www.khronos.org/opengl/wiki/NPOT_Texture

我不確定您是否在代碼片段之外的某個地方執行此操作,但是您是否已致電

glEnable(GL_TEXTURE_2D);

在某一點?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM