GLSL棋盘格图案
我想用棋盘格遮住四边形: f(p)=[地板(Px)+地板(Py)]模块2 我的四年级是:GLSL棋盘格图案,glsl,Glsl,我想用棋盘格遮住四边形: 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
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函数似乎不起作用,或者可能是其他什么东西。。。
有什么帮助吗?您的代码所做的是计算因子4次(每个顶点一次,因为它是顶点着色器代码),然后插值这些值(因为它写入了一个可变变量),然后在片段着色器中将该变量作为颜色输出
所以它不是那样工作的。您需要直接在片段着色器中执行该计算。您可以使用片段着色器中的gl_FragCoord内置变量获取片段位置。最好在片段着色器中计算此效果,如下所示: 顶点程序=>
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 );
}
#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;
}
片段程序=>
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 );
}
#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;
}
输出=>
祝你好运 在片段着色器中尝试此函数:
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);
}
然后,主要可以使用以下方法调用它:
vec3 check = checker(fs_vertex_texture.x, fs_vertex_texture.y);
只需传递从顶点着色器获得的x和y。在计算vFragColor时,您需要做的就是将其包括在内
请记住,只需修改checkSize值即可更改chec大小。我可以提出以下建议:
float result = mod(dot(vec2(1.0), step(vec2(0.5), fract(v_uv * u_repeat))), 2.0);
- v_uv是uv值的向量2
- u_repeat是一个向量2,表示每个轴的图案应重复多少次
- 结果为0或1,您可以在混合功能中使用它来提供颜色,例如:
另一个很好的方法是只平铺一个已知的图案(缩小)。假设您有一个方形画布:
void主图像(输出vec4 fragColor,输入vec2 fragCoord)
{
//标准化像素坐标(从0到1)
vec2 uv=fragCoord/iResolution.xy;
uv-=0.5;//将坐标系移动到屏幕中间
//输出到屏幕
fragColor=vec4(vec3(步骤(uv.x*uv.y,0.)),1.);
}
上面的代码提供了这种模式。
只需缩放4.5倍并取小数部分,即可将图案重复4.5次,从而每行生成9个正方形
void主图像(输出vec4 fragColor,输入vec2 fragCoord)
{
//标准化像素坐标(从0到1)
vec2 uv=分形(fragCoord/iResolution.xy*4.5);
uv-=0.5;//将坐标系移动到屏幕中间
//输出到屏幕
fragColor=vec4(vec3(步骤(uv.x*uv.y,0.)),1.);
}
很有趣。结果显示,四边形实际上渲染为两个三角形(左上/右下)。否则,结果更像是平滑的棋盘。如果是,您可以在片段着色器中使用阈值函数来获得适当的棋盘。实际上,插值对于棋盘格效果是无用的。为什么不使用整数x,y并应用简单的位和(片段内不需要除法)