簡體   English   中英

OpenGL紋理渲染

[英]OpenGL texture rendering

我在OpenGL中渲染紋理時遇到問題。 我得到的是白色而不是紋理圖像,但是我的矩形和整個上下文都正常工作。 我正在使用stbi圖像加載庫和OpenGL 3.3。

渲染之前:

glViewport(0, 0, ScreenWidth, ScreenHeight);

glClearColor(0.2f, 0.0f, 0.0f, 1.0f);

int Buffer;
glGenBuffers(1, &Buffer);
glBindBuffer(GL_ARRAY_BUFFER, Buffer);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

加載紋理:

unsigned char *ImageData = stbi_load(file_name, 1024, 1024, 0, 4); //not sure about the "0" parameter

int Texture;
glGenTextures(1, &Texture);
glBindTexture(GL_TEXTURE_2D, Texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, x, y, 0, GL_RGB, GL_UNSIGNED_BYTE, ImageData);

stbi_image_free(ImageData);

渲染:

glClear(GL_COLOR_BUFFER_BIT);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Texture);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 6 * 3); //a rectangle which is rendered fine
glDisableVertexAttribArray(0);

我正在尋找一個非常簡單和簡單的解決方案。

首先,花點時間看一下stbi_load (...)的函數聲明:

unsigned char *stbi_load (char const *filename,
                          int        *x,    // POINTER!!
                          int        *y,    // POINTER!!
                          int        *comp, // POINTER!!
                          int         req_comp)

現在,考慮傳遞給它的參數:

file_name (presumably a pointer to a C string)
1024      (definitely NOT a pointer)
1024      (definitely NOT a pointer)
0         (definitely NOT a pointer)

xycomp作為指針傳遞的重點是,這樣stbi可以在加載圖像后更新其值。 這與在C ++或Java之類的語言中按引用傳遞等效於C語言,但是您選擇了傳遞整數常量,然后將其視為編譯器。

因為你的方式調用這個函數,stbi試圖將圖像的寬度存儲在地址:1024,圖像的地址的高度:1024,並在地址組件的數量:0。 您實際上很幸運,這不會在運行時引起訪問沖突或其他奇怪的行為,將內容存儲在任意地址是危險的。

相反,請考慮以下情況:

GLuint ImageX,
       ImageY,
       ImageComponents;

GLubyte *ImageData = stbi_load(file_name, &ImageX, &ImageY, &ImageComponents, 4);

[...]

glTexImage2D (GL_TEXTURE_2D,    0, GL_RGBA8,
                ImageX, ImageY, 0, GL_RGBA, GL_UNSIGNED_BYTE, ImageData);

// ~~~~ You are requesting 4 components per-pixel from stbi, so this is RGBA!

自從我完成OpenGL以來已經有一段時間了,除了一些隨意的調用,我猜的主要問題是您沒有調用glEnable(GL_TEXTURE_2D); 在進行調用以繪制函數之前。 然后,最好調用glDisable(GL_TEXTURE_2D); 以及避免將來可能發生的沖突。

暫無
暫無

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

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