Как передать материал с фиксированной функцией и освещение фрагментному шейдеру?

Я добавляю вершинный и фрагментный шейдер в свое приложение OpenGL 2.1/GLSL 1.2.

Вершинный шейдер:

#version 120

void main(void)  
{    
    gl_Position = ftransform();
    gl_FrontColor = gl_Color;
}

Фрагментный шейдер:

#version 120

void main(void) 
{   
    if (/* test some condition */) {
        discard;
    } else {
        gl_FragColor = gl_Color;
    }
}

Проблема в том, что если условие не выполняется, gl_FragColor просто устанавливается на то, что было последним вызовом gl.glColor3f() в моем методе с фиксированной функцией.

Вместо этого я хочу передать обычный цвет, полученный из параметров материала и освещения. Например, это:

gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_AMBIENT, lightingAmbient, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_DIFFUSE, lightingDiffuse, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPECULAR, lightingSpecular, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_POSITION, directionalLightFront, 0);

gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_AMBIENT, materialAmbient, 0);
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_DIFFUSE, materialDiffuse, 0);
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_SPECULAR, materialSpecular, 0);
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_EMISSION, materialEmissive, 0);
gl.glMaterialf(GL.GL_FRONT, GLLightingFunc.GL_SHININESS, shininess);

Есть ли способ присвоить это значение gl_FragColor? Или мне нужно реализовать освещение с нуля во фрагментном шейдере?

(Обратите внимание, я не пытаюсь использовать какие-либо продвинутые методы освещения. Я использую шейдеры для обрезки и хочу просто использовать стандартные методы освещения.)


person martinez314    schedule 04.10.2013    source источник


Ответы (1)


К сожалению, нет возможности сделать то, что вы хотите. Использование фиксированного функционального конвейера и вершинных/пиксельных шейдеров являются взаимоисключающими. Каждый примитив, который вы визуализируете, должен использовать один или другой.

Таким образом, вы должны самостоятельно выполнять расчеты освещения в шейдере. Это руководство содержит весь необходимый для этого код. Поскольку он вычисляет освещение для каждого пикселя, а не для каждой вершины, результаты на самом деле выглядят намного лучше!

person fintelia    schedule 04.10.2013