JOGL процедурные текстуры всплывают при масштабировании - PullRequest
1 голос
/ 18 июля 2011

В настоящее время у меня возникают проблемы в приложении JOGL, когда создаваемые мной текстуры отображаются в виде капель при масштабировании.IDE - Netbeans 6.9.1.

Я подробно объясню процесс создания текстуры.

Сначала я делаю:

    gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1);
    gl.glPixelStorei(gl.GL_PACK_ALIGNMENT, 1);
    gl.glPixelStorei(gl.GL_UNPACK_SKIP_PIXELS, 0);
    gl.glPixelStorei(gl.GL_UNPACK_SKIP_ROWS, 0);

    BufferedImage buff = ByteBuffer_To_BufferedImage(ByteBuffer.wrap(data));
    _list_of_textures[count] = TextureIO.newTexture(buff, true);

... где«data» - это байтовый массив.

Мой метод «ByteBuffer_To_BufferedImage ()» выполняет следующее:

int p = _width* _height* 4;
  int q; // Index into ByteBuffer
  int i = 0; // Index into target int[]
  int w3 = _width* 4; // Number of bytes in each row
  for (int row = 0; row < _width; row++) {
p -= w3;
q = p;
for (int col = 0; col < _width; col++) {
  int iR = data.get(q++)*2;     //127*2 ~ 256.
  int iG = data.get(q++)*2;     
  int iB = data.get(q++)*2;     
  int iA = data.get(q++)*2;
  pixelInts[i++] =
    ((iA & 0x000000FF) << 24) |
        ((iR & 0x000000FF) << 16) |
    ((iG & 0x000000FF) << 8) |
         (iB & 0x000000FF);
}
  }

  // Create a new BufferedImage from the pixeldata.
  BufferedImage bufferedImage =
new BufferedImage( _width, _height,
           BufferedImage.TYPE_INT_ARGB);
  bufferedImage.setRGB( 0, 0, _width, _height,
            pixelInts, 0, _width);
    return bufferedImage;

..., который в основном упорядочивает байты для цветовой схемы RGBA.

Когда я рисую, я делаю это так ...

    _textures[c].enable();
    _textures[c].bind();
    gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
    TextureCoords coords = _textures[c].getImageTexCoords();

    gl.glBegin(GL.GL_QUADS);

    gl.glTexCoord2f(coords.left(), coords.top());
    gl.glVertex3f(...);  // Top Left

    gl.glTexCoord2f(coords.right(), coords.top());
    gl.glVertex3f(...);   // Top Right

    gl.glTexCoord2f(coords.right(), coords.bottom());
     gl.glVertex3f(...);  // Bottom Right

    gl.glTexCoord2f(coords.left(), coords.bottom());
    gl.glVertex3f(...); // Bottom Left

    gl.glEnd();
    _textures[c].disable();

И это все.Мне известны некоторые параметры, которые можно установить с помощью javax.media.opengl.GLCapabilities, но я не уверен, поможет ли это.

Кто-нибудь видел такое поведение раньше или знает о его причине?Кроме того, если кто-нибудь может предложить альтернативные способы создания текстуры с учетом моего байтового массива, я тоже попробую это.

Редактировать:

Я вернулся и попытался создатьтекстуры, использующие «java-less» OpenGL.

    gl.glGenTextures(1,  _textures,layer);
    gl.glBindTexture(gl.GL_TEXTURE_2D, _textures[count]);
    gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR);
    gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR);
    gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA,
            _width, _height, 0,
            GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, ByteBuffer.wrap(data));

Это дает те же результаты (пиксели - это пятна, а не прямоугольники).

Редактировать:

Последнее сообщение, которое я сделал, привело меня к вопросу о выполняемой билинейной фильтрации.Это действительно оказалось проблемой.

Если вам нужно поддерживать точные значения пикселей, вам нужно использовать GL_NEAREST (без фильтрации / интерполяции вообще).Я сталкивался с этой проблемой раньше и на самом деле чувствую себя довольно глупо, что не вспомнил решение раньше.

1 Ответ

1 голос
/ 19 июля 2011

Вы пробовали GL_NEAREST вместо GL_LINEAR?

...