Я добавляю вершинный и фрагментный шейдер в свое приложение 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
? Или мне нужно реализовать освещение с нуля во фрагментном шейдере?
(Обратите внимание, я не пытаюсь использовать какие-либо продвинутые методы освещения. Я использую шейдеры для обрезки и хочу просто использовать стандартные методы освещения.)