[英]Tiling + OpenGL texture flipping
我正在嘗試將圖塊渲染從SDL2轉換為OpenGL。 這是來自SDL2的圖像;
並且使用OpenGL渲染的同一圖像沒有在Y軸上翻轉的紋理;
這是來自OpenGL渲染的圖像,紋理在Y軸上翻轉了;
我應該在哪里用Y形翻轉紋理補償坐標,並使其在OpenGL坐標系中正確渲染? 這是我用來獲取紋理uv以在OpenGL中渲染第二張圖片(紋理未翻轉)和第三張圖片(翻轉紋理)的代碼;
glm::vec4 srcRect;
srcRect.x = (float)((tileLayer->GetTileId(x, y) - (tileY * tilesPerRow))* (tileWidth+ spacing) )/imageWidth;
srcRect.y = (float)(tileY * (tileHeight + spacing)+ margin)/imageHeight;
srcRect.z = (float)tileWidth/imageWidth;
srcRect.w = (float)tileHeight/imageHeight ;
如果我對問題的理解不正確,請忽略此帖子。 如果我正確地理解了問題,那么我將更改OpenGL透視圖轉換以匹配SDL,而不是在工作代碼中調整現成的圖形和計算。 OpenGL對坐標系沒有任何偏好,因此您可以自由調整它以適應您的目的。
我假設您正在使用現代OpenGL(可編程着色器,沒有固定的管道)和某些OpenGL數學庫(例如,C ++的glm)。 大多數庫都具有ortho()來創建具有坐標變換的正交透視圖。 語法為:
glm::ortho(left, right, bottom, top, near, far)
只需翻轉底部和頂部,就可以翻轉y。 對於2D圖形,近場和遠場可以關閉任何東西,因為對象的z坐標都為零:
glm::ortho(
-1, 1, // X goes -1 to 1
1, -1, // Y goes 1 (at bottom!) to -1 (at top!)
-1, 1) // -1 < 0 < 1
但是你會變得更好。 使用窗口大小參數,然后可以使用基於像素的常規坐標(而不是-1 ... 1范圍):
glm::ortho(
0, width, // X goes 0 to width
height, 0, // Y goes 0 (top) to height (bottom)
-1, 1) // near & far
要使用固定管線(舊的OpenGL)制作,請使用glOrtho()。
希望這是問題所在,如果是的話,希望這會有所幫助。
編輯:以防萬一...您可以甚至更調整透視圖轉換,以適應更好的基於圖塊的2D游戲。 假設您的對象“單位大小”就像32x32(精靈,背景圖塊等)。 要消除用子畫面寬度和長度進行乘除(將地圖數組索引轉換為屏幕坐標,反之亦然),只需將坐標“單位大小”與圖塊大小匹配即可:
glm::ortho(
0, width / tile.width, // +1 X is +tile.width
height / tile.height, 0, // +1 Y is +tile.height
-1, 1) // near & far
編輯(請參閱評論):假設您使用ortho(0,width,height,0)來獲取“傳統”屏幕坐標(以像素為單位)。 要將32x32位圖映射到窗口,必須具有以下由兩個三角形構成的矩形:
uv (0, 0) uv( 1, 0)
pos(0, 0) pos(32, 0)
+-----------------+
|A D|
| |
|B C|
+-----------------+
pos(0,32) pos(32, 32)
uv (0, 1) uv ( 1, 1)
默認繞組為逆時針(三角形ABC,CDA)。 也可以使用矩形(-16,-16)-(16,16)將“參考”點更改為中心。 此外:您可以使用“單位框”(0,0)-(1,1)或(-0.5,-05)-(0.5,0.5),並使用傳遞給着色器的模型矩陣將其按比例縮放到正確的尺寸。 這使您可以輕松地使用同一框將任何大小的紋理變薄。
如果您不希望改變視角,則還可以通過翻轉用於翻轉的矩形來翻轉,然后將位置縮放到32 /寬度和32 /高度(例如在模型矩陣中)。 這會影響纏繞,因此您可能需要調整人臉剔除參數(glCullFace,glFrontFace,glPolygonMode)。
但是,IMO可以方便地調整2D圖形的透視圖並繼續使用您以前使用的“默認”窗口坐標。 3D方面是不同的野獸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.