簡體   English   中英

如何動態綁定多個紋理坐標集的數組以在現代 OpenGL 中混合?

[英]How to dynamically bind an array of multiple texture coordinates sets for mixing in modern OpenGL?

我試圖了解綁定包含不同 UV 坐標值的多個紋理的整個系統,特別是對於 map 平鋪(重復),以便混合包含不同標量值的反照率 + 正常 map。 在許多情況下,將多個紋理坐標動態設置到一個網格將是有益的 - 一種是正常的 map 細節在皮膚、生銹的金屬等方面確實會脫穎而出。 這只需將 UV 坐標值縮放到相對較高的值,並將反照率 map 比例設置為 1 即可完成。

go 如何將這些紋理坐標集從 C++ 傳送到 glsl 着色器,以及什么是最有效/動態的管道來練習實時渲染?

我已經嘗試通過許多位置布局將多個 arrays 解析到 GLSL 中,但是對於動態情況,這變得過於 static。

這是我的頂點結構,但是我只解析一組頂點位置和一組紋理坐標:

    struct VertexElement {
     uint16_t               componentSize;
     std::vector<float>     data;

     VertexElement(uint16_t comp_size, std::vector<float> vertex_data)
     {
    componentSize = comp_size;
    data = vertex_data;
     }
    };

    struct Vertex {
     uint16_t stride;
     std::vector<VertexElement> vertexElements;

     inline Vertex() = default;
     inline Vertex(uint16_t _stride, std::vector<VertexElement> 
         _vertex_elements) 
         {
    stride = _stride;
    vertexElements = _vertex_elements;
     }
    };

本質上,我希望組合包含完全不同坐標值的多個紋理,而不必像這樣在 GLSL 中靜態分配:

       location (layout = 0) in vec2 texCord0
       location (layout = 1) in vec2 texCord1        <----- BAD!!
       location (layout = 2) in vec2 texCord3
       ...

我已經嘗試過了,但是我需要動態重新調整 texcoord 集大小以進行實時編輯。 這在 OpenGL 中是否可行?

謝謝。

着色器之間的接口總是靜態定義的。 着色器總是有 X 個輸入。

如果您希望動態確定某些信息,那么您將不得不使用現有工具(圖像加載/存儲、SSBO、UBO 等)自己讀取這些信息。 這對於頂點着色器來說是完全可能的,因為gl_VertexID索引可以用作數組的索引。

然而,一般來說,人們不需要這樣做。 他們只是定義了一個特定的頂點格式並堅持下去。 實際上,您的特定用例似乎不需要這個,因為您只是更改紋理坐標的,而不是它們是否被使用。

我需要動態重新調整 texcoord 集大小以進行實時編輯。

這實際上是不可能的,尤其是對於您概述的用例。

考慮一個普通的 map。 使用普通 map 和不使用普通 map 之間的區別是巨大的。 不僅僅是你傳遞給 VS 的參數,還有你的着色器的基本性質。

法線貼圖通常是切線空間。 所以你的着色器現在需要一個完整的 NBT 矩陣。 而且您可能必須將該矩陣傳遞給您的片段着色器,它將使用它從正常的 map 構造法線。 當然,如果你不使用普通的 map,你只會得到每個頂點的法線。 因此,您談論的是對代碼結構的重大更改,而不僅僅是輸入。

着色器只是字符串,因此您可以隨意動態構建它們。 但這比你的 VS 得到的輸入復雜得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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