Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在OpenGL中使用着色器在每个面上生成径向渐变_Opengl_Glsl_Gradient - Fatal编程技术网

如何在OpenGL中使用着色器在每个面上生成径向渐变

如何在OpenGL中使用着色器在每个面上生成径向渐变,opengl,glsl,gradient,Opengl,Glsl,Gradient,使用简单的着色器,我找到了一种创建渐变的方法。 以下是我工作的结果: (问题后有点更新) 这很好,但是我仍然需要在网格的每个面上显示这个渐变图案。或者在广告牌上,就像它是一种纹理一样 glsl函数返回与窗口相关的坐标。有人能给我解释一下如何把这个转换成与脸部相关的坐标,然后画出我的图案吗?好的。在stackoverflow上浏览一下,我就知道了这个话题: 下面是字符串的含义:gl_FragColor=mix(color0,color1,uv.u+uv.v-2*uv.u*uv.v) 当然,我们不能

使用简单的着色器,我找到了一种创建渐变的方法。 以下是我工作的结果: (问题后有点更新)

这很好,但是我仍然需要在网格的每个面上显示这个渐变图案。或者在广告牌上,就像它是一种纹理一样


glsl函数返回与窗口相关的坐标。有人能给我解释一下如何把这个转换成与脸部相关的坐标,然后画出我的图案吗?

好的。在
stackoverflow
上浏览一下,我就知道了这个话题:

下面是字符串的含义:
gl_FragColor=mix(color0,color1,uv.u+uv.v-2*uv.u*uv.v)

当然,我们不能将窗口空间坐标转换为“与面相关”的坐标,但我们可以使用面的UV坐标。所以,我决定,如果我们有一个带有uv坐标的正方形面,对应于全尺寸纹理(比如0,0;0,1;1,0;1,1);所以一个结构的中心是0.5,0.5。这可能是我的圆形渐变的中心

所以我的片段着色器代码是:

vec2 u_c = vec2(0.5,0.5);

float distanceFromLight = length(uv - u_c);

gl_FragColor = mix(vec4(1.,0.5,1.,1.), vec4(0.,0.,0.,1.), distanceFromLight*2.0);
顶点着色器:

gl_Position = _mvProj * vec4(vertex, 1.0);
uv = uv1;
当然,我们需要给出正确的UV坐标,但这一点是可以理解的

下面是一个例子:

如何设置网格的纹理坐标?您可以使用
gl\u TexCoord[n]
(其中
n
是纹理单位)。在本例中,我没有纹理。您不需要纹理来设置纹理坐标。仍然可以为每个顶点上的每个纹理单元设置纹理坐标。这使您可以根据需要控制它们,并在着色器中使用它们,即使您从未对纹理进行过采样。您可以传播您的答案,或给出示例吗?为此,我们需要有关如何绘制几何体的更多信息。您是否在即时模式下使用旧代码?VBO?你在处理什么版本的OpenGL?