Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/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
GLSL棋盘格图案_Glsl - Fatal编程技术网

GLSL棋盘格图案

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

我想用棋盘格遮住四边形:

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函数似乎不起作用,或者可能是其他什么东西。。。
有什么帮助吗?

您的代码所做的是计算因子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并应用简单的位和(片段内不需要除法)