我找到了一个着色器来执行http://madebyevan.com/shaders/fast-rounded-rectangle-shadows/
的投影// License: CC0 (http://creativecommons.org/publicdomain/zero/1.0/)
// This approximates the error function, needed for the gaussian integral
vec4 erf(vec4 x) {
vec4 s = sign(x), a = abs(x);
x = 1.0 + (0.278393 + (0.230389 + 0.078108 * (a * a)) * a) * a;
x *= x;
return s - s / (x * x);
}
// Return the mask for the shadow of a box from lower to upper
float boxShadow(vec2 lower, vec2 upper, vec2 point, float sigma) {
vec4 query = vec4(point - lower, upper - point);
vec4 integral = 0.5 + 0.5 * erf(query * (sqrt(0.5) / sigma));
return (integral.z - integral.x) * (integral.w - integral.y);
}
我认为着色器需要一个主要功能并且应该返回颜色。 我的问题是如何使用带有opengl的c ++代码中的函数boxShadow给出一个框 感谢
答案 0 :(得分:1)
可以在着色器中定义函数,就像使用C函数一样。我的意思是,该函数的代码与着色器的其余部分位于相同的“单位”中。
read()
稍有不同的情况是,如果某个函数可以是多个着色器的一部分,但它不是“完整”着色器,它没有#version XX-YY
//MyFunc(.....)
whateverreturn MyFunc(.....)
{
do something and return a whateverreturn
}
void main(void)
{
//use MyFunc
whateverreturn var = MyFunc(....)
}
函数。此函数存在于文件或字符串数组或类似内容中。
假设您在特定文件中具有该功能:
main()
带有着色器的文件,您想要使用它:
#version XX-YY
//MyFunc(.....)
whateverreturn MyFunc(.....)
{
do something and return a whateverreturn
}
与使用任何常见的GLSL代码一样,请使用#version XX-YY
//declare the function
whateverreturn MyFunc(.....);
void main(void)
{
//use MyFunc
whateverreturn var = MyFunc(....)
}
和glShaderSource
。
现在关键步骤是如何在完整(使用'main')着色器中集成代码:只需使用glCompileShader
(再次,像你一样)在glAttachShader
之前与VS或FS合作,并且那就是全部。