我在我的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
?或者我是否需要在片段着色器中从头开始实现光照?
(注意,我不是要尝试任何类型的高级照明技术。我使用着色器进行剪切,并且只想使用标准照明方法。)
答案 0 :(得分:3)
不幸的是,没有办法做你想做的事。使用固定功能管道和顶点/像素着色器是互斥的。您呈现的每个基元必须使用其中一个。
因此,您必须在着色器中自己进行光照计算。 This tutorial提供了执行此操作所需的所有代码。因为它为每个像素而不是每个顶点进行光照计算,结果实际上看起来好多了!