Opengl es GLSL将片段着色器遮罩拟合到顶点坐标
我的片段着色器中有一个笑脸面具,它占据了整个窗口(1) 我将较小的坐标传递给顶点着色器,试图将笑脸缩小为较小的框(2)(期望的结果) 但是,结果是(3) 如何使片段着色器适合我传递给顶点着色器的坐标,使其看起来像(2),而不是(3) 下面是相关的代码片段。如果您需要更多代码,请告诉我 --顶点着色器-- --片段着色器-- 谢谢 编辑1: 以下是在前后传递给顶点着色器的两组坐标 编辑2: 感谢Rabbid76提供的解决方案!下面显示了我最终传递到顶点着色器的uv坐标Opengl es GLSL将片段着色器遮罩拟合到顶点坐标,opengl-es,glsl,shader,glsles,Opengl Es,Glsl,Shader,Glsles,我的片段着色器中有一个笑脸面具,它占据了整个窗口(1) 我将较小的坐标传递给顶点着色器,试图将笑脸缩小为较小的框(2)(期望的结果) 但是,结果是(3) 如何使片段着色器适合我传递给顶点着色器的坐标,使其看起来像(2),而不是(3) 下面是相关的代码片段。如果您需要更多代码,请告诉我 --顶点着色器-- --片段着色器-- 谢谢 编辑1: 以下是在前后传递给顶点着色器的两组坐标 编辑2: 感谢Rabbid76提供的解决方案!下面显示了我最终传递到顶点着色器的uv坐标 // locat
// location = 0
GLfloat vertices[] = {
-0.8, -0.8, 0.0,
-0.2, -0.8, 0.0,
-0.2, -0.2, 0.0,
-0.8, -0.2, 0.0
};
// location = 1
GLfloat uv[] = {
0.0, 0.0,
1.0, 0.0,
1.0, 1.0,
0.0, 1.0
};
为uv坐标添加其他属性。属性必须在[0.0,1.0]范围内。(0,0左下角和(1,1)右上角。将属性从顶点着色器传递到片段着色器:
#版本300 es
vec3 VP位置中的布局(位置=0);
vec2 vUV中的布局(位置=1);
输出vec2uv;
void main()
{
uv=vUV;
gl_位置=vec4(vPosition,1.0);
}
使用片段着色器输入uv
而不是vec2 uv=gl\u FragCoord.xy/vec2(宽度、高度);
:
/[…]
在vec2uv中;
void main()
{
//vec2 uv=gl_FragCoord.xy/vec2(宽度、高度);删除
// [...]
}
必须为uv坐标添加单独的属性。uv坐标在[0.0,1.0]范围内。非常感谢!@Ian谢谢。不客气。
#version 300 es
precision mediump float;
uniform float width;
uniform float height;
out vec4 fragColor;
float Circle(vec2 uv, vec2 p, float r, float blur) {
float d = length(uv - p);
return smoothstep(r, r-blur, d);
}
void main() {
vec2 uv = gl_FragCoord.xy / vec2(width, height);
uv -= 0.5;
uv.x *= width / height;
float blur = 0.005;
float c = Circle(uv, vec2(0., 0.), 0.25, blur);
c -= Circle(uv, vec2(-0.1, 0.1), 0.05, blur);
c -= Circle(uv, vec2(0.1, 0.1), 0.05, blur);
float mouth = Circle(uv, vec2(0., 0.), 0.15, blur);
mouth -= Circle(uv, vec2(0., 0.05), 0.15, blur);
c -= clamp(mouth, 0., 1.);
fragColor = vec4(vec3(1., 1., 0.) * c, 1.0);
}
// location = 0
GLfloat vertices[] = {
-0.8, -0.8, 0.0,
-0.2, -0.8, 0.0,
-0.2, -0.2, 0.0,
-0.8, -0.2, 0.0
};
// location = 1
GLfloat uv[] = {
0.0, 0.0,
1.0, 0.0,
1.0, 1.0,
0.0, 1.0
};