gpt4 book ai didi

opengl - Shader的功能参数表现

转载 作者:行者123 更新时间:2023-12-02 06:47:52 26 4
gpt4 key购买 nike

我试图了解如何在着色器语言中实现传递参数。

我已经阅读了几篇文章和文档,但仍然有一些疑问。特别是,我试图理解与 C++ 函数调用的差异,特别强调性能。

HLSL,Cg 和 GLSL 之间略有差异,但我猜下划线的实现非常相似。

到目前为止我所理解的:

  • 除非另有说明,函数参数始终按值传递(即使对于矩阵也是如此吗?)
  • 在此上下文中按值传递与 C++ 具有不同的含义。不支持递归,因此不使用堆栈,并且大多数函数都是内联的,参数直接放入寄存器中。
  • 函数通常默认内联 (HLSL),或者至少编译器始终遵循内联关键字 (Cg)

以上考虑是否正确?

现在有2个具体问题:

  1. 将矩阵作为函数参数传递

    内联 float4 DoSomething(在 Mat4x4 mat 中,在 float3 vec 中){...}

考虑到上面的函数,在 C++ 中这会很糟糕,并且使用引用肯定会更好:const Mat4x4&

着色器怎么样?这是一个不好的方法吗?我读到,例如 inout 限定符可用于通过引用传递矩阵,但实际上它暗示该矩阵由被调用的函数修改。

  • 数字(和参数类型)有什么含义吗?例如,是否更好地使用具有有限参数集的函数?或者避免传递矩阵?inout 修饰符是提高性能的有效方法吗?如果是这样,有人知道典型的编译器如何实现这个吗?

  • HLSLGLSL 在这方面有什么区别吗?有人对此有任何提示吗?

  • 最佳答案

    根据规范,值总是被复制。对于 in 参数,在调用时复制,对于 out 参数在返回时复制,对于 inout 参数在调用和返回时复制。

    用规范语言(GLSL 4.50,第 6.1.1 节“函数调用约定”):

    All arguments are evaluated at call time, exactly once, in order, from left to right. Evaluation of an in parameter results in a value that is copied to the formal parameter. Evaluation of an out parameter results in an l-value that is used to copy out a value when the function returns. Evaluation of an inout parameter results in both a value and an l-value; the value is copied to the formal parameter at call time and the lvalue is used to copy out a value when the function returns.

    实现当然可以自由地优化任何它想要的东西,只要结果与记录的行为相同即可。但我认为您不能指望它以任何特定的方式工作。

    例如,通过引用传递所有 inout 参数将不会被保存。假设您有以下代码:

    vec4 Foo(inout mat4 mat1, inout mat4 mat2) {
    mat1 = mat4(0.0);
    mat2 = mat4(1.0);
    return mat1 * vec4(1.0);
    }

    mat4 myMat;
    vec4 res = Foo(myMat, myMat);

    正确的结果是包含所有 0.0 分量的向量。如果参数通过引用传递,则 Foo() 内的 mat1mat2 将为同一矩阵别名。这意味着对 mat2 的赋值也会更改 mat1 的值,结果是一个包含所有 1.0 分量的向量。这是错误的。

    这当然是一个非常人为的示例,但优化必须有选择性才能在所有情况下正确工作。

    关于opengl - Shader的功能参数表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28527622/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com