2011-07-18 3 views
1

現在、私が作成しているテクスチャがスケーリングされたときにブロブとして表示されるJOGLアプリケーションで問題が発生しています。 IDEはNetbeans 6.9.1です。JOGL手続きテクスチャは、スケーリング時にブロブ化されます

テクスチャの作成プロセスについて詳しく説明します。

まず私がやっている: "データ" バイト配列をある

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); 

を...。

私の方法 "ByteBuffer_To_BufferedImage()" 次は行います。基本的にRGBAカラースキームのバイトを注文

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; 

...。私が描くと

、私はそう...

_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のレス" 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(フィルタリング/補間なし)を使用する必要があります。私は前にこの問題に遭遇し、ソリューションをもっと早く覚えていないため、実際には気が気難しいです。

+0

正しい出力はどのように見えますか? – genpfault

+0

ここに出力を修正するためのリンクがあります:http://imageshack.us/photo/my-images/832/specklefix.png/ – viperld002

答えて

1

GL_LINEARの代わりにGL_NEARESTを試しましたか?

+0

はい、私は笑ったようにそれを理解しました。レスポンスありがとう! – viperld002

関連する問題