【问题标题】:OpenGL Render to texture CoordinatesOpenGL渲染到纹理坐标
【发布时间】:2012-05-16 05:38:05
【问题描述】:

我希望能够渲染到纹理(用于着色器、字体),但我遇到了一个问题,即正确定位四边形(帧缓冲区本身完成了它应该做的事情)。生成的(复制的)纹理在大多数情况下显示在左上角,其余的被裁剪。这对于矩形纹理来说更糟,对于方形纹理几乎没有影响(所以我碰巧几天都没有意识到这种行为)

示例代码:

    public Texture copy(final Texture tex) {
    final int tempTex = glGenTextures();
    Draw.bindTexture(tempTex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.getImageWidth(), tex.getImageHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, (ByteBuffer)null);

    // Adjust projection matrix
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glViewport(0, 0, tex.getImageWidth(), tex.getImageHeight());

    // Change blendmode to ignore the transparent background
    Draw.blendingMode(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

    // Prepare fbo, add the texture as backend and clear it
    final int fbo = glGenFramebuffers();
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tempTex, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Finally draw
    Draw.bindTexture(tex.getId());
    glBegin(GL_QUADS);
    {
        glTexCoord2f(0, 0);
        glVertex2f(-1, -1);
        glTexCoord2f(1, 0);
        glVertex2f(1, -1);
        glTexCoord2f(1, 1);
        glVertex2f(1, 1);
        glTexCoord2f(0, 1);
        glVertex2f(-1, 1);
    }
    glEnd();

    // Unbind framebuffer
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

    // Reset projection matrix
    glViewport(0, 0, 1920, 1080); // TODO Don't hardcode
    glPopMatrix();

    return new Texture(tempTex, tex.getImageWidth(), tex.getImageHeight());
}

示例图片:

上面是渲染的原始图像,在复制版本的下方

我做错了什么?


更新:现在似乎纹理被下采样了

【问题讨论】:

    标签: java opengl render-to-texture projection-matrix


    【解决方案1】:

    您不应该将实际的纹理宽度和高度传递给 texcoords。纹理坐标范围从 0(底部和左侧)到 1(顶部和右侧)。您无需将实际纹理尺寸硬编码到纹理坐标中。

    尝试将 texcoord 函数中的 getWidth/getHeight 替换为“1”

    【讨论】:

    • getWidth/getHeight 是从 0 到 1 的纹理尺寸,但我会尝试 1
    • 在那种情况下,你可能已经得到了正确的东西,我认为这是以像素为单位的纹理尺寸。
    • 那(还有另一个变化)似乎解决了定位问题,但现在纹理看起来有点下采样...
    【解决方案2】:

    最好的方法是使用尺寸与显示器 (1920x1080) 相同的正交投影矩阵。您的纹理必须是 2 pow 大小的纹理,因此您必须将其设为 2048x2048。如果您现在将结果渲染到纹理的矩形上(不适合整个纹理),那么您可以使用相同的矩阵将其渲染回屏幕上。 (像素正确)

    【讨论】:

    • 我真的需要渲染到更小的纹理。否则文本缓存没有任何意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2012-06-03
    • 2014-07-22
    • 2013-10-05
    • 1970-01-01
    • 2013-12-27
    相关资源
    最近更新 更多