簡體   English   中英

平鋪+ OpenGL紋理翻轉

[英]Tiling + OpenGL texture flipping

我正在嘗試將圖塊渲染從SDL2轉換為OpenGL。 這是來自SDL2的圖像;

SDL2渲染

並且使用OpenGL渲染的同一圖像沒有在Y軸上翻轉的紋理;

OpenGL,無紋理翻轉

這是來自OpenGL渲染的圖像,紋理在Y軸上翻轉了;

翻轉紋理的OpenGL

我應該在哪里用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM