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

(注意,我并没有尝试使用任何高级照明技术。我将着色器用于剪辑目的,并且只想使用标准照明方法。)

4

1 回答 1

3

不幸的是,没有办法做你想做的事。使用固定功能管线和顶点/像素着色器是互斥的。您渲染的每个图元都必须使用其中一个。

因此,您必须自己在着色器中进行光照计算。本教程提供了执行此操作所需的所有代码。由于它对每个像素而不是每个顶点进行光照计算,结果实际上看起来要好得多!

于 2013-10-04T20:21:24.063 回答