KKl*_*zal 5 c++ opengl normalize uv-mapping vulkan
我正在为GWEN(无多余废话的GUI)编写Vulkan渲染器,但在获取纹理坐标以匹配时遇到问题。
中间显示的纹理是我们用于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, rect.y, u2, v1);
AddVert(rect.x, rect.y + rect.h, u1, v2);
AddVert(rect.x + rect.w, rect.y, u2, v1);
AddVert(rect.x + rect.w, rect.y + rect.h, u2, v2);
AddVert(rect.x, rect.y + rect.h, u1, v2);
}
Run Code Online (Sandbox Code Playgroud)
该库将构建一个顶点向量,然后最终在每一帧渲染顶点缓冲区。
作为参考,这是OpenGL Sample Renderer中的相同功能:
void OpenGL::AddVert( int x, int y, float u, 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, Gwen::Rect rect, float u1, float v1, float u2, 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, rect.y, u1, v1);
AddVert(rect.x + rect.w, rect.y, u2, v1);
AddVert(rect.x, rect.y + rect.h, u1, v2);
AddVert(rect.x + rect.w, rect.y, u2, v1);
AddVert(rect.x + rect.w, rect.y + rect.h, u2, v2);
AddVert(rect.x, rect.y + rect.h, u1, v2);
}
Run Code Online (Sandbox Code Playgroud)
我明白福尔康需要纹理坐标从0.0到1.0这就是为什么我分u
和v
由纹理的尺寸512 x 512
。我也了解Vulkan使用图片的左下角,0,0
这就是为什么我翻转Y坐标。可悲的是我仍然得到错误的输出。我已经尝试了多种组合texCoord.x
,texCoord.y
但是却永远无法获得正确的输出。有人知道我在这里做错什么吗?
编辑 将纹理除以128而不是512可得到正确的结果。我不明白为什么这可以解决我的问题。纹理大小的确是512x512单位,因此除以512应该给我0.0-1.0的范围?相反,我只除以128(即纹理大小的1/4)即可得到0.0-1.0的范围?
vertices.back().texCoord.x = (u / 128);
vertices.back().texCoord.y = (v / 128);
Run Code Online (Sandbox Code Playgroud)
事实证明,0,0
在 UV 坐标方面,Vulkan 和 OpenGL 共享相同的物理位置。翻转该y
值是不必要的。最后给我正确输出的是将纹理的大小除以1/4th
或128
而不是512
。由于某种原因,这产生了正确的输出,并且所有 UV 都正确排列。
正确的公式:
vertices.back().texCoord.x = (u / 128);
vertices.back().texCoord.y = (v / 128);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
153 次 |
最近记录: |