如何将固定功能的材质和照明传递给片段着色器?

3
我将为我的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?还是说我需要在片段着色器中从头开始实现照明效果?

(请注意,我并不想进行任何高级照明技术。我只是为了剪辑而使用着色器,并希望使用标准的照明方法。)

1个回答

3
很遗憾,你想要的事情是无法实现的。使用固定管线和顶点/像素着色器是互斥的。每个渲染的基元必须使用其中之一。
因此,您必须在着色器中自行完成光照计算。这个教程提供了所有你需要的代码。由于它为每个像素而不是每个顶点进行光照计算,所以结果看起来实际上更好!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接