【问题标题】:Drawing to a FrameBuffer causes Y to be inverted绘制到 FrameBuffer 会导致 Y 反转
【发布时间】:2019-05-06 16:58:06
【问题描述】:

我想使用帧缓冲区通过着色器程序创建图像。 这很好用,除了 Y 是倒置的。 似乎左下角变成了左上角。 为什么会这样?这是正常的吗? 这是否发生在所有安卓设备上?

在我的着色器程序中gl_FragCoord 将反转 Y,这取决于我是绘制到帧缓冲区还是直接绘制到屏幕。

【问题讨论】:

  • 在标准化设备空间中,左下角是 (-1, -1),右上角是 (1, 1)。视图坐标到标准化设备空间的转换取决于投影(矩阵)。你使用正交投影吗?您必须添加一些代码以使其成为Minimal, Complete, and Verifiable example。
  • 我没有使用任何类型的矩阵,着色器程序将 gl_FragCoord 作为每个像素的输入。但是当绘制到帧缓冲区而不是直接绘制到屏幕时,y 会被反转。
  • 使用纹理时,纹理坐标 (0, 0) 位于左下方, (1, 1) 位于右上方。见How do opengl texture coordinates work?
  • “在我的着色器程序中,gl_FragCoord 将反转 Y,这取决于我是直接绘制到帧缓冲区还是直接绘制到屏幕上。” 你怎么知道的?您是否将帧缓冲区渲染到屏幕上?
  • 我使用帧缓冲区创建纹理,我将此纹理渲染到屏幕或将其保存为文件,在这两种情况下它都会被翻转。

标签: android opengl-es-2.0 framebuffer


【解决方案1】:

我发现绘制到 FrameBuffer 并不会反转 Y,但将位图加载到 opengl 会。
这些是我的纹理顶点:

public final static float textureVertices[] = {
        0.0f, 1.0f, // top left
        0.0f, 0.0f, // bot left
        1.0f, 1.0f, // top right
        1.0f, 0.0f, // bot right
};

但是那些已经被倒置来解释倒置的位图,我认为这是正常的,但对于 opengl 来说正常是这样的:

public final static float textureVertices[] = {
        0.0f, 0.0f, // bot left
        0.0f, 1.0f, // top left
        1.0f, 0.0f, // bot right
        1.0f, 1.0f, // top right
};

所以如果我从这样的位图创建纹理:

public static int loadGLTexture(Bitmap bmp) { // also destroys bitmap
    int id[] = new int[1];
    id[0] = -1;

    GLES20.glGenTextures(1, id, 0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, id[0]);

    // Set Filters
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);

    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0); // upload the texture to OpenGL

    bmp.recycle();
    return id[0];
}

纹理将反转 Y,但如果我使用 opengl 创建一个空纹理并使用 FrameBuffer 在其上绘制,Y 将不会反转。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2011-06-27
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多