如何使用没有main函数的片段着色器

时间:2018-02-12 17:30:05

标签: c++ opengl glsl

我找到了一个着色器来执行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给出一个框 感谢

1 个答案:

答案 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合作,并且那就是全部。