Вопросы текстуры OpenGl - PullRequest
1 голос
/ 05 июля 2011

Текстурирующая головная боль ...

Я не могу понять, где я ошибаюсь здесь. Моя проблема в том, что текстура не выровнена. Изображение слева - это текстурированный четырехугольник OpenGl, а справа - оригинал. Обратите внимание, как столбцы смещены в текстурированном квадрате.

Mis-aligned texture

Я не знаю, правильно ли я загружаю текстуру, или делаю ошибку при загрузке в видеомемору, или просто использую неправильные texCoords ...

Изображение является BMP (R8 G8 B8 A8), и ошибка где-то здесь:

(загрузка растрового изображения и загрузка текстуры)

        Bitmap fontBmp = new Bitmap("font2.bmp");
        MemoryStream ms = new MemoryStream();

        fontBmp.Save(ms, ImageFormat.Bmp);
        int imageWidth = fontBmp.Width;
        int imageHeight = fontBmp.Height;
        byte[] fontBytes = ms.GetBuffer();
        fontBmp.Dispose();
        ms.Dispose();

        Gl.glBindTexture(Gl.GL_TEXTURE_2D, (int)TexId.font);
        Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_EDGE);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_EDGE);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
        Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_MODULATE); // Try GL_DECAL...
        Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, imageWidth, imageHeight, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, fontBytes);

(Квадрат ...)

        Gl.glTexCoord2f(0f + (0.5f / 128f), (127f / 128f) + (0.5f / 128f));
        Gl.glVertex2i(50, 50);

        Gl.glTexCoord2f(0f + (0.5f / 128f), 0f + (0.5f / 128f)); 
        Gl.glVertex2i(50, this.Height - 50);

        Gl.glTexCoord2f((127f / 128f) + (0.5f / 128f), 0f + (0.5f / 128f)); 
        Gl.glVertex2i(this.Width - 50, this.Height - 50);

        Gl.glTexCoord2f((127f / 128f) + (0.5f / 128f), (127f / 128f) + (0.5f / 128f)); 
        Gl.glVertex2i(this.Width - 50, 50);

Кто-нибудь обнаруживает что-либо, вызывающее это?

Ответы [ 2 ]

2 голосов
/ 05 июля 2011

Проблема НЕ в ваших координатах текстуры.

Проблема в том, что вы загружаете текстуру неправильно.Вы забываете удалить заголовок растрового изображения, чтобы все реальные данные были смещены, а конец каждой строки смещен в начало следующей строки.

Обтекание текстуры будет переносить пиксели справа назадна ту же линию, но область не на своем месте смещена вниз на один ряд.Обтекание текстур также не будет происходить с включенным режимом «зажима до края».

0 голосов
/ 05 июля 2011

Ваша проблема - ваши координаты glTexCoord.Например, если вы сделаете

    Gl.glTexCoord2f(0f, 0f);
    Gl.glVertex2i(50, 50);

    Gl.glTexCoord2f(0f, 1f); 
    Gl.glVertex2i(50, this.Height - 50);

    Gl.glTexCoord2f(1f, 1f); 
    Gl.glVertex2i(this.Width - 50, this.Height - 50);

    Gl.glTexCoord2f(1f, 0f); 
    Gl.glVertex2i(this.Width - 50, 50);

, это даст вам выравнивание.Координаты текстуры от 0 до 1. Если вы меняете 1 на 2 в моем примере, ваша текстура будет повторяться дважды в каждом направлении, давая вам четыре копии этого квада.

Обратите внимание, что это непроверенный код, у меня может быть неправильный порядок координат текстуры, но дело в том, что вы не должны использовать размеры в пикселях, а должны параметризовать размеры текстуры в масштабе [0,1].

Причина в том, что ваши параметры текстуры установлены на обтекание.Принимая 0, чтобы обозначить начало текстуры, и 1, чтобы обозначить 100% ее измерения, если вы укажете не целое число, то оно начнется или закончится в середине вашей текстуры, тогда как любое ненулевое целое число будет кратно размеруваша текстура и так будет казаться повторяться.

РЕДАКТИРОВАТЬ: Это также необходимо, чтобы получить эффект, о котором я говорю, чтобы заменить настройку, установленную для GL_TEXTURE_WRAP_S и GL_TEXTURE_WRAP_T.

    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...