#java #opengl #framebuffer #opengl-3
#java #opengl #фреймбуфер #opengl-3
Вопрос:
Сегодня я работал с фреймбуферами и тому подобным. Я действительно сделал это, и это работает. Но одна небольшая проблема: GL_COLOR_ATTACHMENT0 работает, а GL_DEPTH_ATTACHMENT — нет. Код тот же, я просто меняю режим вложения. У меня есть буфер глубины в качестве буфера рендеринга, если он не находится в буфере кадров (рендеринг в текстуру без буфера глубины, просто изображение). Но с глубиной att. Я отключаю его. Код:
public void setAsFramebuffer(int num,int att, boolean b) {
if (frameBuffer == 0) frameBuffer = GL30.glGenFramebuffers();
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer);
GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, att, GL11.GL_TEXTURE_2D, id[num], 0);
if (att == GL30.GL_DEPTH_ATTACHMENT) { //TODO: add pen mode
GL20.glDrawBuffers(GL11.GL_NONE);
} else {
GL20.glDrawBuffers(att);
}
if (GL30.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER) != GL30.GL_FRAMEBUFFER_COMPLETE) {
String msg;
boolean crash = true;
switch (GL30.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER)) {
case GL30.GL_FRAMEBUFFER_UNDEFINED : msg = "The default framebuffer does not exist.";
case GL30.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT : msg = "Some of framebuffers attachment points are framebuffer incomplete.";
case GL30.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT : msg = "Framebuffer dosent have any attached images.";
case GL30.GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER : msg = "Value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE for any color attachment point(s) named by GL_DRAW_BUFFERi.";
case GL30.GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER : msg = "Value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE for the color attachment point named by GL_READ_BUFFER";
case GL30.GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE : msg = "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE";
case GL30.GL_RENDERBUFFER_SAMPLES : msg = "GL_RENDERBUFFER_SAMPLES ";
case GL32.GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS : msg = "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS";
case GL30.GL_FRAMEBUFFER_UNSUPPORTED : msg = "Framebuffers not supported by Grahpics card."; crash = false;
default: msg = "unknown! Maybe GL error? "; crash = true; CoreEngine.checkForGLErrors();
}
System.out.println("Framebuffer error! Someting is bad happened here...Error: " msg);
if (crash) System.exit(0);
}
if(b) this.setupDepthRenderBuffer();
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
}
public void setupDepthRenderBuffer() {
renderBuffer = GL30.glGenRenderbuffers();
GL30.glBindRenderbuffer(GL30.GL_RENDERBUFFER, renderBuffer);
GL30.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_DEPTH_COMPONENT, width[0], height[0]);
GL30.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, renderBuffer);
}
Выполняет ли отдел att. также требуется изменение цвета.? Или я что-то напутал?
О, и он говорит, в чем его неизвестная ошибка. Я больше ничего не видел в документах, только эти ошибки.
Инициализация текстуры:
public void loadTexture(int glRepeat, int filter, int glTexture2d,
int width, int height, ByteBuffer buffer) {
this.width[0] = width;
this.height[0] = height;
if(buffer == EMPTRY_PICTURE) buffer = Util.createByteBuffer(width*height*4);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glRepeat);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, glRepeat);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
glTexImage2D(glTexture2d, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
if (filter == GL_NEAREST_MIPMAP_NEAREST ||
filter == GL_NEAREST_MIPMAP_LINEAR ||
filter == GL_LINEAR_MIPMAP_NEAREST ||
filter == GL_LINEAR_MIPMAP_LINEAR)
{
GL30.glGenerateMipmap(GL_TEXTURE_2D);
float ani;
ani = glGetFloat(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,Math.min(ani,8f));
}
}
Комментарии:
1. Ваш код действительно сбивает с толку. Строка
if (att == GL30.GL_DEPTH_ATTACHMENT)
предполагает, что эта функция может быть вызвана сatt == GL_DEPTH_ATTACHMENT
помощью . В этом случае вы прикрепляете текстуру в качестве вложения глубины. И неясно, является ли используемая вами текстура отображаемой по глубине. Затем вы проверяете состояние фреймбуфера, и после этого вы присоединяете renberbuffer в качестве буфера глубины, еслиb
значение true, и никогда не проверяете состояние окончательной настройки вашего фреймбуфера. Пожалуйста, предоставьте больше кода (как называется этот материал, как генерируются текстуры), чтобы an мог следить за тем, что происходит на самом деле.2. @derhass B всегда будет false , если att имеет значение DEPTH_ATTACHMENT . B верно только в том случае, если текстура без фреймбуфера, поэтому для нее нам понадобится отдельный буфер.
3. Ну, как я уже сказал: убедитесь, что текстура, которую вы пытаетесь использовать в качестве вложения глубины, на самом деле является визуализируемой по глубине. Вы не можете использовать для этого стандартную текстуру RGB (A).
4. Тогда что мне нужно использовать?
5. Хорошим началом может быть текстура с некоторым
GL_DEPTH_COMPONENT
внутренним форматом. Но вы должны знать, что тогда эта текстура не будет воспроизводиться цветом. Вы должны указать, что вы на самом деле планируете делать с текстурой глубины.