私のゲームの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;
}
場合r
、g
、b
、及び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のテクスチャに私のテクスチャを変換していないよということを信じる理由を与える
。
私が間違っていることはありますか?
アップデート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());
これは機能します。
あなたが「ホスト」の種類としてGL_UNSIGNED_INT
を指定した場合、私はint型のバッファが:)
訂正:OpenGLタイプはGL_UNSIGNED_BYTEと呼ばれ、GL_UNSIGNED_CHARではなく –
@AntonReshetnikovが編集されています。 – Xirema