【问题标题】:Can't draw to FrameBufferObject, then draw to frameBuffer, in LWJGL在 LWJGL 中无法绘制到 FrameBufferObject,然后绘制到 frameBuffer
【发布时间】:2014-12-10 19:45:52
【问题描述】:

我的问题是我已经为帧缓冲区对象绘制了一个小四边形,并试图将其绘制到窗口上的帧缓冲区。这是我的java代码:

import static org.lwjgl.opengl.GL30.*;
import static org.lwjgl.opengl.GL11.*;
import java.nio.ByteBuffer;
import org.lwjgl.opengl.*;

public class Main
{
    private static int fboID;
    private static int texID;
    private static int depthBuff;

    public static void main(String[] args)
    {
        try
        {
            Display.setDisplayMode(new DisplayMode(640, 480));
            Display.create();
        } catch (Exception e)
        {
            e.printStackTrace();
            System.exit(1);
        }

        glEnable(GL_TEXTURE_2D);
        initFramebuffer();
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, 640, 480, 0, 1, -1);
        glMatrixMode(GL_MODELVIEW);

        while (!Display.isCloseRequested())
        {
            glBindTexture(GL_TEXTURE_2D, texID);
            glBegin(GL_QUADS);

            glTexCoord2f(0, 0);
            glVertex2i(10, 10);

            glTexCoord2f(0, 1);
            glVertex2i(10, 470);

            glTexCoord2f(1, 1);
            glVertex2i(630, 470);

            glTexCoord2f(1, 0);
            glVertex2i(630, 10);

            glEnd();
            glBindTexture(GL_TEXTURE_2D, 0);

            Display.update();
            Display.sync(60);
        }
    }

    public static void initFramebuffer()
    {
        fboID = glGenFramebuffers();
        glBindFramebuffer(GL_FRAMEBUFFER, fboID);

        texID = glGenTextures();
        glBindTexture(GL_TEXTURE_2D, texID);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 640, 480, 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer) null);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

        depthBuff = glGenRenderbuffers();
        glBindRenderbuffer(GL_RENDERBUFFER, depthBuff);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 640, 480);
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuff);

        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texID, 0);

        if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
            System.out.println("GOD DAMT");

        glBindFramebuffer(GL_FRAMEBUFFER, fboID);
        {
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            glOrtho(0, 640, 480, 0, 1, -1);
            glMatrixMode(GL_MODELVIEW);

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glViewport(0, 0, 640, 480);

            //glLoadIdentity();

            glBegin(GL_QUADS);
            glColor3f(1, 0, 0);
            glVertex2i(0, 0);
            glVertex2i(100, 0);
            glVertex2i(100, 100);
            glVertex2i(0, 100);
            glEnd();
        }
        glBindFramebuffer(GL_FRAMEBUFFER, 0);

    }
}

每当我运行此代码时,除了黑屏之外什么都没有。 我做错了什么?

【问题讨论】:

  • 你是什么?你的问题到底是什么?你“画了一个小四边形”,但你“试图把它画到帧缓冲区”你“不能做”。有什么错误吗?你能具体说一下吗?
  • 不,只是黑屏

标签: java opengl rendering lwjgl framebuffer


【解决方案1】:

我对 OpenGL 不太熟悉,但是

代替

    glEnable(GL_TEXTURE_2D);
    initFramebuffer();

你应该在初始化 fb 后启用纹理:

    initFramebuffer();
    glEnable(GL_TEXTURE_2D);

这是由glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 引起的,它似乎在您的 fb 纹理框前呈现未初始化(非 fb 纹理),从而导致黑屏

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多