opengl 使用glTexImage2D渲染到纹理,结果为空白,(Dreamcast GLdc)

q5lcpyga  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(180)

我正在尝试使用GLdc创建一个快速渲染到纹理的示例,GLdc是世嘉Dreamcast的OpenGL实现。我已经验证了我的纹理和帧缓冲对象都是完整的,但从帧缓冲生成的纹理中只有一个白色。
首先,我生成一个空纹理,并准备写入它。

func genTextures(){
    glGenTextures(1, &renderedTexture[0]);
    glBindTexture(GL_TEXTURE_2D, renderedTexture[0]);  
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // scale linearly when image smaller than texture
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
}

接下来,我生成一个FBO,并将我们刚刚创建的新纹理绑定到它。

func genFBO() {
  glGenFramebuffersEXT(1, &fbo);
  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 
  glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, 
                            GL_TEXTURE_2D, renderedTexture[0], 0);
}

此时FBO和纹理都应该被认为是完成了。主循环的结构类似于:

int main(int argc, char**argv)
{
    glKosInit();
    InitGL(640, 480);
    ReSizeGLScene(640, 480);
    genTextures();
    genFBO();

    while(1) {
        if(check_start())
            break;

        // I checked here for FBO and Texture completeness, both return True. 

        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); // bind to the FBO
        DrawGLScene(); // Draw our cube to the FBO

        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // back to default
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

        ReSizeGLScene(640,480);

        DrawGLUI(); //Draw the quad with the framebuffers texture
    }

    return 0;
}

以下是绘制几何图形的两个函数:
第一个
结果为

我想把立方体渲染到一个纹理上,然后把这个纹理应用到右上角的四边形上...

2nbm6dog

2nbm6dog1#

切换帧缓冲区时,必须使用glViewport将视口的大小调整为帧缓冲区的大小:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glViewport(0, 0, 128, 128);

// [...]

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glViewport(0, 0, 640, 480);

// [...]

相关问题