繁体   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