我想用棋子遮挡四边形:
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();
顶点着色器文件:
varying float factor;
float x,y;
void main(){
x=floor(gl_Position.x);
y=floor(gl_Position.y);
factor = mod((x+y),2.0);
}
片段着色器文件是:
varying float factor;
void main(){
gl_FragColor = vec4(factor,factor,factor,1.0);
}
但是我得到了这个:
似乎mod功能不起作用或者其他东西...... 有什么帮助吗?
答案 0 :(得分:14)
最好在片段着色器中计算这种效果,例如:
顶点程序=>
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 );
}
fragment program =>
#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;
}
输出=>
祝你好运!
答案 1 :(得分:3)
你的代码所做的是计算因子4次(每个顶点一次,因为它是顶点着色器代码),然后插入这些值(因为它被写入变化的变量),然后在片段着色器中将该变量输出为颜色
所以它不起作用。您需要直接在片段着色器中进行计算。您可以使用片段着色器中的gl_FragCoord内置变量来获取片段位置。
答案 2 :(得分:3)
在片段着色器中尝试此功能:
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);
}
然后在main中你可以使用:
来调用它vec3 check = checker(fs_vertex_texture.x, fs_vertex_texture.y);
简单地传递你从顶点着色器得到的x和y。之后您要做的就是在计算vFragColor时包含它。
请记住,只需修改checkSize值即可更改chec大小。
答案 3 :(得分:1)
另一种很好的方法是平铺一个已知的图案(缩小)。假设您有一个方形画布:
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// Normalized pixel coordinates (from 0 to 1)
vec2 uv = fragCoord/iResolution.xy;
uv -= 0.5; // moving the coordinate system to middle of screen
// Output to screen
fragColor = vec4(vec3(step(uv.x * uv.y, 0.)), 1.);
}
上面的代码为您提供了这种模式。
下面的代码只需放大 4.5 倍,取小数部分即可将模式重复 4.5 次,结果每行 9 个方格。
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// Normalized pixel coordinates (from 0 to 1)
vec2 uv = fract(fragCoord/iResolution.xy * 4.5);
uv -= 0.5; // moving the coordinate system to middle of screen
// Output to screen
fragColor = vec4(vec3(step(uv.x * uv.y, 0.)), 1.);
}
答案 4 :(得分:0)
我可以提出以下建议:
float result = mod(dot(vec2(1.0), step(vec2(0.5), fract(v_uv * u_repeat))), 2.0);
gl_FragColor = mix(vec4(1.0, 1.0, 1.0, 1.0), vec4(0.0, 0.0, 0.0, 1.0) result);