簡體   English   中英

無法在四邊形上渲染紋理

[英]Unable to render a texture on a quad

我正在嘗試使用OpenGL圖形工具在C ++中編寫一個簡單的游戲。 在我的游戲中,我有一些對象在屏幕上呈現為白色正方形。 我希望能夠將圖像作為紋理綁定到這些對象,以便可以在屏幕上而不是白色正方形上渲染圖像。 盡管我一直使用.png或.bmp進行測試,但圖像的格式沒有限制。

我的一個對象類Character.h存儲了一個名為_texture的GLuint *成員變量和一個名為_data的無符號char *成員變量(分別作為圖像句柄和像素數據)。 在Character.h中,此函數旨在將圖像作為紋理綁定到Character對象:

void loadTexture(const char* fileName)
    {
        /* read pixel data */
        FILE* file;
        file = fopen(fileName, "rb");
        if (file == NULL) {cout << "ERROR: Image file not found!" << endl;}
        _data = (unsigned char*)malloc(_dimension * _dimension * 3);
        fread(_data, _dimension * _dimension * 3, 1, file);
        fclose(file);
        /* bind texture */
        glGenTextures(1, &_texture); // _texture is a member variable of type GLuint
        glBindTexture(GL_TEXTURE_2D, _texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, _dimension, _dimension, 0, GL_RGB, GL_UNSIGNED_BYTE, _data); // _dimension = 64.0f.
    }

綁定圖像后,我便嘗試使用此函數(在單獨的類中找到的靜態函數)渲染Character對象:

static void drawTexturedRectangle(float x, float y, float w, float h, GLuint texture, unsigned char* data)
    {
        /* fractions are calculated to determine the position onscreen that the object is drawn at */
        float xFraction = (x / GlobalConstants::SCREEN_WIDTH) * 2;
        float yFraction = (y / GlobalConstants::SCREEN_HEIGHT) * 2;
        float wFraction = (w / GlobalConstants::SCREEN_WIDTH) * 2;
        float hFraction = (h / GlobalConstants::SCREEN_HEIGHT) * 2;
        glEnable(GL_TEXTURE_2D);
        glClear(GL_COLOR_BUFFER_BIT);
        glBindTexture(GL_TEXTURE_2D, texture);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
        glPushMatrix();
        glEnable(GL_BLEND);
        glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f); glVertex2f(xFraction, yFraction); // bottom left corner
        glTexCoord2f(0.0f, 1.0f); glVertex2f(xFraction, yFraction + hFraction); // top left corner
        glTexCoord2f(1.0f, 1.0f); glVertex2f(xFraction + wFraction, yFraction + hFraction); // top right corner
        glTexCoord2f(1.0f, 0.0f); glVertex2f(xFraction + wFraction, yFraction); // bottom right corner
        glEnd();
        glDisable(GL_BLEND);
        glPopMatrix();
    }

無論我對此有多大的困擾,我似乎都無法讓我的程序做任何事情,只能渲染沒有紋理的純白色正方形。 我已經檢查以確保變量文件,_texture,_dimension和_data都包含值。 有人可以發現我可能做錯了嗎?

我不認為您可以將原始文件輸入到glTexImage2D,除非您以該格式存儲紋理文件(您可能不知道)。 glTexImage2D期望一個巨大的數組字節(代表紋理顏色),但是文件格式通常不存儲這樣的圖像。 甚至bmp都有一些頭信息。

使用DevIL或SOIL之類的第三方圖像加載器庫來加載您的紋理! 這些庫可以將最常見的圖像文件格式(png,jpg,tga等)轉換為字節流,您可以將其輸入到OpenGL!

附帶說明:調用glTexImage2D(...,data)之后,數據內容將復制到GPU內存(VRAM)中。 從這一點出發,您僅需使用其ID綁定紋理,因為該紋理已在VRAM中。 在每幀中調用glTexImage2D()會將每幀中的整個紋理重新上載到vram中,從而導致性能下降。

暫無
暫無

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

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