Для gui для моей игры у меня есть собственный объект текстуры, который хранит данные rgba для текстуры. Каждый элемент GUI, зарегистрированный в моей игре, добавляет к окончательной текстуре графического интерфейса, а затем эта текстура накладывается на фреймбуфер после постобработки.rgba массивы для текстуры OpenGL
У меня возникли проблемы с преобразованием объекта Texture в текстуру openGL.
Сначала я создаю целочисленный массив 1D, который идет 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. Далее я создаю ИНТ буфер и текстуру.
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();
И тогда в моем пиксельный шейдер, я пытаюсь отображения графического интерфейса пользователя:
#version 330
in vec2 Texcoord;
out vec4 outColor;
uniform sampler2D texFramebuffer;
uniform sampler2D gui_texture;
void main()
{
outColor = texture(gui_texture, Texcoord);
}
Но все это выводит это черное окно!
Я добавил красный правый прямоугольник 50x50 в верхний левый угол и подтвердил, что он существует, но по какой-то причине он не отображается в конечном выходе.
Это дает мне основания полагать, что я не преобразовывать свою текстуру в OpenGL текстуры с glTexImage2D
правильно.
Вы видите, что я делаю неправильно?
Update 1:
Here Я видел их делать подобную вещь с помощью буев, поэтому я попытался преобразовать мой 0-255 в массив 0-1 поплавка и передачи его в качестве данных изображения, как так :
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());
И это работает!
Я собираюсь оставить этот вопрос открытым, однако, как я хочу, чтобы узнать, почему ИНТ буфер не работает :)
Исправление: тип OpenGL называется GL_UNSIGNED_BYTE, а не GL_UNSIGNED_CHAR –
@ Антон Решетников Отредактировано. – Xirema