簡體   English   中英

OpenGL - 2D紋理映射

[英]OpenGL - 2D Texture Mapping

我正在嘗試將簡單的紋理(64x64)渲染為64x64四邊形。 四邊形本身是渲染,但不是紋理。 (它呈現一個空白的64x64四邊形。)

我正在使用SOIL加載圖像。

static GLuint LoadPNG(char* filename)
{
    GLuint texture = SOIL_load_OGL_texture
    (
        filename,
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
    );

    if (texture == 0)
        Log("Texture Load Error: " + string(filename));

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    return texture;
}

這是我的渲染代碼,我可能沒有正確映射它,所以這也可能是問題。

// Draw Textured Quad
static void glDrawTexturedQuad(glRectF rect, GLuint tex)
{
    // Bind Texture
    glBindTexture (GL_TEXTURE_2D, tex);

    // Render Settings
    glEnable(GL_TEXTURE_2D);
    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    glColor3ub(255,255,255);

    glBegin(GL_QUADS);

    // Top Left
    glTexCoord2f(0, 1);
    glVertex2f(rect.X, rect.Y);

    // Top Right
    glTexCoord2f(1, 1);
    glVertex2f(rect.X + rect.Width, rect.Y); 

    // Bottom Right
    glTexCoord2f(1, 0);
    glVertex2f(rect.X + rect.Width, rect.Y + rect.Height); 

    // Bottom Left
    glTexCoord2f(0, 0);
    glVertex2f(rect.X, rect.Y + rect.Height);

    glEnd();
}

這是相關代碼的其余部分。 (這實際上只是臨時代碼,將它們粘合在一起進行測試,在我開始工作之后我會想出一個更好的解決方案。)

static GLuint Texture;

static void LoadTextures()
{
    Texture = LoadPNG("filename");
}

static void glRenderTest()
{   
    glRectF rect = {20, 20, 64, 64};
    glDrawTexturedQuad(rect, Texture);
}

我也遵循了這里找到的所有建議它仍然沒有顯示我的紋理。


我將LodePNG替換為SOIL(簡單的OpenGL圖像庫),它更容易使用,但仍然無法正常工作。

我按照下面的答案中的建議添加了glTexEnv,但我仍然只是得到一個白色的盒子,我會嘗試更多的設置,但我不認為那是它。 (編輯:試過各種旗幟,沒有,只是一個白色四邊形。)

你試過打電話嗎?

glEnable(GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, texture);

之前

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

所有這些都在同一個文件中嗎?

static GLuint Texture;

static void LoadTextures()
{
    Texture = LoadPNG("filename");
}

static void glRenderTest()
{   
    glRectF rect = {20, 20, 64, 64};
    glDrawTexturedQuad(rect, Texture);
}

如果它們不在同一個文件中,那么static變量將在每個編譯單元中具有獨立的副本,在程序啟動時單獨初始化為零。 這可以解釋為什么你在加載器返回1后綁定紋理#0。

嘗試使用gDEBugger gDEBugger 它將讓您看到已加載到OpenGL中的所有紋理,並提供其他調試工具。

我沒有看到你設置紋理功能。 嘗試在幾何繪圖函數中的glBindTexture之后添加:

glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE ); // texture function: GL_DECAL, GL_MODULATE, etc.

嘗試不同的紋理功能以滿足您的需求:GL_DECAL,GL_BLEND,GL_MODULATE等。

暫無
暫無

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

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