我想用棋子遮挡四边形:
F(P)= [楼层(PX)+地板(PY)]模2.
我的四边形是:
glBegin(GL_QUADS);
glVertex3f(0,0,0.0);
glVertex3f(4,0,0.0);
glVertex3f(4,4,0.0);
glVertex3f(0,4, 0.0);
glEnd();
Run Code Online (Sandbox Code Playgroud)
顶点着色器文件:
varying float factor;
float x,y;
void main(){
x=floor(gl_Position.x);
y=floor(gl_Position.y);
factor = mod((x+y),2.0);
}
Run Code Online (Sandbox Code Playgroud)
片段着色器文件是:
varying float factor;
void main(){
gl_FragColor = vec4(factor,factor,factor,1.0);
}
Run Code Online (Sandbox Code Playgroud)
但我得到这个:

似乎mod功能不起作用或者其他东西......任何帮助?
Agn*_*kas 15
最好在片段着色器中计算这种效果,如下所示:
顶点程序=>
varying vec2 texCoord;
void main(void)
{
gl_Position = vec4( gl_Vertex.xy, 0.0, 1.0 );
gl_Position = sign( gl_Position );
texCoord = (vec2( gl_Position.x, gl_Position.y )
+ vec2( 1.0 ) ) / vec2( 2.0 );
}
Run Code Online (Sandbox Code Playgroud)
片段程序=>
#extension GL_EXT_gpu_shader4 : enable
uniform sampler2D Texture0;
varying vec2 texCoord;
void main(void)
{
ivec2 size = textureSize2D(Texture0,0);
float total = floor(texCoord.x*float(size.x)) +
floor(texCoord.y*float(size.y));
bool isEven = mod(total,2.0)==0.0;
vec4 col1 = vec4(0.0,0.0,0.0,1.0);
vec4 col2 = vec4(1.0,1.0,1.0,1.0);
gl_FragColor = (isEven)? col1:col2;
}
Run Code Online (Sandbox Code Playgroud)
输出=>

祝好运!
在片段着色器中试试这个函数:
vec3 checker(in float u, in float v)
{
float checkSize = 2;
float fmodResult = mod(floor(checkSize * u) + floor(checkSize * v), 2.0);
float fin = max(sign(fmodResult), 0.0);
return vec3(fin, fin, fin);
}
Run Code Online (Sandbox Code Playgroud)
然后在 main 中,您可以使用以下方法调用它:
vec3 check = checker(fs_vertex_texture.x, fs_vertex_texture.y);
Run Code Online (Sandbox Code Playgroud)
只需传递从顶点着色器获得的 x 和 y。之后您要做的就是在计算 vFragColor 时包括它。
请记住,您只需修改 checkSize 值即可更改支票大小。