OpenGL - 2D текстурное наложение - PullRequest
6 голосов
/ 14 мая 2011

Я пытаюсь сделать простую текстуру (64х64) для четырехугольника 64х64. Сам квад рендеринг рендерит, но не текстура. (Это рендеринг пустого белого квадрата 64х64.)

Я использую ПОЧВУ для загрузки изображения.

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, как предложено в ответе ниже, но я все еще просто получаю белое поле, попробую еще несколько настроек, но я не думаю, что это было так. (Изменить: пробовал различные флаги, ничего, все еще только белый квад.)

Ответы [ 4 ]

7 голосов
/ 20 июля 2011

вы пытались звонить

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);
1 голос
/ 14 мая 2011

Все это в одном файле?

static GLuint Texture;

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

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

Если они не находятся в одном и том же файле, то переменные static будут иметь независимые копии в каждом модуле компиляции, индивидуально инициализируемые в ноль при запуске программы. Что объясняет, почему вы привязываете текстуру # 0 после того, как загрузчик вернул 1.

1 голос
/ 30 июня 2011

Попробуйте использовать gDEBugger gDEBugger .Это позволит вам увидеть все текстуры, которые были загружены в OpenGL, а также предоставляет другие инструменты отладки.

0 голосов
/ 14 мая 2011

Я не вижу, чтобы вы установили функцию текстуры. Попробуйте добавить это после glBindTexture в функции рисования геометрии:

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

Попробуйте использовать другую текстурную функцию, соответствующую вашим потребностям: GL_DECAL, GL_BLEND, GL_MODULATE и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...