簡體   English   中英

OpenGL 紋理不繪制?

[英]OpenGL texture not drawing?

我試圖在 C 中使用 FreeType2 和 OpenGL 繪制文本,但它只是渲染一個正方形。 我一直在關注教程hereherehere 這段代碼在 Red Hat 5.6 上運行,它只有 OpenGL 1.4。

這是我的代碼。 首先,我使用 FreeType 加載字體。 我已經打印出我想要到終端的字符的緩沖區,它似乎正在正確加載。 為清楚起見,我省略了一些錯誤檢查。 此外,我不得不手動轉錄此代碼,因此,如果它們看起來像是明顯的錯誤類型,請忽略任何語法錯誤。

FT_Library ft;
FT_Init_Freetype(&ft);
FT_Face face;
FT_New_Face(ft, fontpath, 0, &face);
Ft_Set_Pixel_Sizes(face, 0, 16);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
FT_Load_Char(face, c, FT_LOAD_RENDER);    

GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 
             0,
             GL_RGBA,
             face->glyph->bitmap.width,
             face->glyph->bitmap.rows,
             0,
             GL_INTENSITY,
             GL_UNSIGNED_BYTE,
             face->glyph->bitmap.buffer);
FT_Done_Face(face);
FT_Done_Freetype(ft);

如前所述,如果我遍歷緩沖區的行和寬度並打印它們看起來不錯的值。 我認為對 glTexImage2D 的調用是我想要的,考慮到每個像素都是一個二進制強度值。

繪制符號的代碼如下,但似乎不起作用。 相反,它只是繪制一個矩形:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, texture);
glColor3f(1,1,1);

GLfloat x = 0;
GLfloat y = 0;
GLfloat w = 5;
GLfloat h = 5;

glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex2f(x,y);
glTexCoord2f(1,0);
glVertex2f(x+w,y);
glTexCoord2f(1,1);
glVertex2f(x+w,y+h);
glTexCoord2f(0,1);
glVertex2f(x,y+h);
glEnd();

glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);

在這一點上,我不知所措。 我已經閱讀了 OpenGL 文檔,我沒有看到任何明顯的錯誤。 有人可以告訴我我錯過了什么嗎?

經過大量試驗和錯誤,我找到了解決方案。 OpenGL 1.4 要求紋理是 2 的冪。 我分配了一個臨時數組並使用了它。 另外 GL_INTENSITY 設置似乎不起作用,所以我手動制作了一個 RGBA 數組。

暫無
暫無

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

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