GLSL - Лицевые и Задние грани полигонов - PullRequest
1 голос
/ 15 января 2011

Я сделал несколько простых штриховок в GLSL шашечной доски:

f(P) = [ floor(Px)+floor(Py)+floor(Pz) ] mod 2

Кажется, это работает хорошо, за исключением того факта, что я вижу внутреннюю часть объектов, но я хочу видеть только переднюю грань. Любые идеи, как это исправить? Спасибо!

Чайник (glutSolidTeapot ()): alt text

Cube (glutSolidCube): alt text

Файл вершинного шейдера:

varying float x,y,z;
void main(){
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
    x = gl_Position.x;
    y = gl_Position.y;
    z = gl_Position.z;
} 

И файл фрагмента шейдера:

varying float x,y,z;
void main(){    
    float _x=x;
    float _y=y;
    float _z=z;

    _x=floor(_x);
    _y=floor(_y);
    _z=floor(_z);

    float sum = (_x+_y+_z);
    sum = mod(sum,2.0);
    gl_FragColor = vec4(sum,sum,sum,1.0);
}

1 Ответ

5 голосов
/ 15 января 2011

С шейдерами не проблема - выбраковка лица.

Вы должны либо отключить выборку лица (что не рекомендуется, поскольку это плохо по причинам производительности):

glDisable(GL_CULL_FACE);

или используйте glCullFace и glFrontFace для установки режима отбора, т. Е .:

glEnable(GL_CULL_FACE); // enables face culling    
glCullFace(GL_BACK); // tells OpenGL to cull back faces (the sane default setting)
glFrontFace(GL_CW); // tells OpenGL which faces are considered 'front' (use GL_CW or GL_CCW)

Аргумент для glFrontFace зависит от соглашений приложения, то есть от руки матрицы.

...