加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – OpenGL渲染到纹理坐标

发布时间:2020-12-15 02:34:02 所属栏目:Java 来源:网络整理
导读:我希望能够渲染到纹理(对于着色器,字体),但我有一个问题是正确定位四边形(帧缓冲本身做它应该做的事情).生成的(复制的)纹理在大多数情况下显示左上角,其余的被裁剪.这对于矩形纹理来说更糟糕,对方形纹理几乎没有影响(所以我好几天都没有认识到这种行为) 示例
我希望能够渲染到纹理(对于着色器,字体),但我有一个问题是正确定位四边形(帧缓冲本身做它应该做的事情).生成的(复制的)纹理在大多数情况下显示左上角,其余的被裁剪.这对于矩形纹理来说更糟糕,对方形纹理几乎没有影响(所以我好几天都没有认识到这种行为)

示例代码:

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_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D,GL_RGBA,tex.getImageWidth(),tex.getImageHeight(),GL_RGB,GL_UNSIGNED_BYTE,(ByteBuffer)null);

    // Adjust projection matrix
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glViewport(0,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);
        glVertex2f(1,1);
        glTexCoord2f(0,1);
        glVertex2f(-1,1);
    }
    glEnd();

    // Unbind framebuffer
    glBindFramebuffer(GL_FRAMEBUFFER,0);

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

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

示例图片:

鞋面是复制版本下方渲染的原始图像

我究竟做错了什么?

更新:现在看起来纹理得到了下采样

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读