2016-11-30 17 views
0

私のゲームのGUIのために、テクスチャのrgbaデータを格納するカスタムテクスチャオブジェクトがあります。私のゲームで登録された各GUI要素が最終的なGUIテクスチャに追加され、そのテクスチャは後処理後にフレームバッファにオーバーレイされます。OpenGLテクスチャへのrgba配列

TextureオブジェクトをOpenGLテクスチャに変換する際に問題が発生しました。

まず私はINTバッファとテクスチャを作成rgbargbargba... etc.

public int[] toIntArray(){ 
    int[] colors = new int[(width*height)*4]; 

    int i = 0; 
    for(int y = 0; y < height; ++y){ 
     for(int x = 0; x < width; ++x){ 

      colors[i] = r[x][y]; 
      colors[i+1] = g[x][y]; 
      colors[i+2] = b[x][y]; 
      colors[i+3] = a[x][y]; 

      i += 4; 
     } 
    } 
    return colors; 
} 

場合rgb、及びaは0から255のぎざぎざのint配列で次へ進む1Dのint配列を作成します。その後

id = glGenTextures(); 

glBindTexture(GL_TEXTURE_2D, id); 

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

IntBuffer iBuffer = BufferUtils.createIntBuffer(((width * height)*4)); 

int[] data = toIntArray(); 
iBuffer.put(data); 
iBuffer.rewind(); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_INT, iBuffer); 

glBindTexture(GL_TEXTURE_2D, 0); 

私は、テクスチャの左上に50×50赤い四角を追加し、フレームバッファシェーダにテクスチャを結合して、私のフレームバッファを表示するフルスクリーン矩形を描画します。

frameBuffer.unbind(window.getWidth(), window.getHeight()); 

postShaderProgram.bind(); 

glEnable(GL_TEXTURE_2D); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, guiManager.texture()); // this gets the texture id that was created 

postShaderProgram.setUniform("gui_texture", 1); 

mesh.render(); 

postShaderProgram.unbind(); 

そして、私のフラグメントシェーダでは、私はGUIを表示してみてください。

#version 330 

in vec2 Texcoord; 
out vec4 outColor; 

uniform sampler2D texFramebuffer; 
uniform sampler2D gui_texture; 

void main() 
{ 
    outColor = texture(gui_texture, Texcoord); 
} 

しかし、それは出力のすべてが黒のウィンドウです!

左上隅に赤い50x50の長方形を追加して、それが存在することを確認しましたが、何らかの理由で最終出力に表示されません。私が正しくglTexImage2DでOpenGLのテクスチャに私のテクスチャを変換していないよということを信じる理由を与える

enter image description here

私が間違っていることはありますか?

アップデート1:

Here私はfloat配列を使用して同じようなことをやって彼らを見たので、私は私の0-255 0-1 float配列に変換し、そのような画像データとして渡す試してみました:

public float[] toFloatArray(){ 
    float[] colors = new float[(width*height)*4]; 

    int i = 0; 
    for(int y = 0; y < height; ++y){ 
     for(int x = 0; x < width; ++x){ 

      colors[i] = ((r[x][y] * 1.0f)/255); 
      colors[i+1] = ((g[x][y] * 1.0f)/255); 
      colors[i+2] = ((b[x][y] * 1.0f)/255); 
      colors[i+3] = ((a[x][y] * 1.0f)/255); 

      i += 4; 
     } 
    } 
    return colors; 
} 

... 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, toFloatArray()); 

これは機能します。

enter image description here

あなたが「ホスト」の種類としてGL_UNSIGNED_INTを指定した場合、私はint型のバッファが:)

答えて

3

を働いていなかった理由を知りたいようしかし、未解決の問題を残すつもりですデータでは、OpenGLは各色ごとに32ビットが割り当てられています。 OpenGLはデフォルトのフレームバッファの出力カラーを範囲[0.0f, 1.0f]にマップするだけなので、入力カラー値(範囲[0, 255]にマップされています)を取得し、それらをintの最大サイズ(約4.2億)で割ります最終的な色は画面に表示されます。練習として、元のコードを使用して、画面の「クリア」色を白に設定し、画面上に黒い四角形が描かれていることを確認します。

2つのオプションがあります。最初は、カラー値をGL_UNSIGNED_INTで指定された範囲に変換します。つまり、各カラー値に対して、Math.pow((long)2, 24)を乗算し、その値を乗算した整数のオーバーフローが正しく動作することを意味します(Javaは符号なし整数タイプ)。

他、はるかに安全オプションは、byte[]オブジェクト内の各0〜255の値を格納することである(charは、C/C++/OpenGLで1バイトである。ない使用charを行うが、2 Javaでバイト)と要素の型をGL_UNSIGNED_BYTEと指定します。

+1

訂正:OpenGLタイプはGL_UNSIGNED_BYTEと呼ばれ、GL_UNSIGNED_CHARではなく –

+0

@AntonReshetnikovが編集されています。 – Xirema

関連する問題