归一化从OpenGL到Vulkan的UV坐标

我正在为GWEN (GUI Without Extravagant Nonsense)编写Vulkan渲染器,但在获取纹理坐标以匹配时遇到问题。

这是我应该看到的:

归一化从OpenGL到Vulkan的UV坐标

这是当前正在发生的事情:

归一化从OpenGL到Vulkan的UV坐标

中间显示的纹理是我们用于GUI的图像,我确保将其渲染为四边形以确保正确加载。

GUI的结构似乎是正确的,这使我相信UV坐标不正确。特别是Y坐标,因为据我所知X看起来还可以。

void Vulkan::AddVert(int x,int y,float u,float v)
{
    vertices.emplace_back();

    vertices.back().pos.x = ((float)x / 400) - 1.f;
    vertices.back().pos.y = ((float)y / 300) - 1.f;
    //  Our image is 512x512 px
    vertices.back().texCoord.x = (u / 512.0f);
    vertices.back().texCoord.y = 1.0f - (v / 512.0f);
}

void Vulkan::DrawTexturedRect(Gwen::Texture* pTexture,Gwen::Rect rect,float u1,float v1,float u2,float v2)
{
    //  ToDo: Implement textures through GWEN
    //  The GUI texture is hardcoded for now
    //  Once we're rendering properly i'll expand this function to handle textures
    Translate(rect);

    AddVert(rect.x,rect.y,u1,v1);
    AddVert(rect.x + rect.w,u2,v1);
    AddVert(rect.x,rect.y + rect.h,v2);
    AddVert(rect.x + rect.w,v2);
    AddVert(rect.x,v2);
}

该库将构建一个顶点向量,然后最终在每一帧渲染顶点缓冲区。

作为参考,这是OpenGL Sample Renderer中的相同功能:

void OpenGL::AddVert( int x,float v )
{
    m_Vertices[ m_iVertNum ].x = ( float ) x;
    m_Vertices[ m_iVertNum ].y = ( float ) y;
    m_Vertices[ m_iVertNum ].u = u;
    m_Vertices[ m_iVertNum ].v = v;
    m_Vertices[ m_iVertNum ].r = m_Color.r;
    m_Vertices[ m_iVertNum ].g = m_Color.g;
    m_Vertices[ m_iVertNum ].b = m_Color.b;
    m_Vertices[ m_iVertNum ].a = m_Color.a;
    m_iVertNum++;
}

void OpenGL::DrawTexturedRect(Gwen::Texture* pTexture,float v2)
{
    GLuint* tex = ( GLuint* ) pTexture->data;

    // Missing image,not loaded properly?
    if ( !tex )
    {
        return DrawMissingImage( rect );
    }

    Translate(rect);
    GLuint boundtex;
    GLboolean texturesOn;
    glGetBooleanv( GL_TEXTURE_2D,&texturesOn );
    glGetIntegerv( GL_TEXTURE_BINDING_2D,( GLint* ) &boundtex );

    if ( !texturesOn || *tex != boundtex )
    {
        Flush();
        glBindTexture( GL_TEXTURE_2D,*tex );
        glEnable( GL_TEXTURE_2D );
    }

    AddVert(rect.x,v2);
}

我了解Vulkan将纹理坐标从0.0调整为1.0,这就是为什么我将uv除以纹理512 x 512的大小的原因。我也了解Vulkan将图片的左下角用作0,0,这就是为什么我翻转Y坐标。可悲的是我仍然得到错误的输出。我已经为texCoord.xtexCoord.y尝试了许多组合,但是我永远无法获得正确的输出。有人知道我在这里做错什么吗?

编辑 将纹理除以128而不是512可得到正确的结果。我不明白为什么这可以解决我的问题。纹理大小的确是512x512单位,因此除以512应该给我0.0-1.0的范围?相反,我只除以纹理大小的1/4的128即可得到0.0-1.0的范围?

vertices.back().texCoord.x = (u / 128);
vertices.back().texCoord.y = (v / 128);
d332426126 回答:归一化从OpenGL到Vulkan的UV坐标

事实证明,就UV坐标而言,Vulkan和OpenGL共享相同的物理0,0位置。不需要翻转y值。最后,给出正确输出的是将纹理的大小除以1/4th128而不是512。由于某种原因,这会产生正确的输出,并且所有UV都正确排列。

正确的公式:

vertices.back().texCoord.x = (u / 128);
vertices.back().texCoord.y = (v / 128);
本文链接:https://www.f2er.com/3115789.html

大家都在问