Текстура не растягивается должным образом. Почему это происходит?

Я использую LWJGL и Slick Framework для загрузки текстур в мое OpenGL-приложение.

Я использую это изображение:Japanese flag, using for texture

И этот код для импорта и использования текстуры:

<code>    flagTexture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("japan.png"));
</code>

......

<code>    flagTexture.bind();

    GL11.glColor3f(1.0f, 1.0f, 1.0f);
    GL11.glPushMatrix();

    GL11.glTranslatef(0.0f, 0.0f, -10.0f);

    GL11.glBegin(GL11.GL_QUADS);
    GL11.glTexCoord2f(0.0f, 0.0f);
    GL11.glVertex2f(0.0f, 0.0f);
    GL11.glTexCoord2f(1.0f, 0.0f);
    GL11.glVertex2f(2.5f, 0.0f);
    GL11.glTexCoord2f(1.0f, 1.0f);
    GL11.glVertex2f(2.5f, 2.5f);
    GL11.glTexCoord2f(0.0f, 1.0f);
    GL11.glVertex2f(0.0f, 2.5f);
    GL11.glEnd();

    GL11.glPopMatrix();
</code>

Но конечный результат становится таким: Texture not stretching to the vertex-parameters

Я не использую никаких специальных настроек, таких как GL_REPEAT или что-то подобное. В чем дело? Как я могу заставить текстуру заполнить заданные вершины?

Ответы на вопрос(3)

Решение Вопроса

Похоже, что текстуру дополняют до ближайшей степени двух. Здесь есть два решения:

Stretch the texture out to the nearest power of two. Calculate the difference between your texture's size and the nearest power of two and change the texture coordinates from 1.0f to textureWidth/nearestPowerOfTwoWidth and textureHeight/nearestPowerOfTwoHeight.

Там также может быть какой-то конкретный метод LWJGL, чтобы учесть текстуры не-степени двух, посмотрите на это.

 13 мая 2012 г., 01:49
Сам OpenGL поддерживает текстуры не из двух степеней, начиная с 2.0, это LWJGL. Из того, что я прочитал, LWJGL по-прежнему дополняет текстуры до ближайшей степени двух (вероятно, для поддержки действительно старого оборудования). С загруженным изображением ваше изображение 600x400 стало текстурой 1024x512. Координаты текстуры OpenGL масштабируются от 0 до 1 по осям x и y. Координата текстуры (1, 1) представляет (приблизительно) пиксель (1024, 512). Вам нужен пиксель (600, 400), но в масштабе 0-1, поэтому вы уменьшаете его до этого масштаба: (600/1024, 400/512)
 JulenissensHjelper13 мая 2012 г., 01:28
Вау, решение 1 сработало! Большое спасибо, я боролся с этим. Можете ли вы объяснить, почему это работает в отличие от оригинальной ширины & amp; рост? Это вещь opengl? Благодарю.

Если вам нужно поддерживать текстуры не-степени двух, вы можете изменить метод загрузки. Если вы используете Slick2D, нет другого способа сделать это, кроме как реализовать свой собственный. класс текстуры (Вы можете получить некоторые примеры из них здесь:Texture.java а такжеTextureLoader.java Класс TextureLoader содержит метод «get2Fold», который используется для вычисления следующей степени на два больше, чем ширина / высота текстуры. Так что, если вы хотите использовать текстуры с размером не-степени-два, просто измените этот метод, чтобы просто вернуть сгиб; (= вход), так что программа "думает" что следующей степенью двойки является размер изображения, которым он не является во многих случаях, но если аппаратное обеспечение его поддерживает (большинство поддерживает), это не должно быть проблемой. Более "абстрактный" способ будет изменить эту строку: GL11.glTexImage2D (target, 0, dstPixelFormat, get2Fold (bufferedImage.getWidth ()), get2Fold (bufferedImage.getHeight ()), 0, srcPixelFormat, GL11.GL_UNSIGNED_BYTE, textureBuffer); Здесь 4-й аргумент = ширина текстуры, а 5-й = высота текстуры. Если вы установите для них значение ширины / высоты ИЗОБРАЖЕНИЯ, оно будет работать. Поскольку этот метод в основном такой же, как и предыдущий, для обоих есть одинаковые проблемы. Как уже было сказано, это замедлит обработку изображений и может не поддерживаться.

Надеюсь, эта ссылка будет полезна

http://www.lwjgl.org/wiki/index.php?title=Slick-Util_Library_-_Part_1_-_Loading_Images_for_LWJGL

похоже, это очень похоже на то, что вы делаете здесь.

GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0,0);
GL11.glVertex2f(100,100);
GL11.glTexCoord2f(1,0);
GL11.glVertex2f(100+texture.getTextureWidth(),100);
GL11.glTexCoord2f(1,1);
GL11.glVertex2f(100+texture.getTextureWidth(),100+texture.getTextureHeight());
GL11.glTexCoord2f(0,1);
GL11.glVertex2f(100,100+texture.getTextureHeight());
GL11.glEnd();
 13 мая 2012 г., 01:25
это все равно будет вызывать ту же проблему, это проблема с координатами текстуры, а не с вершинами.

Ваш ответ на вопрос