Образец шахматной доски GLSL - PullRequest
4 голосов
/ 14 января 2011

Я хочу затенить квад с помощью шашек:

f (P) = [floor (Px) + floor (Py)] mod2.

Мой квадэто:

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);
}

Но я получаю это:

alt text

Кажется, что функция мода не работает или, может, что-то еще ... Любая помощь?

Ответы [ 3 ]

14 голосов
/ 17 января 2011

Лучше рассчитать этот эффект во фрагментном шейдере, примерно так:

вершинная программа =>

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;
}

Вывод =>

alt text

Удачи!

3 голосов
/ 07 февраля 2015

Попробуйте эту функцию в своем фрагментном шейдере:

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.

3 голосов
/ 14 января 2011

Ваш код вычисляет коэффициент 4 раза (один раз для каждой вершины, поскольку это код вершинного шейдера), а затем интерполирует эти значения (поскольку они записаны в переменную переменную), а затем выводит эту переменную в виде цвета в шейдер фрагмента .

Так что это не сработает. Вы должны сделать это вычисление непосредственно в фрагментном шейдере. Вы можете получить положение фрагмента, используя встроенную переменную gl_FragCoord в фрагментном шейдере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...