gpt4 book ai didi

java - OpenGL 帧缓冲区渲染到纹理不工作

转载 作者:搜寻专家 更新时间:2023-11-01 03:28:46 24 4
gpt4 key购买 nike

我正在尝试使用帧缓冲区来使用 Java 和 JOGL 创建发光效果,但我遇到了问题。目前,我的目标是将我的宇宙飞船模型渲染为帧缓冲区纹理,然后将帧缓冲区纹理绘制为一个三角形扇形四边形。我正在运行 OpenGL 2.1 和/或 2.0 这是我生成帧缓冲区及其纹理的代码:

private int createFrameBuffer(GL2GL3 gl) {
_frameBufferTextureId = GLHelper.makeTextureBuffer(gl, GL2GL3.GL_RGBA, _width / 2, _height / 2, 0, GL2GL3.GL_RGBA,
GL2GL3.GL_UNSIGNED_BYTE, GL2GL3.GL_TEXTURE_MIN_FILTER, GL2GL3.GL_TEXTURE_MIN_FILTER, GL2GL3.GL_REPEAT, null);
int frameBufferId = GLHelper.makeFrameBuffer(gl, _frameBufferTextureId, _width / 2, _height / 2);
return frameBufferId;
}

public static int makeTextureBuffer(GL2GL3 gl, int glEnumInternalFormat, int width, int height, int border,
int glEnumPixelFormat, int glEnumPixelType, int glEnumMinFilter, int glEnumMagFilter, int glEnumWrapMode,
File textureFile) {
ByteBuffer textureDataBuffer = null;
if (textureFile != null) {
String filePath = textureFile.getPath();
String extension = filePath.substring(filePath.lastIndexOf('.') + 1, filePath.length());
TextureData textureData = null;
try {
textureData = TextureIO.newTextureData(gl.getGLProfile(), textureFile, false, extension);
} catch (IOException e) {
throw new RuntimeException("Error reading texture");
}
textureDataBuffer = getProperlyFormattedBuffer(textureData);
}
IntBuffer texture = IntBuffer.allocate(1);
gl.glGenTextures(1, texture);
gl.glBindTexture(GL2GL3.GL_TEXTURE_2D, texture.get(0));
gl.glTexParameteri(GL2GL3.GL_TEXTURE_2D, GL2GL3.GL_TEXTURE_MIN_FILTER, glEnumMinFilter);
gl.glTexParameteri(GL2GL3.GL_TEXTURE_2D, GL2GL3.GL_TEXTURE_MAG_FILTER, glEnumMagFilter);
gl.glTexParameteri(GL2GL3.GL_TEXTURE_2D, GL2GL3.GL_TEXTURE_WRAP_S, glEnumWrapMode);
gl.glTexParameteri(GL2GL3.GL_TEXTURE_2D, GL2GL3.GL_TEXTURE_WRAP_T, glEnumWrapMode);
gl.glTexImage2D(GL2GL3.GL_TEXTURE_2D, 0, glEnumInternalFormat, width, height, border, glEnumPixelFormat, glEnumPixelType,
textureDataBuffer);
gl.glBindTexture(GL2GL3.GL_TEXTURE_2D, 0);
return texture.get(0);
}

public static int makeFrameBuffer(GL2GL3 gl, int textureBufferId, int width, int height) {
IntBuffer frameBuffer = IntBuffer.allocate(1);
gl.glGenFramebuffers(1, frameBuffer);
gl.glBindFramebuffer(GL2GL3.GL_FRAMEBUFFER, frameBuffer.get(0));
gl.glFramebufferTexture2D(GL2GL3.GL_FRAMEBUFFER, GL2GL3.GL_COLOR_ATTACHMENT0, GL2GL3.GL_TEXTURE_2D, textureBufferId, 0);
verifyFrameBuffer(gl);
gl.glBindFramebuffer(GL2GL3.GL_FRAMEBUFFER, 0);
return frameBuffer.get(0);
}

private void drawTextureQuad(GL2GL3 gl) {
_glowShader.bind(gl);
int textureLocation = _glowShader.getUniformFields().getIlluminationTextureLocation();
gl.glUniform1i(textureLocation, 0);
gl.glActiveTexture(GL2GL3.GL_TEXTURE0);
gl.glBindTexture(GL2GL3.GL_TEXTURE_2D, _frameBufferTextureId);

int vertexLocation = _glowShader.getAttributeFields().getVertexLocation();
gl.glBindBuffer(GL2GL3.GL_ARRAY_BUFFER, _textureQuadId);
gl.glVertexAttribPointer(vertexLocation, 3, GL2GL3.GL_FLOAT, false, 0, 0);
gl.glEnableVertexAttribArray(vertexLocation);

int textureCoordLocation = _glowShader.getAttributeFields().getVertexTextureCoordinateLocation();
gl.glBindBuffer(GL2GL3.GL_ARRAY_BUFFER, _textureQuadCoordsId);
gl.glVertexAttribPointer(textureCoordLocation, 2, GL2GL3.GL_FLOAT, false, 0, 0);
gl.glEnableVertexAttribArray(textureCoordLocation);

gl.glDrawArrays(GL2GL3.GL_TRIANGLE_FAN, 0, 4);
_glowShader.unbind(gl);
}

在我的渲染循环中,我正在执行以下操作:

_glowShader.bind(gl);// bind my Shader object.
gl.glUniformMatrix4fv(_glowShader.getUniformFields().getProjectionMatrixLocation(), 1, true, _projectionMatrix.getBuffer());
gl.glUniformMatrix4fv(_glowShader.getUniformFields().getModelViewMatrixLocation(), 1, true, _modelViewMat.getBuffer());
gl.glBindFramebuffer(GL.GL_FRAMEBUFFER, _framebufferId);
gl.glDrawBuffers(1, _frameBufferAttachmentss); //contains GL_COLOR_ATTACHMENT0
gl.glViewport(0, 0, _width / 2, _height / 2); // same size as texture
_spaceship.draw(gl, _glowShader);// draw method in my ModelObject class
gl.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0);
_glowShader.unbind(gl);

drawTextureQuad(gl);

当我运行它时,我的四边形已按预期绘制,但纹理全是黑色。当我在我的渲染循环中注释掉任何帧缓冲区绑定(bind)时,模型会按应有的方式渲染,所以我知道我的着色器代码没有任何问题。当我用从文件加载的另一个纹理替换 _frameBufferTextureId 时,该纹理被正确绘制,所以我知道我的纹理坐标正在工作,而且我的着色器代码也是正确的。每当我绑定(bind)我的帧缓冲区时,我都没有得到我期望的任何东西。我也在验证我的帧缓冲区,它是 GL_FRAMEBUFFER_COMPLETE。

我已经在 stackoverflow 上阅读了无数教程和帖子,但我终究无法弄清楚自己做错了什么。任何帮助都会很棒!谢谢。

最佳答案

正如 Bethor 指出的那样,我将 GL_TEXTURE_MIN_FILTER 两次传递给我的 makeTextureBuffer 方法。这是对 glTexParameteri() 调用的解析:

gl.glTexParameteri(GL2GL3.GL_TEXTURE_2D, GL2GL3.GL_TEXTURE_MIN_FILTER, GL2GL2.GL_TEXTURE_MIN_FILTER);
gl.glTexParameteri(GL2GL3.GL_TEXTURE_2D, GL2GL3.GL_TEXTURE_MAG_FILTER, GL2GL2.GL_TEXTURE_MIN_FILTER);

当然,这毫无意义。更改我的调用以传入 GL_LINEAR 修复了所有问题。

关于java - OpenGL 帧缓冲区渲染到纹理不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6206850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com